CommonJS 模块通常用于服务端(Node.js),在浏览器端需要使用工具进行转译或打包 ESM 模块是浏览器原生支持的,可以直接在现代浏览器中使用,不需要额外的转移工具
- 加载时机
- CommonJS:同步加载,模块在运行时(runtime)加载,并且是按需加载的,只有在需要时才会加载
- ESM:静态加载的,模块在解析时加载,在代码执行之前就被加载,因此具有更早的加载时机
- 依赖关系
- CommonJS:模块的依赖关系是动态的,意味着模块可以在运行时根据条件加载不同的依赖
- ESM:模块的依赖关系是静态,依赖关系在模块记载之前就确定,不能根据条件改变依赖关系
- 导出方式
- CommonJS:使用
module.exports导出模块,可以导出任意类型的值,包括函数、对象、类等 - ESM:使用
export和import关键字来到导出和导入模块。导出时需要明确指定导出的变量、函数或类,导入时也需要明确指定要导入的内容
- 全局共享
- CommonJS: 模块在每个模块都有自己的作用域,不会污染全局作用域
- ESM:模块默认是严格模式(strict mode),变量不会污染全局作用域,模块内部的变量不会被提升
- 静态分析
- CommonJS: 模块的依赖关系无法在编译时静态分析,这对一些工具的性能和优化产生了挑战
- ESM:模块依赖关系可以在编译时进行静态分析,这有助于提高性能和优化