Skip to content

模块化规范

随着前端项目的复杂度增加,IIFE 的局限性逐渐显现。开发者开始寻找更正式的模块化解决方案,促成了多个模块化规范的诞生。

时间顺序总览

  • CommonJS:2009 年左右,主要用于服务器端(Node.js)。
  • AMD:2010 年左右,主要用于浏览器端,解决异步加载问题。
  • CMD:2011-2012 年,主要在中国的前端开发中流行,注重按需加载。
  • UMD:2011-2012 年,为了在不同环境中兼容 AMD 和 CommonJS。
  • ES6 模块化:2015 年正式引入,成为 ECMAScript 6(ES6)标准的一部分,广泛应用于现代浏览器和 JavaScript 生态系统。

CommonJS

CommonJS 是较早的模块化规范之一,主要用于服务器端 JavaScript 环境(如 Node.js)。CommonJS 规范采用同步加载模块的方式,这在服务器端非常适用。

特点

  • 同步加载模块,适合服务器端。
  • 使用 require() 导入模块,module.exports 导出模块。

示例

javascript
// math.js
module.exports = {
  add: function (a, b) {
    return a + b
  },
}

// main.js
const math = require('./math')
console.log(math.add(2, 3)) // 5

👉 查看详情

AMD

AMD(Asynchronous Module Definition)规范主要为了解决浏览器端异步加载模块的问题,由 RequireJS 团队提出。AMD 允许在浏览器端异步加载模块,提升页面加载性能。

特点

  • 异步加载模块,适合浏览器端。
  • 使用 define() 定义模块,require() 加载模块。

示例

javascript
define(['math'], function (math) {
  console.log(math.add(2, 3)) // 5
})

CMD

CMD(Common Module Definition)规范由阿里巴巴的 Sea.js 团队提出,是对 AMD 的改进,特别强调按需加载和依赖就近。CMD 在中国的前端开发中非常流行。

特点

  • 强调按需加载,模块只有在被调用时才加载。
  • 依赖就近,模块的依赖可以放在模块内部。

示例

javascript
define(function (require, exports, module) {
  var math = require('./math')
  console.log(math.add(1, 2)) // 3

  exports.name = 'CMD Module'
})

UMD

UMD(Universal Module Definition)规范旨在统一 CommonJS 和 AMD 的模块化规范,提供一个能够在多种环境中通用的模块定义方式。UMD 使得模块可以在浏览器端和服务器端无缝运行。

特点

  • 通用性强,兼容 CommonJS 和 AMD。
  • 支持无模块系统的环境,通过全局变量暴露接口。

示例

javascript
;(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(factory)
  } else if (typeof module === 'object' && module.exports) {
    module.exports = factory()
  } else {
    root.myModule = factory()
  }
})(this, function () {
  return {
    name: 'UMD Module',
  }
})

ESM

ES6(也称为 ECMAScript 2015)标准引入了原生的模块化支持,成为现代 JavaScript 开发的主流选择。ES6 模块化采用静态分析的方式,编译时就能确定模块的依赖关系。

特点

  • 原生支持模块化,无需额外工具。
  • 使用 import 导入模块,export 导出模块。
  • 支持静态分析,提升编译优化能力。

示例

javascript
// math.js
export function add(a, b) {
  return a + b
}

// main.js
import { add } from './math.js'
console.log(add(2, 3)) // 5

👉 查看详情

基于 MIT 许可发布