Skip to content

CommonJS、AMD 和 ESM 之间的区别

AMD

  • AMD 规范采用非同步加模;允许指是回调函数
  • Node 模块通常都位于本地,加载速度快,所以适用于同步加载
  • 浏览器环境下,模块需要请求获取,所以适用于异步加载
  • require.js 是 AMD 的一个具体实现库

CMD

  • CMD 整合了 CommonJS 和 AMD 的优点,模块加载是异步的
  • CMD 专门用于浏览器端,,sea.js 是 CMD 规范的一个实现
  • AMD 和 CMD 最大的问题是没有通过语法升级解决模块化

ESM

  • ESModule 设计理念是希望在编译时就确定模块依赖关系及输入输出
  • CommonJS 和 AMD 必须在运行时才能确定依赖和输入、输出
  • ESM 通过 import 加载模块,通过 export 输出模块

CommonJS 和 ESModule 规范对比

  • 1.CommonJS 模块输出的是值的拷贝,ES6 模块输出的是值的引 l 用
  • 2.CommonJS 模块是运行时加载,ES6 模块是编译时输出接口
  • 3.CommonJs 是单个值导出,,ES6 Module 可以导出多个
  • 4.CommonJS 模块为同步加载,ESModule 支持异步加载
  • 5.CommonJS 的 this 是当前模块,ESModule 的 this 是 undefined
  • 6.CommonJS 和 ESModule 的语法不同

NodeJS 默认采用 CommonJS 作为规范,node14 之后支持 ESModule NodeJS 默认采用 ESModule 作为规范

脚本和模块对比

  • 模块具备更高的开发效率(可读性强、复用高效)
  • 脚本具有更高的页面性能(模块文件多,加载速度慢)
  • 模块在浏览器中运行会存在兼容性问题,要要特别注意

浏览器模块化的局限

  • 缺乏模块管理能力,模块分散在各个项目中
  • 性能加载慢,无法大型项目中直接使用
  • 这两个问题是 npm 和 webpack 核心解决的问题

Released under the ISC License.