CommonJS与ESmodule的区别

552 阅读1分钟

早期 JavaScript 开发很容易存在全局污染依赖管理混乱问题。这些问题在多人开发前端应用的情况下变得更加棘手,因此人们引入了模块化机制。CommonJS与ESmodule是两个比较广泛地模块化规范。

  1. CommonJS是nodejs默认模块规范,使用module.exports暴露,require引入;ESmodule是ES模块规范,使用export暴露,import引入
  2. ESmodule兼容性不好,在webpack中通过babel编译成CommonJS
  3. CommonJS引入的是值的拷贝,ESmodule引入的是值的引用。
  4. CommonJS只能导出一个值,ESmodule可以导出多个值
  5. CommonJS的依赖关系运行时确定,ESmodule的依赖关系静态确定
  6. CommonJS的this是当前模块,ESmodule的thisundefined
  7. 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 的引用,因此调用incrementcount 的值从0变成1。并且不能对count重新复赋值。