JS模块化系统

随着 JavaScript 开发变得越来越广泛,命名空间和依赖关系变得越来越难以处理。人们已经开发出不同的解决方案以模块系统的形式来解决这个问题。

CommonJS(CJS)

CommonJS 是一种同步加载模块的规范,主要用于服务器端的 Node.js 环境。

javascript 复制代码
// 模块导出
module.exports = {
  // 模块内容
};

// 模块导入
const module = require('module');

top:CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。

AMD(Asynchronous Module Definition)

AMD 是一种_异步_加载模块的规范,主要用于浏览器端的 JavaScript 开发。它允许模块在加载完成后立即执行,而不会阻塞页面加载。

javascript 复制代码
// 模块定义
define(['dependency1', 'dependency2'], function (dependency1, dependency2) {
  // 模块内容
  return {
    // 模块导出内容
  };
});

// 模块加载
require(['module'], function (module) {
  // 模块加载完成后执行的逻辑
});

UMD(Universal Module Definition)

UMD 是一种通用的模块定义格式,旨在兼容 CommonJS 、AMD 以及全局变量导出的方式。

实现原理为:先判断是否支持node.js 的模块,存在就使用node.js ;再判断是否支持AMD (define 是否存在),存在则使用*

*AMD的方式加载。这就是所谓的UMD**。

javascript 复制代码
(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD
    define(['exports', 'module'], factory);
  } else if (typeof exports === 'object' && typeof module === 'object') {
    // CommonJS
    factory(exports, module);
  } else {
    // 浏览器环境下暴露到全局变量
    factory((root.myModule = {}), root.myModule);
  }
})(this, function (exports, module) {
  // 模块内容
});

UMD 实质上创建了一种使用两者之一的方法,同时还支持全局变量定义。因此,UMD 模块能够在客户端和服务器上工作。

ESM(ES Module)

ESM 是 ECMAScript 官方提供的模块标准,支持异步加载,具有静态导入和导出,使得代码更具可靠性和可预测性。

javascript 复制代码
// 模块导出
export const module = {
  // 模块内容
};

// 模块导入
import {module} from 'module';

概括

不同的模块规范各有优劣,选择合适的规范取决于项目的需求和目标平台。

  • CJS 为同步加载,主要用于服务器端编程,因为在服务器端加载速度不太重要,而且同步加载更容易理解和管理。
  • AMD 为异步加载,适用于浏览器环境中的异步模块加载,尤其是在 Web 应用中采用模块化开发时使用。
  • UMD 为通用形,通常用作 ESM 不起作用时的后备方案,适用于同时在浏览器和 Node.js 环境中使用的代码,使得代码具有更大的通用性。
  • ESM 适用于现代浏览器以及支持 ES6 模块的 Node.js 版本,使得代码更具可维护性和可移植性。
相关推荐
wangruofeng5 小时前
AI Models 1.1.0 发布,查大模型价格、对比模型和找 API 地址
前端·aigc·ai编程
wangruofeng5 小时前
给前端开发者的 100 个设计参考网站
前端·设计
星栈8 小时前
视频即代码,Remotion 能做什么、不能做什么
前端·音视频开发
广州华水科技8 小时前
单北斗GNSS位移监测系统的应用与技术解析
前端
用户47949283569158 小时前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
风骏时光牛马10 小时前
生成一个AI多模态标题,仅输出一条标题,无额外文字、问句、备选、配图、文案等任何附加内容,不需要其他的任务服务 只要标题。
前端
wangruofeng11 小时前
从 GIF 到 AVIF:网页图片格式演进与 2026 年选型指南
前端·架构
清晨Coding12 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js
鶴哥只手遮天12 小时前
《Electron 45.2.3 内核解剖》第 4 章 补丁体系:380 个补丁改了什么
前端·electron
FungLeo15 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构