早期 JavaScript 开发很容易存在全局污染和依赖管理混乱问题。这些问题在多人开发前端应用的情况下变得更加棘手,因此人们引入了模块化机制。CommonJS与ESmodule是两个比较广泛地模块化规范。
- CommonJS是nodejs默认模块规范,使用
module.exports暴露,require引入;ESmodule是ES模块规范,使用export暴露,import引入 - ESmodule兼容性不好,在webpack中通过babel编译成CommonJS
- CommonJS引入的是值的拷贝,ESmodule引入的是值的引用。
- CommonJS只能导出一个值,ESmodule可以导出多个值
- CommonJS的依赖关系运行时确定,ESmodule的依赖关系静态确定
- CommonJS的
this是当前模块,ESmodule的this是undefined require可以写在嵌套语句中,import只能在最外层 关于第三点,ESmodule引入的是值的引用,可以看一下下面的例子,就很好理解了
// incrementer.js
export let count = 0;
export function increment() {
count += 1;
}
// main.js
import { count, increment } from './incrementer.js';
console.log(count); // 0
increment();
console.log(count); // 1
count += 1; // Error — only incrementer.js can change this
main.js 中的 count 是对 incrementer.js 文件中暴露的 count 的引用,因此调用increment,count 的值从0变成1。并且不能对count重新复赋值。