CJS,AMD,UMD和ESM区别

简介: 说到 CJS, AMD, UMD 和 ESM 四者的区别,不得不提一下模块这个概念。 CJS CJS(CommonJs) 适用于后端 Node。 Node 与 Javascript 最开始是没有模块这

说到 CJS, AMD, UMD 和 ESM 四者的区别,不得不提一下模块这个概念。

CJS

CJS(CommonJs) 适用于后端 Node。

Node 与 Javascript 最开始是没有模块这个概念的。相反,模块概念在 java 和 php 等却存在。为了方便对代码开发和管理,Node 首先提出了 CJS。

// util.js 
module.exports = function dosomething(data) {
   
    // todo
}

// main.js
const dosomething = require('./util.js')

CommonJs 是引入对象的一个拷贝,可以直接运行在后端环境中。故 CommonJs 在浏览器环境中是无效的,必须要经过编译和打包后才能在浏览器环境中执行。

AMD

AMD(asynchronous module definition) 适用于前端。

CommonJs 主要适用于服务器 Node,浏览器 Javascript 那时还没有 ESM。而开发人员也想实现浏览器代码模块化开发,随之诞生了 AMD。

AMD 使用 requirejs 库来实现,可以使用 require 与 define 两种方式加载依赖。

AMD是异步加载模块的,可以通过回调处理异步。

// dep1.js
define(['jquery', 'util'], function (jquery, util) {
    
    var dosomething = function() {
   };
    return {
   
        dosomething: dosomething
    }
});

// dep2.js
define(['dep1'], function (dep1) {
    
    // dep1.dosomething();
});
// require 也可以直接用来替换define。
// require(['dep1'], function (dep1) { 
//   dep1.dosomething();
// });

require 多用于解决循环依赖中,在运行时加载文件。

UMD

UMD(Universal Module Definition)适用于任何环境下使用。

与 CJS、AMD 不同,UMD是一种设计模式,可以同时适用于前端后端这两种不同的模块形式。

很多小伙伴为避免问题,在打包时都会把打包模式改成 umd。并且在 ESM 不能使用的情况下也会选择 UMD。

// webpack.config.js
output: {
  ...
  // 将你的 library 暴露为所有的模块定义下都可运行的方式
  libraryTarget: 'umd',
}

// rollup.config.js
output: {
  ...
  // 将你的 library 暴露为所有的模块定义下都可运行的方式
  format: "umd",
}

ESM

ESM(ES Module)这是 Javascript 提出的实现一个标准模块系统的方案。

// util.js
export const dosomething () {
    // todo
};

// main.js
const { dosomething } = import('./util.js')

ESM 是近些年来常用的敲代码方式。

另,ESMScript 的出现,也使得在 script 中可以直接引用 ESM 文件。

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

设置type=module ,会将加载的文件视为模块文件,识别模块的import语句并加载。

  • ESM 可以替代 CJS 与 AMD,并且兼备 UMD 任何环境都可使用的特性。
  • 自身的静态化特点,在编译时加载,使得页面加载速度快。
  • 真正意义上做到了按需使用。使用 import 并不会直接执行模块,而是生成一个动态的只读引用,等到真的需要用到时,才会到模块里面去读取。
  • 可以在 html 中直接使用,如下:
    <script type="module"> 
      import { dosomething } from './util.js'; 
      dosomething(); 
    </script>
    
    因为 ESM 独有的特性,目前 Rollup 与 Vite 已经在dev与打包中使用。

结语

感谢您的阅读!希望本文带给您有价值的信息。

如果对您有帮助,请「点赞」支持,并「关注」我的主页获取更多后续相关文章。同时,也欢迎「收藏」本文,方便以后查阅。

写作不易,我会继续努力,提供有意义的内容。感谢您的支持和关注!

目录
相关文章
|
6天前
|
JavaScript 前端开发
多种模块格式,包括 ES, CommonJS, UMD, AMD, SystemJS 和 IIFE的区别点分别是什么?
【10月更文挑战第20天】在实际应用中,选择合适的模块格式需要根据项目的需求、目标环境以及开发团队的习惯等因素来综合考虑。不同的模块格式都有其自身的优势和适用场景,合理选择可以提高代码的组织性、可维护性和性能。
15 8
|
6月前
|
缓存 JavaScript 前端开发
JavaScript模块化:CommonJS与ES Modules的对比与使用
【4月更文挑战第22天】本文探讨了JavaScript模块化的两种规范——CommonJS和ES Modules。CommonJS适用于Node.js,通过`require`同步加载模块,而ES Modules(ES6模块)用于前端,支持异步加载和静态导入导出。CommonJS有缓存,ES Modules无缓存。在选择时,Node.js环境常用CommonJS,但趋势正转向ES Modules,前端项目推荐使用ES Modules以利用其优化性能的优势。
|
6月前
|
JavaScript
JS模块化规范之ES6及UMD
JS模块化规范之ES6及UMD
85 3
|
JavaScript 前端开发
说说你对JavaScript模块化方案的理解和 CommonJS、AMD、CMD、ES6 Module 分别是什么?
模块化是指将一个复杂问题,自顶向下逐层把系统划分为若干模块的过程。对于整个系统来说,这些模块可组合,分解和更换的单元。对于编程领域的模块化就是遵守固定的原则,将一个大文件拆分成多个独立且相互依赖的小模块。简单理解模块化就是在一个js文件中能够引入另一个js文件
135 0
|
JavaScript 前端开发
模块化开发:CommonJS、AMD 和 ES6 Modules 的区别与使用方式
在前端开发中,模块化开发是一种重要的编程方法,它可以帮助我们更好地组织和管理代码,提高代码的可维护性和复用性。在JavaScript中,有多种模块化开发的标准,包括CommonJS、AMD和ES6 Modules。让我们逐一了解它们的区别和使用方式:
202 0
|
JavaScript 前端开发 Ruby
打包出来的 common.js/umd.js 是啥?
打包出来的 common.js/umd.js 是啥?
236 0
|
Web App开发 前端开发 JavaScript
UMD 被淘汰了吗?不考虑的 UMD 的库如何在纯 UMD 前端项目中运行?
UMD 被淘汰了吗?不考虑的 UMD 的库如何在纯 UMD 前端项目中运行?
227 0
|
Rust 编译器 Go
你真的了解ESM吗?
模块兼容性 推荐阅读指数⭐️⭐️⭐️ ESM是个啥 推荐阅读指数⭐️⭐️⭐️⭐️ 在浏览器中使用ESM 推荐阅读指数⭐️⭐️⭐️⭐️ 模块指定符 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ 默认情况下,模块是defer的 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ 动态导入 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ import.meta 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ 优化建议 推荐阅读指数⭐️⭐️⭐️ 网站中使用ESM 推荐阅读指数⭐️⭐️⭐️
151 0
你真的了解ESM吗?
|
JavaScript 前端开发 Java
继 CJS、AMD 之后又来一个 UMD,究竟是什么?有什么用?
最近研究了一下 Vue 和 React 编译出来的版本文件,我发现 Vue 提供了 CommonJS|ES Module|ES Module browser|UMD 四种格式,而 React 提供 CommonJS|UMD 两个版本,对于 CommonJS|ES Module 对应的八股可以说是很多了,而里面夹杂的 UMD 又是什么东西呢?