By Noxxxx from https://interview.noxxxx.com/?post_type=post&p=8 上山打老虎
欢迎分享与聚合,尊重版权,可以联系授权
首先都是用于管理和导出JavaScript模块的规范。
CommonJS 是 NodeJs 的规范。
ESM 是 ES6 中为了解决浏览器场景下的模块引入问题而产生的。
- CommonJS是在运行时加载的,
因为本质上CommonJS的require只是一个JS函数,只能在JS引擎执行代码时才生效
,而ESM是在JS引擎进行静态解析的时候生效的。 - CommonJS 模块多次引入,只会加载一次。每个module内部会存在一个loaded来确定是否被加载过.
- CommonJS 代码是同步执行的。
- 他是通过require 函数来导入的,只有在执行 JS 代码才会知道模块的依赖关系。
- 导入导出是值的引用,如果导出的是一个基本数据类型值,那么导出文件改变该值,然后导入文件该变量的值也不会变。
- 不能修改导入的 ESM模块非引用类型变量,会报错
Uncaught TypeError: Cannot assign to read only property 'name' of object '[object Module]'
- 引用类型可以在外部改变
- 内部异步改变的变量,外部导入的时候如果异步执行时发生改变将会得到改变后的值