AMD、CMD、UMD、ESM和CommonJS

news/2025/10/11 13:57:19/文章来源:https://www.cnblogs.com/amulong1237/p/19134902

好的,这是一个关于 JavaScript 模块化规范的全面解析。这些规范的出现都是为了解决 JavaScript 在大型项目中代码组织、依赖管理和作用域隔离的问题。

下面我将详细解释 CommonJS、AMD、CMD、UMDESM,并说明它们之间的关系和区别。


1. CommonJS - 同步的服务器端模块规范

CommonJS 规范主要应用于服务器端,例如 Node.js 环境。它的设计理念是模块的加载是同步的,因为在服务器端,模块文件都存放在本地磁盘,读取速度非常快,同步加载不会造成性能问题。

特点:

  • 同步加载:执行 require 时,会阻塞后续代码的执行,直到模块被加载并执行完毕。
  • 模块输出的是值的拷贝:一旦输出一个值,模块内部的变化就影响不到这个值(除非是导出一个函数,通过函数来获取内部状态)。
  • 每个文件都是一个模块:拥有独立的作用域。

语法:

  • 导出模块:使用 module.exportsexports
    // math.js
    function add(a, b) {return a + b;
    }
    module.exports = {add: add
    };
    // 或者 exports.add = add;
    
  • 导入模块:使用 require
    // app.js
    const math = require('./math.js');
    console.log(math.add(2, 3)); // 5
    

适用环境: Node.js。


2. AMD - 异步的浏览器端模块规范

AMD 规范主要为了解决浏览器环境的模块化问题。由于浏览器加载文件需要从服务器获取,如果采用同步方式会导致页面“假死”,因此 AMD 的设计理念是异步加载。

代表库: RequireJS

特点:

  • 异步加载:不阻塞页面渲染,依赖模块加载完毕后执行回调函数。
  • 显式地声明依赖。

语法:

  • 定义模块:使用 define
    // 定义一个依赖 jQuery 的模块
    define(['jquery'], function($) {// 模块功能function myFunc() {$('#content').html('Hello, AMD!');}// 暴露公共接口return {myFunc: myFunc};
    });
    
  • 加载模块:使用 require
    // 加载并使用模块
    require(['myModule'], function(myModule) {myModule.myFunc();
    });
    

适用环境: 浏览器。


3. CMD - 通用的模块规范

CMD 也是国内发展出来的一种浏览器端模块规范,结合了 CommonJS 和 AMD 的特点。

代表库: Sea.js

特点:

  • 推崇依赖就近延迟执行。在需要依赖时,随时 require
  • 语法上更接近 CommonJS。

语法:

  • 定义模块:使用 define
    define(function(require, exports, module) {// 同步获取依赖var $ = require('jquery');// 异步获取依赖require.async('./moduleB', function(moduleB) {// ...});// 暴露接口exports.someMethod = function() {$('#content').html('Hello, CMD!');};
    });
    

AMD 与 CMD 的主要区别:

  • 依赖声明:AMD 推崇依赖前置,在定义模块时就声明所有依赖。CMD 推崇依赖就近,在代码需要时再 require
  • 执行时机:AMD 的模块加载完成后会立即执行。CMD 的模块加载后默认不执行,只有在 require 时才会执行。

4. UMD - 通用模块定义

UMD 不是一个独立的规范,而是一种模式或者代码包装技术。它的目标是让同一个模块代码可以在多种环境中运行(无论是 CommonJS、AMD 还是全局变量)。

原理: 通过判断当前环境支持的模块系统,将模块“适配”到该系统中。

示例模板:

