- CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
//d.js
var n = 0;
function add() {
n++;
}
module.exports = {
n,
add,
};
//e.js
var obj = require("./d.js");
console.log(obj.n); //0
obj.add();
console.log(obj.n); //0
commonjs模块加载后原始类型的值会被缓存,模块内部对该值修改不会影响输出。
//f1.mjs
export var n = 0;
export function add() {
n++;
}
//f2.mjs
import { n, add } from "./f1.mjs";
console.log(n); //0
add();
console.log(n); //1
ES6 模块不会缓存运行结果,而是动态地去被加载的模块取值
- CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。所以require可以是一个变量或者表达式,而import必须是字符串。 - CommonJS 模块的require()是同步加载模块,ES6 模块的import命令是异步加载,有一个独立的模块依赖的解析阶段。
- ES6 模块之中,顶层的this指向undefined;CommonJS 模块的顶层this指向当前模块