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与打包中使用。

结语

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

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

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

目录
相关文章
|
存储 JavaScript 前端开发
【前端系列】- 富文本组件(mavon-editor)
mavon-editor是一款基于vue的markdown编辑器,可以用来做文本的编辑,比如是某种业务需要发送公告、个人博客等,都可以用到,操作也十分简单。
4698 0
【前端系列】- 富文本组件(mavon-editor)
|
5月前
|
缓存 监控 前端开发
如何监控浏览器缓存的命中率?
如何监控浏览器缓存的命中率?
289 57
|
JavaScript
报错[Vue warn]: $listeners is readonly. $attrs is readonly.怎么解决?
报错[Vue warn]: $listeners is readonly. $attrs is readonly.怎么解决?
|
5月前
|
存储 SQL 人工智能
MySQL 数据类型详解:字符串、数字、日期
在 MySQL 数据库设计中,选择合适的数据类型对存储效率和查询性能至关重要。本文详细介绍了字符串、数字和日期三大类数据类型及其子类型,帮助开发者根据业务需求做出更优选择。内容涵盖 CHAR 与 VARCHAR 的区别、TEXT 和 BLOB 的使用场景、整数与浮点类型的适用范围,以及日期时间类型的特性。通过最佳实践建议,提升数据库性能并避免常见问题。
278 4
|
Web App开发 JavaScript 前端开发
浏览器与Node.js事件循环:异同点及工作原理
浏览器与Node.js事件循环:异同点及工作原理
|
8月前
|
自然语言处理 Cloud Native 安全
Bolt.diy 部署与应用全攻略
Bolt.diy 部署与应用全攻略
303 6
|
9月前
|
消息中间件 JavaScript 前端开发
最细最有条理解析:事件循环(消息循环)是什么?为什么JS需要异步
度一教育的袁进老师谈到他的理解:单线程是异步产生的原因,事件循环是异步的实现方式。 本质是因为渲染进程因为计算机图形学的限制,只能是单线程。所以需要“异步”这个技术思想来解决页面阻塞的问题,而“事件循环”是实现“异步”这个技术思想的最主要的技术手段。 但事件循环并不是全部的技术手段,比如Promise,虽然受事件循环管理,但是如果没有事件循环,单一Promise依然能实现异步不是吗? 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您
|
存储 SQL 分布式计算
AnalyticDB for MySQL最佳实践总结
随着AnalyticDB for MySQL(下文统一简称:ADB)在阿里集团各个业务线、社会上各行各业的推广应用,我们沉淀了一些最佳实践,现在笔者整理在这里,供大家参考,希望对大家有帮助。本篇文章总结了ADB表的设计的最佳经验、数据写入的最佳经验、高效查询的最佳实践,以及一些常见的问题。 说明: 1.在读这篇文章之前,请先了解ADB的产品官方文档,以提前适当了解ADB; 2.本文写的最佳实践主要针对ADB3.0,ADB2.0在原理上也同样适用。
5822 1
AnalyticDB for MySQL最佳实践总结
|
API
Apose.word控件获取书签中的内容并复制到一个新的word文档中
Apose.word控件获取书签中的内容并复制到一个新的word文档中
609 0
Apose.word控件获取书签中的内容并复制到一个新的word文档中
|
Java Maven 开发者
深入剖析Spring Boot在Java Web开发中的优势与应用
深入剖析Spring Boot在Java Web开发中的优势与应用
483 3