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

CommonJS(CJS)

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

// 模块导出
module.exports = {
// 模块内容
}; // 模块导入
const module = require('module');

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

AMD(Asynchronous Module Definition)

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

// 模块定义
define(['dependency1', 'dependency2'], function (dependency1, dependency2) {
// 模块内容
return {
// 模块导出内容
};
}); // 模块加载
require(['module'], function (module) {
// 模块加载完成后执行的逻辑
});

UMD(Universal Module Definition)

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

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

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

(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)

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

// 模块导出
export const module = {
// 模块内容
}; // 模块导入
import {module} from 'module';

概括

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

  • CJS 为同步加载,主要用于服务器端编程,因为在服务器端加载速度不太重要,而且同步加载更容易理解和管理。
  • AMD 为异步加载,适用于浏览器环境中的异步模块加载,尤其是在 Web 应用中采用模块化开发时使用。
  • UMD 为通用形,通常用作 ESM 不起作用时的后备方案,适用于同时在浏览器和 Node.js 环境中使用的代码,使得代码具有更大的通用性。
  • ESM 适用于现代浏览器以及支持 ES6 模块的 Node.js 版本,使得代码更具可维护性和可移植性。

JS模块化系统的更多相关文章

  1. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  2. js 模块化的一些理解和es6模块化学习

    模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理  5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...

  3. js模块化AMD/CMD

    JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?     模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统 ...

  4. JS模块化规范CommonJS,AMD,CMD

    模块化是软件系统的属性,这个系统被分解为一组高内聚,低耦合的模块.理想状态下我们只需要完成自己部分的核心业务逻辑代码,其他方面的依赖可以通过直接加载被人已经写好模块进行使用即可.一个模块化系统所必须的 ...

  5. 一览js模块化:从CommonJS到ES6

    本文由云+社区发表 模块化是指把一个复杂的系统分解到一个一个的模块. 模块化开发的优点: (1)代码复用,让我们更方便地进行代码管理.同时也便于后面代码的修改和维护. (2)一个单独的文件就是一个模块 ...

  6. js模块化编程之彻底弄懂CommonJS和AMD/CMD!

    先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写 ...

  7. JS模块化规范CMD之SeaJS

    1. 在接触规范之前,我们用模块化来封装代码大多为如下: ;(function (形参模块名, 依赖项, 依赖项) { // 通过 形参模块名 修改模块 window.模块名 = 形参模块名 })(w ...

  8. 初步理解require.js模块化编程

    初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...

  9. [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!

    原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...

  10. js模块化AMD、CMD、ES6

    AMD CMD ES6模块化 各个模块化规范对比理解 一.AMD 在上一篇js模块化入门与commonjs解析与应用中详细的解析了关于commonjs模块化规范,commonjs采用的用同步加载方式, ...

随机推荐

  1. Redis内存问题的学习之一

    Redis内存问题的学习之一 背景 前几天帮同事看redis的问题 发现info memory 显示 60GB 但是实际上 save出来的dump文件只有 800M 然后导入到其他的redis之后, ...

  2. [转帖]堆表(HOT)和索引组织表(IOT)优缺点

      转载于: https://www.ywnds.com/?p=7702 一.堆表和索引组织表 NOTE 堆表也可以称之为 HOT,索引组织表也可以称之为 IOT,下面没有特别说明,两者都是一个意思. ...

  3. [转帖]SPEC CPU 2017 单线程整数性能测试与总结 (2022)

    https://zhuanlan.zhihu.com/p/574105237 x86处理器的整数性能在过去4年间取得了长足的进步 x86处理器移动端性能缩水非常严重 ARM公版的旗舰级处理器相比前代进 ...

  4. [转帖]Oracle AWR报告提取方法

    https://www.cnblogs.com/jyzhao/p/4030022.html 本文旨在用来指导项目人员自行提取Oracle数据库的AWR报告. 1.当前连接实例的AWR报告提取:@?/r ...

  5. [转帖]【JVM】线程安全与锁优化

    线程安全 1.定义 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果 2. ...

  6. [转帖]深入内存/主存:解剖DRAM存储器

    https://zhuanlan.zhihu.com/p/561501585 2022/9/9更新:经过和评论区大佬的交流,准备研读一下JEDEC标准,主要是加深自己对banking和访存加速的理解( ...

  7. s-tui验证机器主频的过程

    摘要 小年在家陪孩子. 翻阅<企业存储技术>公众号的文章时 找到了 s-tui 进行监控机器主频的文章 感觉挺有用的 想验证一下 虚拟机有否支持Intel的睿频功能. 所以将之前写的pyt ...

  8. charles如何抓取https请求

    我们都知道charles下载安装后只能抓取http请求,要想抓取https请求需要下载安装证书 下面介绍pc端和移动端的配置方法 一.pc端(win) 1.打开charles,点击help>SS ...

  9. js中forEach的用法、forEach如何跳出循环、forEach与for之间的区别

    定义和用法 forEach() 调用数组的每个元素,并将元素传递给回调函数. 注意: forEach() 对于空数组是不会执行回调函数的. 用法: array.forEach(function(cur ...

  10. git创建分支出现 fatal: Not a valid object name: 'master'.

    今天使用git 创建新分支的时候 出现了一个错误 fatal: Not a valid object name: 'master'. 问题描述:一个非法的master,原因:本地还没有创建master ...