📝 什么是 ES Module?
ES Module(ESM,全称 ECMAScript Module)是 JavaScript 官方引入的模块化方案,从 ES6(2015)开始成为标准。它在浏览器和 Node.js 中都被支持,提供了一种更加现代、简洁和高效的模块化机制。
📚 ES Modules 的核心特点
- 静态解析:ESM 在编译阶段就能确定模块依赖关系,而不像 CommonJS 那样在运行时加载。
- 按需加载:支持按需加载和 tree-shaking(移除未使用的代码),使得打包体积更小。
- 文件独立作用域:每个模块有自己的作用域,默认不会污染全局作用域。
- 只读导出:导出的变量是只读的,不能被重新赋值(但对象属性可以修改)。
🔍 工作原理
1. 模块导入与导出
ES Modules 使用 export 和 import 关键字来定义模块的导出和导入。
-
导出(Export)
你可以选择导出某些变量、函数或类:javascript 复制代码 // math.js export const add = (a, b) => a + b; export const subtract = (a, b) => a - b;也可以使用默认导出:
javascript 复制代码 // message.js export default function sayHello(name) { return `Hello, ${name}!`; } -
导入(Import)
javascript 复制代码 // main.js import { add, subtract } from './math.js'; console.log(add(2, 3)); // 输出: 5 import sayHello from './message.js'; console.log(sayHello('Alice')); // 输出: Hello, Alice!
2. 静态解析
-
ESM 在加载模块时会在编译阶段解析模块的依赖关系。
-
这意味着,
import和export必须在模块的顶层,而不能放在条件语句或函数内部。javascript 复制代码 // ✅ 正确 import { add } from './math.js'; // ❌ 错误 if (true) { import { subtract } from './math.js'; // 这样写会报错 }
3. 模块缓存
-
ESM 加载的模块会被浏览器或运行环境缓存。
即使多次导入同一个模块,也只会加载一次,且返回的始终是同一个模块实例。javascript 复制代码 // moduleA.js export const counter = { value: 0 };javascript 复制代码 // main.js import { counter } from './moduleA.js'; counter.value++; console.log(counter.value); // 输出: 1 import { counter as counter2 } from './moduleA.js'; console.log(counter2.value); // 输出: 1 (共享同一个实例)
4. 浏览器原生支持
现代浏览器支持 ESM 的方式是在 <script> 标签中加入 type="module":
html
复制代码
<script type="module">
import { add } from './math.js';
console.log(add(1, 2)); // 输出: 3
</script>
注意:使用 type="module" 的脚本会自动启用 严格模式,且模块内部的变量不会污染全局作用域。
🌐 ES Modules 和 CommonJS 的区别
| 特性 | ES Modules | CommonJS |
|---|---|---|
| 加载时机 | 编译时静态解析 | 运行时动态解析 |
| 导入导出语法 | import/export | require/module.exports |
| 执行顺序 | 顶层异步加载 | 同步加载 |
| 浏览器支持 | 原生支持 | 不支持(需要打包工具) |
📢 注意事项
-
路径需要明确:在浏览器中,
import必须提供完整路径,包括扩展名。javascript 复制代码 import { add } from './math.js'; // 正确 import { add } from './math'; // 错误 -
默认异步加载:浏览器加载 ES Modules 是异步的,不会阻塞页面的其他资源加载。
-
跨域限制:使用 ESM 时,导入的文件必须与页面在同一个域,或者需要启用 CORS 支持。
🚀 总结
ES Modules 是一种现代化的模块化标准,具备更高效的性能和更强的可维护性,特别适用于现代前端开发。通过静态解析和按需加载,ESM 不仅优化了开发流程,还显著提高了项目的性能表现。