commonJs和ESModule的区别
1. 规范的区别
ESM模块的导入使用Import关键字,导出使用export关键字。
commonJs导入使用require关键字,导出使用module.export
2. 文件名后缀不一样(这一点不用记,针对Node)
在node.js,默认将 .js后缀文件识别为CJS模块,.cjs也是CJS模块 ,.mjs文件识别为esm模块。
3. 模块加载时机不一样
CJS支持动态加载模块(require语句可以出现在任意位置)
ESM是静态解析的,它会在所有模块都加载完毕后才执行代码,在编译时首先解析模块中的导入语句,虽然通常会将导入语句放在模块的顶部,但并不是要求所有的import语句必须在文件的顶部,只要在使用导入的内容之前进行导入即可。
因此ESM可以在代码执行前进行静态分析和优化,从而提高性能(比如自动移除无用的死代码,webpack的treeshaking就是利用了这点)带你了解 Tree Shaking - 掘金 (juejin.cn)
而CJS需要等到代码允许时才能确定依赖关系和加载模块。
4. 导出内容的区别
ESM导入的是值的引用,而CJS导入的是值的拷贝
参考: