前言
UMD(Universal Module Definition)是一种通用的模块定义规范,旨在使同一个模块能够在不同的环境中使用,包括浏览器、Node.js 等。它采用一种灵活的方式,既支持类似 CommonJS 的模块加载方式,也支持类似 AMD 的异步加载方式,同时兼容浏览器全局变量的使用。
UMD 模块通常通过一定的判断逻辑来确定当前的模块加载环境,从而决定采用何种加载方式。这种灵活性使得开发者能够编写一次模块代码,然后在不同的环境中使用,无需修改代码。
本节对应的所有 demo 在此处
UMD 模块的基本结构
UMD 模块通常采用一种通用的结构,用于在不同的加载环境中判断和执行。以下是一个简单的 UMD 模块结构示例:
(function (root, factory) {
if (typeof define === "function" && define.amd) {
// AMD
define(["dependency"], factory);
} else if (typeof define === "function" && define.cmd) {
// CMD 环境
define(function (require, exports, module) {
module.exports = factory(require("dependency"));
});
} else if (typeof exports === "object") {
// Node.js/CommonJS
module.exports = factory(require("dependency"));
} else {
// Browser globals
root.YourModule = factory(root.Dependency);
}
})(typeof self !== "undefined" ? self : this, function (Dependency) {
// 你的模块代码
return YourModule; // 暴露模块
});
此结构中,通过判断 define、exports 和全局对象,确定当前所处的环境,从而选择合适的加载方式。
React 中的 UMD 模块
React 是一个流行的 JavaScript 库,用于构建用户界面。React 库也支持 UMD 格式,使得它可以在浏览器和 Node.js 等环境中使用。
在浏览器中使用 React 的 UMD 模块的示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>React Demo template</title>
<script src="https://cdn.jsdelivr.net/npm/react@17.0.2/umd/react.development.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/react-dom@17.0.2/umd/react-dom.development.min.js">