IIFE、CommonJS、AMD、CMD、ESM 和 UMD 哪些已经被淘汰了?

98 阅读3分钟

在当前的 JavaScript 开发环境中,不同的模块加载方式正处于不同的生命周期阶段。总体而言,ESM (ES Modules) 已经成为官方标准和未来的发展方向,而一些早期的模块化方案则逐渐被淘汰。

以下是各个模块加载方式的现状:

基本被淘汰

  • AMD (Asynchronous Module Definition): AMD 主要用于浏览器环境,通过 define 函数来定义模块,并异步加载依赖。它解决了早期浏览器中模块加载的难题,但随着 Webpack 等构建工具和 ESM 的普及,其使用场景已经大大减少,在新项目中基本不再使用。
  • CMD (Common Module Definition): CMD 是国内发展起来的模块化方案,与 AMD 类似,但推崇依赖就近声明。它也主要应用于浏览器环境。与 AMD 类似,随着现代前端工程化的发展,CMD 也已基本被淘汰。
  • IIFE (Immediately Invoked Function Expression): IIFE 是一种通过立即执行函数来创建独立作用域的模式,用于避免污染全局命名空间。它并不是一个正式的模块系统,而是一种早期的模块化实践。虽然打包工具(Bundler)有时会将代码打包成 IIFE 格式,但作为一种手动组织代码的方式,它已被现代模块系统取代。

正在被取代

  • CommonJS (CJS): CommonJS 是 Node.js 最初采用的模块系统,使用 require 导入模块,module.exports 导出模块。 它在服务器端得到了广泛应用。 目前,大量的 npm 包和现有的 Node.js 项目仍在使用 CommonJS。 然而,随着 ESM 成为官方标准并在 Node.js 中得到支持,社区正逐渐向 ESM 迁移。 对于新项目,通常推荐使用 ESM。

仍在使用

  • UMD (Universal Module Definition): UMD 的设计目标是兼容 AMD、CommonJS 以及浏览器全局变量等多种环境。 它通过判断当前环境来决定使用哪种模块加载方式。这使得 UMD 在需要兼容多种环境的库中仍然有用,尤其是在一些需要支持旧版本环境的项目中。
  • ESM (ECMAScript Modules): ESM 是 ECMAScript 2015 (ES6) 中引入的官方标准化模块系统,使用 import 和 export 关键字。 它是 JavaScript 语言层面的标准,得到了所有现代浏览器的原生支持,并且在 Node.js 中也被大力推广。 ESM 被认为是 JavaScript 模块化的未来,是目前新项目开发的首选。

总结

模块加载方式状态主要原因
AMD, CMD已淘汰被 ESM 和现代构建工具取代,语法相对繁琐。
IIFE已淘汰 (作为手动模块方案)作为一种模式,已被更强大的模块系统替代。
CommonJS正在被取代虽然在 Node.js 中仍广泛使用,但 ESM 是官方标准和未来方向。
UMD仍在使用在需要广泛兼容性的库中仍有价值。
ESM当前标准官方标准,现代浏览器和 Node.js 均支持,是未来的趋势。