JavaScript 支持哪些模块加载方式
创建于:
2024-10-20
在 JavaScript 中,导入模块的方式根据使用的模块规范(如 CommonJS、ESM 等)有所不同。下面介绍几种常见的导入方式:
1. CommonJS 模块导入
- 用于 Node.js 环境(也可以在支持的工具中使用,如 Webpack)。
- 语法:require
const fs = require('fs'); // 导入 Node 内置模块
const myModule = require('./myModule'); // 导入本地模块
- 特性:
- 模块导入是同步的。
- 常用于老版本项目和 Node.js 中。
2. ESM(ECMAScript Module)导入
- 原生支持的 ES6 模块系统。现代前端项目和 Node.js (v12+) 支持 ESM。
// 导入默认导出
import defaultExport from './myModule.js';
// 导入命名导出
import { namedExport1, namedExport2 } from './myModule.js';
// 重命名导入的变量
import { namedExport as alias } from './myModule.js';
// 导入所有内容为对象
import * as myModule from './myModule.js';
// 动态导入
const module = await import('./myModule.js');
- 特性:
- 更加模块化,支持 tree-shaking。
- 可与 async/await 配合动态导入。
3. AMD(Asynchronous Module Definition)导入
- 常见于老的前端工具(如 RequireJS)。
require(['./myModule'], function (myModule) {
// 模块加载完成后的操作
});
- 特性:
- 适用于浏览器,支持异步加载模块。
- 不常见于现代项目。
4. UMD(Universal Module Definition)导入
- 兼容 CommonJS、AMD 和全局变量的模块。
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['dependency'], factory); // AMD
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('dependency')); // CommonJS
} else {
root.myModule = factory(root.dependency); // 浏览器全局
}
}(this, function (dependency) {
// 模块逻辑
}));
- 特性:
- 用于需要同时支持多种环境的库。
5. 全局变量方式导入
- 不使用模块系统,通过 <script> 标签引入脚本。
<script src="myModule.js"></script>
<script>
console.log(window.myModule); // 直接访问全局变量
</script>
- 特性:
- 适合简单页面,但无法实现模块隔离。
总结:什么时候用哪种导入方式?
- Node.js:推荐使用 ESM (import),但 CommonJS (require) 仍然广泛支持。
- 现代前端项目:推荐使用 ESM 导入。
- 老旧项目或浏览器兼容性需求:可能使用 AMD 或 UMD。
- 简单静态页面:直接使用全局变量导入。
如需在 ESM 和 CommonJS 间兼容,你可能需要配置工具(如 Rollup、Webpack)或添加 .cjs、.mjs 文件后缀来区分模块类型。
评论
没有评论。。。