工程化
写在前面
模块化 与 包管理器
模块化标准
Commonjs(社区标准)
js
// 定义模块
module.exports = {
name: "commonjs",
};
js
// 引入模块
const commonjs = require("./commonjs"); // 必须以./、../开头
console.log(commonjs.name);
注意
- require 引入模块必须以./ ../ 开头
- 使用 require 引入模块时,模块的导出对象会被缓存,再次引入时,不会重新执行模块代码
- 一个文件是一个模块
- 动态依赖
- 同步引入
ESM(官方标准)
js
// 定义模块
export default {
name: "esm",
};
export const name = "esm";
js
import esm, { name } from "./esm.js";
console.log(esm.name, name);
html
<script type="module" src="./esm.js" />
注意
- 静态依赖 使用 import 引入模块
- 动态依赖 使用 import() 引入模块 返回 Promise
AMD(社区标准)
AMD 英文全称 Async Module Definition 异步模块定义 基本不会在使用了
js
// 定义模块
define(["module"], function (module) {
return {
name: "amd",
};
});
js
// 引入模块
define(["module"], function (module) {
console.log(module.name);
});
require.js
既实现了 AMD 也实现了 CMD
CMD(社区标准)
CMD 英文全称 Common Module Definition 通用模块定义 sea.js(玉伯) 实现了这个方案
js
// 定义模块
define(function (require, exports, module) {
module.exports = {
name: "cmd",
};
});
js
// 引入模块
define(function (require, exports, module) {
const cmd = require("./module.js");
console.log(cmd.name);
});
UMD(社区标准 兼容 Commonjs 与 ESM)
常见问题
- 为什么浏览器端不使用 commonjs 这种规范
- 浏览器端不支持同步引入 引入文件比较耗时,需要等待文件加载完成 阻塞页面