继 CJS、AMD 之后又来一个 UMD,究竟是什么?有什么用?

简介: 最近研究了一下 Vue 和 React 编译出来的版本文件,我发现 Vue 提供了 CommonJS|ES Module|ES Module browser|UMD 四种格式,而 React 提供 CommonJS|UMD 两个版本,对于 CommonJS|ES Module 对应的八股可以说是很多了,而里面夹杂的 UMD 又是什么东西呢?

最近研究了一下 VueReact 编译出来的版本文件,我发现 Vue 提供了 CommonJS|ES Module|ES Module browser|UMD 四种格式,而 React 提供 CommonJS|UMD 两个版本,对于 CommonJS|ES Module 对应的八股可以说是很多了,而里面夹杂的 UMD 又是什么东西呢?

UMD

UMD (Universal Module Definition),希望提供一个前后端跨平台的解决方案(支持 AMDCommonJS 模块方式)。

好家伙,弄半天原来是 AMDCommonJS 的集成!

那为啥要用 UMD 呢?

CJS 和 AMD

CJS(CommonJS)AMD(Asynchronous Module Definition)JS 的两种模块标准,众所周知,前端入门通常时 HTML/CSS/JavaScript 三板斧一把梭,最早的网站开发其实也这样,但是后面随着浏览器(或者说网站)功能越来越多,JS 的模块化成为了一种必然

早期的模块方案是 IIFE(立即执行函数),在加载 HTML 的时候给根对象(也就是 window)去挂载一个属性,这种方案的著名例子就是 Jquery

<script src="http://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script> 
  // window.$
  $
</script>

像这种模块使用,结构如下

<head>
  <script src="assets/js/jquery.js"></script>
  <script src="assets/js/util.js"></script>
</head>
<body></body>
<script>
  // your script
</script>

通常此类模块化只是用来抽取一些普通公共函数或者类似 Jquery 等操作 DOM 的框架,因为这个时候前端还是处于前后端分离前,例如 JSP 的编写方式

至于啥时候前后端分离还是幻想时间

IMG

2010facebook 工程师提出的 bigpipe,其中就提到了将模板引擎放到前端,也就是前后端分离

到了 2009Node.js 的诞生,同时 Node.js 作者和模块管理方案(也就是 npm)作者的结盟为,服务端 JS 带来了模块化标准 CommonJS(CJS)(终于到本段落的主角了!),Node.js 提高了 JS 的上限,npm 丰富了 Node.js 的生态,但这个时候 JS 的模块化仍然只有后端的模块化也就是 CommonJS,但是随着前后端分离的提出,而且 Node.js 提供了许多构建工具,前端的模块化也要来!

然后就有了一些专门为浏览器使用的库,模块化使用的就是 CommonJS,但是在浏览器使用就编译成 IIFE,但 CommonJS 的模块标准是同步引用,这样会阻塞我们 HTML 的渲染,因此就引发了讨论,也就是后面 AMD 出现的原因,AMD 就是基于 CommonJS 的异步的模块导入,是专门给浏览器使用的,像 RequireJS 就是基于 AMD 标准实现的一个模块加载器

使用

可以通过 Rollup 官网的在线编译器来编译得到 UMD 的格式(AMD|CommonJS 也可以!)

Rollup 是一个基于 ESM 模块方案的打包库 / 工具

// main.js
/* TREE-SHAKING */
import { cube } from './maths.js';

console.log( cube( 5 ) ); // 125
// maths.js

// This function isn't used anywhere, so
// Rollup excludes it from the bundle...
export function square ( x ) {
    return x * x;
}

// This function gets included
export function cube ( x ) {
    // rewrite this as `square( x ) * x`
    // and see what happens!
    return x * x * x;
}

最终结果就是

(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
    factory();
})((function () { 'use strict';

    // maths.js

    // This function gets included
    function cube ( x ) {
        // rewrite this as `square( x ) * x`
        // and see what happens!
        return x * x * x;
    }

    /* TREE-SHAKING */

    console.log( cube( 5 ) ); // 125

}));

可以看到 UMD 的实际处理就是先判断一波是不是 AMD 标准然后再去判断是不是 CommonJS 标准,从而正确的使用模块

参考资料

  1. 前后端分离历史 - 水无垠ZZU - CSDN
相关文章
|
10月前
|
SQL JavaScript 关系型数据库
号称下一代Node.js,Typescript以及go的orm的prisma 浅谈如何在nest.js中使用
号称下一代Node.js,Typescript以及go的orm的prisma 浅谈如何在nest.js中使用
号称下一代Node.js,Typescript以及go的orm的prisma 浅谈如何在nest.js中使用
|
1月前
|
JavaScript
JS模块化规范之ES6及UMD
JS模块化规范之ES6及UMD
46 3
|
10月前
|
JavaScript 前端开发
说说你对JavaScript模块化方案的理解和 CommonJS、AMD、CMD、ES6 Module 分别是什么?
模块化是指将一个复杂问题,自顶向下逐层把系统划分为若干模块的过程。对于整个系统来说,这些模块可组合,分解和更换的单元。对于编程领域的模块化就是遵守固定的原则,将一个大文件拆分成多个独立且相互依赖的小模块。简单理解模块化就是在一个js文件中能够引入另一个js文件
105 0
|
10月前
|
缓存 JavaScript API
【AMD、CMD和CommonJS】
【AMD、CMD和CommonJS】
53 0
|
11月前
|
设计模式 前端开发 JavaScript
CJS,AMD,UMD和ESM区别
说到 CJS, AMD, UMD 和 ESM 四者的区别,不得不提一下模块这个概念。 CJS CJS(CommonJs) 适用于后端 Node。 Node 与 Javascript 最开始是没有模块这
260 0
|
11月前
|
JavaScript 前端开发
模块化开发:CommonJS、AMD 和 ES6 Modules 的区别与使用方式
在前端开发中,模块化开发是一种重要的编程方法,它可以帮助我们更好地组织和管理代码,提高代码的可维护性和复用性。在JavaScript中,有多种模块化开发的标准,包括CommonJS、AMD和ES6 Modules。让我们逐一了解它们的区别和使用方式:
127 0
|
11月前
|
Web App开发 前端开发 JavaScript
UMD 被淘汰了吗?不考虑的 UMD 的库如何在纯 UMD 前端项目中运行?
UMD 被淘汰了吗?不考虑的 UMD 的库如何在纯 UMD 前端项目中运行?
169 0
|
Rust 编译器 Go
你真的了解ESM吗?
模块兼容性 推荐阅读指数⭐️⭐️⭐️ ESM是个啥 推荐阅读指数⭐️⭐️⭐️⭐️ 在浏览器中使用ESM 推荐阅读指数⭐️⭐️⭐️⭐️ 模块指定符 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ 默认情况下,模块是defer的 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ 动态导入 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ import.meta 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ 优化建议 推荐阅读指数⭐️⭐️⭐️ 网站中使用ESM 推荐阅读指数⭐️⭐️⭐️
115 0
你真的了解ESM吗?
|
JavaScript 前端开发
使用基于 AMD 的 RequireJS 写一个花活项目
最近在研究前端模块化,大多数文章都提到了 AMD,关于 AMD 的模块标准(或者说规范)将的都很清楚,什么异步加载、保证正确顺序,对付八股很够,但是唯独没有关于 AMD 的实操工程,大多数是纸上谈
|
存储 缓存 前端开发
前端模块化详解(CommonJS、AMD、CMD、ES Module)
本篇文章介绍了前端模块化的发展过程,以及常用的模块化规范。
694 1