# 为什么 Vue、React、Nuxt 都用 ESM?

因为打包工具喜欢 ESM。

例如:

import { ref } from 'vue'
1

如果你没用:

computed
watch
reactive
1
2
3

打包器可以直接删除。

最终:

包更小
速度更快
1
2

这叫:

Tree Shaking
1

CommonJS 很难做到。


# Node.js 现在是什么情况

现代 Node.js 两种都支持。


CommonJS模式

package.json

{
  "type": "commonjs"
}
1
2
3

或者省略:

{}
1

默认就是:

require()
module.exports
1
2

ESM模式

package.json

{
  "type": "module"
}
1
2
3

然后:

import fs from 'fs'
export default {}
1
2

都能直接使用。


# 实际开发怎么选

Vue/Nuxt/Vite

用:

export default
import
1
2

即:

ESM
1

React/Next

用:

export default
import
1
2

即:

ESM
1

Node.js 新项目

推荐:

{
  "type": "module"
}
1
2
3

使用:

import
export
1
2

即:

ESM
1

老 Node.js 项目

很多还在:

require()
module.exports
1
2

即:

CommonJS
1

# 一句话记忆

CommonJS = Node.js 早期自创模块规范
           require + module.exports

ESM       = JavaScript 官方模块规范
           import + export

现在前端几乎全部使用 ESM,
Node.js 新项目也推荐 ESM,
CommonJS 主要用于兼容历史项目。
1
2
3
4
5
6
7
8
9

所以你看到:

export default {}
1

基本可以直接判断:

这是 ESM 模块写法
常见于:
✓ Vue
✓ Nuxt
✓ React
✓ Next
✓ Vite
✓ 现代 Node.js

不是传统 CommonJS 写法
1
2
3
4
5
6
7
8
9
10
Last Updated: 6/12/2026, 4:20:22 AM