前端模块化 AMD、CMD、CommonJS、ESM的差异对比

AMD、CMD、CommonJS、ESM 差异

1. 一句话定位

  • CommonJS :Node 服务端模块化,同步加载
  • AMD :浏览器模块化,RequireJS,提前加载、并行执行
  • CMD :浏览器模块化,SeaJS,就近加载、延迟执行
  • ESM :ES 官方标准,静态编译、现代唯一主流

2. 核心差异对比表(面试必背)

特性 CommonJS AMD CMD ESM
全称 CommonJS Asynchronous Module Definition Common Module Definition ES Module
代表 Node.js RequireJS SeaJS 浏览器 / 现代构建工具
加载方式 同步 异步 异步 静态 / 异步
依赖执行时机 运行时 提前加载、提前执行 就近 require、延迟执行 编译时确定
导出方式 module.exports define define export / export default
导入方式 require() define(...) require() import
支持 Tree Shaking ❌ 不支持 ❌ 不支持 ❌ 不支持 ✅ 支持
取值方式 值拷贝 引用 引用 引用(动态绑定)
现在地位 Node 仍在用 已淘汰 已淘汰 现代标准

3. 逐一看区别(面试口语版)

CommonJS(Node)

  • 同步加载,不适合浏览器(会阻塞渲染)
  • require() 导入,module.exports 导出
  • 导出是值拷贝,导出后外部改不影响内部
  • 不支持 Tree Shaking
  • 仅用于 Node,浏览器不原生支持

AMD(RequireJS)

  • 浏览器异步模块化
  • 依赖前置:一开始就把所有依赖加载并执行
  • 写法:
js 复制代码
define(['a', 'b'], function(a, b) {
  return {}
})
  • 优点:并行加载快
  • 缺点:依赖写一堆,阅读不自然

CMD(SeaJS)

  • 浏览器异步模块化
  • 依赖就近 :用到时再 require
  • 延迟执行
js 复制代码
define(function(require, exports, module) {
  const a = require('./a')
})
  • 更贴近 CommonJS 写法
  • 现在已废弃

ESM(ES Module,现在唯一标准)

  • 官方标准,浏览器 & Node & 构建工具全支持
  • import / export 静态语法
  • 编译时加载,能 Tree Shaking
  • 导出是引用传递,实时更新
  • 支持顶层 await
  • 未来唯一方案

4. 最经典两道面试题答案

AMD vs CMD 区别?

  • AMD:依赖前置,提前执行
  • CMD:依赖就近,延迟执行

CommonJS vs ESM 区别?(必考)

  • CommonJS 是运行时加载 ,ESM 是编译时静态加载
  • CommonJS 同步,ESM 可异步
  • CommonJS 值拷贝 ,ESM 引用传递
  • CommonJS 不支持 Tree Shaking,ESM 支持
  • CommonJS 顶层 this 是 module,ESM 是 undefined
  • CommonJS 不能用 import/export,ESM 不能用 require
相关推荐
曹牧4 小时前
C#:空合并运算符
java·前端·数据库
小羊没烦恼!5 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
智能直播7 小时前
RK3518:1.5G 内存 + 8G 存储,如何跑起硬件编解码、Web、AI 识别、绿幕特效
前端·人工智能·5g
掘金酱9 小时前
【10.24 特别活动】AI 时代,程序员的新饭碗在哪里?
前端·人工智能·后端
excel9 小时前
多进程环境下使用 PM2 部署 Socket.IO:需要注意什么
前端
IT_陈寒9 小时前
Redis的原子性竟然失效了?记一次分布式锁翻车实录
前端·人工智能·后端
时间的情敌11 小时前
《回顾 2018 前端:Vue2 成熟期,Webpack4 发布,PWA 大火》
前端
Java后端的Ai之路11 小时前
前端技术Vue-09-webpack-vuejs-实战
前端·vue.js·webpack
LMT流氓兔11 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
涛涛ing11 小时前
React Compiler正式“Rust化”:你项目里的Babel插件,正在被编译进打包器
前端