(function (root, factory) {if (typeof define === 'function' && define.amd) {// AMD 环境 (如 RequireJS)define(['jquery'], factory);} else if (typeof module === 'object' && module.exports) {// CommonJS 环境 (如 Node.js)module.exports = factory(require('jquery'));} else {// 浏览器全局变量root.myModule = factory(root.jQuery);}
}(this, function ($) {// 模块的业务代码function myFunc() {$('body').html('Hello, UMD!');}// 暴露公共接口return {myFunc: myFunc};
}));

适用环境: 同时需要支持浏览器和 Node.js 的,例如 React、Vue 等。


5. ESM - 官方的模块标准

ESM 是 ECMAScript 2015 (ES6) 官方推出的模块标准,旨在成为浏览器和服务器通用的模块解决方案。它是 JavaScript 语言的原生模块系统。

特点:

  • 静态化:在编译时(代码执行前)就能确定模块的依赖关系,以及输入和输出的变量。这使得静态分析、Tree Shaking(摇树优化)成为可能。
  • 模块输出的是值的引用
  • 异步加载,也可以同步执行。
  • 语法简洁,是未来的绝对主流。

语法:

  • 导出模块:使用 export / export default
    // lib.js
    // 命名导出
    export const pi = 3.14;
    export function add(a, b) { return a + b; }// 默认导出
    export default function() { console.log('Hello'); }
    
  • 导入模块:使用 import
    // main.js
    // 导入命名导出
    import { pi, add } from './lib.js';
    // 导入默认导出
    myDefault from './lib.js';console.log(pi); // 3.14
    add(1, 2);
    myDefault();
    

在浏览器中使用:
需要在 <script> 标签中加上 type="module" 属性。

<script type="module" src="main.js"></script>

适用环境: 现代浏览器和现代 JavaScript 运行环境(Node.js 也已稳定支持)。


总结与对比

规范 主要环境 加载方式 特点 关键字
CommonJS Node.js 同步 简单,适合服务器 require, module.exports
AMD 浏览器 异步 依赖前置,适合浏览器 define, require
CMD 浏览器 异步 依赖就近,延迟执行 define, require
UMD 通用 均可 兼容多种环境的包装方案 -
ESM 通用(现代) 静态/异步 官方标准,静态分析,未来趋势 import, export

发展趋势

  • ESM 是未来:随着 ES6+ 的普及和构建工具(Webpack、Vite、Rollup)的成熟,ESM 已经成为新项目的首选。
  • CommonJS 在 Node.js 生态中依然庞大,但 Node.js 自身正在积极推动向 ESM 迁移。
  • AMD/CMD 在现代前端开发中已很少使用,主要存在于一些遗留的老项目中。
  • UMD 对于需要分发、兼容多种环境的来说,仍然非常有用。

简单来说,对于现代开发:写库用 UMD 或 ESM 分发,写应用直接用 ESM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025异型钢厂家最新推荐榜:定制化生产与卓越品质引领者

2025异型钢厂家最新推荐榜:定制化生产与卓越品质引领者随着工业制造技术的不断进步,异型钢作为建筑、机械、汽车等多个行业的重要材料,其需求量逐年增加。为了满足不同客户的需求,越来越多的异型钢厂家开始注重定制…

linux硬盘在线热扩容非LVM情况

linux硬盘在线热扩容非LVM情况有条件的操作之前务必备份或者打快照!!! 非LVM意思是底层分区是物理分区不是通过lvm管理的逻辑卷。 流程 1.查看分区 2.安装必要软件包 3.扩容分区growpart 4.扩容文件系统 resize2fs(…

【光照】Unity[PBR]环境光中的[漫反射]

本文解析Unity URP中漫反射辐照的技术演进与实现原理。URP通过球谐函数(SH)压缩环境光数据,将立方体贴图转换为9个浮点系数,相比传统方案内存降低90%以上,使移动端能高效计算动态物体间接光照。文章详细阐述SH卷积…

2025年六角钢厂家最新推荐榜:品质过硬与性价比之选

2025年六角钢厂家最新推荐榜:品质过硬与性价比之选随着工业和建筑行业的快速发展,六角钢作为重要的结构材料,其需求量逐年增加。选择一家优质的六角钢供应商不仅能够确保产品质量,还能在成本控制和售后服务方面获得…

2025广东粉末供应厂家TOP10榜单:品质卓越与服务一流的

2025广东粉末供应厂家TOP10榜单:品质卓越与服务一流的随着工业技术的不断进步,粉末材料在各个领域的应用越来越广泛。特别是在广东地区,粉末材料供应商的竞争日益激烈。为了帮助筛选广东粉末品牌,特此发布权威推荐…

2025热喷铝厂家最新推荐榜:品质卓越与专业服务的行业首选!

2025热喷铝厂家最新推荐榜:品质卓越与专业服务的行业首选!随着工业技术的不断进步,热喷铝技术在防腐、耐磨等领域的应用越来越广泛。选择一家优质的热喷铝厂家对于保障工程质量和延长设备使用寿命至关重要。本文将为…

2025方钢厂家,异型钢厂家,六角钢厂家最新推荐榜:品质与性价比兼备的首选品牌!

在现代工业中,方钢作为重要的基础材料,广泛应用于建筑、机械制造、桥梁建设等多个领域。选择优质的方钢供应商对于确保项目质量和成本控制至关重要。为了帮助筛选方钢品牌,特此发布权威推荐榜单,为采购决策提供专业…

JS单线程设计的目的

JavaScript是浏览器的脚本语言。其最终操作都会提现到渲染线程中,也就是浏览器页面显示。如果设计成多线程的话,势必会在dom操作时出现竞争问题,这会导致渲染显示出现难以预期的问题。挣钱养家

强化学习 动作空间(离散/连续)

1. 离散动作空间的策略网络 在离散空间中,动作是可数的,例如:{左, 右, 上, 下} 或 {加速, 刹车}。 网络架构与处理方式输出层:Softmax策略网络的最后一层是一个 Softmax 层。假设有 N 个可选动作,网络会输出一…

QuickLook软件!一款鼠标单击PDF即能显示内容的软件!

软件介绍 大家都知道,苹果电脑有个非常实用的功能,那就是只要单击文件,然后按空格就可以预览文件里的内容,但是Windows没有这功能。今天介绍的这款叫QuickLook,它能在Windows的环境下实现快速预览文件的功能。软件…

Http Security Headers

HTTP 安全相关的响应头(Security Headers)是 Web 应用安全防护的核心手段,通过浏览器与服务器的协作,防御跨站脚本(XSS)、点击劫持、中间人攻击、信息泄露等常见风险。以下是最常用的安全头及其作用机制、使用方…

参照Yalla、Hawa等主流APP核心功能,开发一款受欢迎的海外语聊需要从哪些方面入手

近期,从海外客户的主要咨询需求来看,主要是围绕在借鉴主流APP,在此基础上需要开发属于他们Agency、Coinseller、CP、PK等特色功能。每个客户的需求都有差异,建议您从自己的运营方向出发,来开发符合自己需求的海外…

本土化DevOps的突围之路:Gitee如何重塑企业研发效能

本土化DevOps的突围之路:Gitee如何重塑企业研发效能 在数字经济加速发展的今天,DevOps已从技术概念升级为企业数字化转型的核心引擎。国际权威调研机构Gartner预测,到2025年全球DevOps市场规模将突破300亿美元,其中…

【STM32计划开源】基于STM32的智能点滴输液系统

【STM32计划开源】基于STM32的智能点滴输液系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

溶气气浮/浅层气浮/国内知名气浮机靠谱厂家品牌推荐

溶气气浮/浅层气浮/国内知名气浮机靠谱厂家品牌推荐 无锡工源环境科技股份有限公司是一家在环保水处理设备领域,特别是气浮设备研发与制造方面,具有深厚技术积累和市场声誉的高新技术企业。公司始终专注于水处理技术…

iOS 26 崩溃日志深度指南,如何收集、符号化、定位与监控 - 实践

iOS 26 崩溃日志深度指南,如何收集、符号化、定位与监控 - 实践2025-10-11 13:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

鸿蒙Next密码自动填充服务:安全与便捷的完美融合 - 实践

鸿蒙Next密码自动填充服务:安全与便捷的完美融合 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

覆盖动画 / 工业 / 科研!Rhino 7:专业 3D 建模的全能解决方案,新手也能上手

在 3D 建模领域,一款功能强大、兼容广泛且高效稳定的工具,往往能成为设计师、工程师突破创作瓶颈的关键。由美国 Robert McNeel 公司打造的Rhinoceros(简称 Rhino) 系列软件,凭借其 “集百家之长” 的设计理念,早…

2020CSP-J2比赛记录题解

题目请看洛谷备注:这次比赛我是没打的T1 先把数转成二进制,逐位计算,并判断是否可完整正确拆分贴一下代码 #include <bits/stdc++.h> using namespace std; #define fre(c) freopen(c".in","r…

Binder.getCallingPid()和Binder.getCallingUid()漏洞分析

最近在学习安卓漏挖,在分析ghera数据集时发现一个很有意思的binder特性,但还没搞懂底层原理,先挖个坑 漏洞分析EnforceCallingOrSelfPermission-PrivilegeEscalation-Lean以下代码使用Binder.getCallingPid()和Bind…