前端模块化 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 顶层 thismodule,ESM 是 undefined
  • CommonJS 不能用 import/export,ESM 不能用 require
相关推荐
恋猫de小郭9 分钟前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
敲代码的彭于晏17 分钟前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
IT_陈寒23 分钟前
Redis内存飙升的锅,原来是我没搞懂这个过期策略
前端·人工智能·后端
云浪30 分钟前
前端二进制数组完全指南:ArrayBuffer、TypedArray、DataView 一次讲透
前端·javascript
张风捷特烈32 分钟前
Flutter 类库大揭秘#02 | path_provider 各平台实现
前端·flutter
铁皮饭盒1 小时前
26年bunjs, elysia+pg一把梭, redis都省了
前端·javascript·后端
lichenyang45314 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen14 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒14 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端