ESM(ES Module)和CJS(CommonJS)的区别

技术 · 2023-08-29

CommonJS (简称CJS) 和 ES Modules (简称ESM) 是用于在 JavaScript 中实现模块化的两种不同的规范。

  1. 语法差异:

    • CommonJS 使用 require 来引入模块,使用 module.exportsexports 来导出模块。
    • ESM 使用 import 来引入模块,使用 export 来导出模块。
  2. 运行时加载 vs 静态加载:

    • CommonJS 是一种运行时加载的模块系统,模块的加载是在代码执行阶段进行的。模块的导入和导出是同步的。
    • ESM 是一种静态加载的模块系统,模块的加载是在代码解析阶段进行的。模块的导入和导出可以是异步的。
  3. 浏览器兼容性:

    • CommonJS 最初是为服务器端开发设计的,Node.js 采用了 CommonJS 规范。在浏览器端使用 CommonJS 需要使用工具进行转换,如 Browserify 或 Webpack。
    • ESM 是 ECMAScript 标准的一部分,从 ES6 开始正式支持,现代浏览器原生支持 ESM。
  4. 静态分析:

    • ESM 的静态加载特性使得代码可以在解析阶段进行静态分析,从而可以进行更好的优化、摇树优化(tree-shaking)和静态类型检查。
  5. 导入和导出方式:

    • ESM 支持命名导入和导出,可以导入和导出具体的变量、函数或对象。
    • CommonJS 模块的导入和导出是整个模块对象的引用。

总体而言,CommonJS 更适合服务器端的开发,而 ESM 更适合浏览器端的开发。然而,随着 Node.js 的更新和现代浏览器对 ESM 的支持,两种规范可以在许多场景下互相替代使用。

Theme Jasmine by Kent Liao