ECMAScript (ES) 模块(ESM)是JavaScript的一种模块系统,它在ES6(ECMAScript 2015)中被引入。ESM允许开发者将代码分割成独立的模块,这些模块可以单独加载和执行。以下是一些ESM的基本示例和概念:
导出(Export)
在ESM中,你可以使用export
关键字来导出模块中的变量、函数或类。这允许其他模块导入并使用这些导出的成员。
导出单个成员:
// math.js
export function add(x, y) {
return x + y;
}
export const pi = 3.14;
导出默认成员:
默认导出只能有一个,它不需要指定名称。
// circle.js
export default function(radius) {
return Math.PI * radius ** 2;
}
导入(Import)
在其他模块中,你可以使用import
关键字来导入之前导出的成员。
导入默认成员:
// app.js
import circleArea from './circle.js';
console.log(circleArea(5)); // 输出: 78.5
导入命名成员:
// app.js
import { add, pi } from './math.js';
console.log(add(1, 2)); // 输出: 3
console.log(pi); // 输出: 3.14
导入整个模块:
如果你需要导入一个模块的所有导出,你可以使用*
作为通配符。
// app.js
import * as math from './math.js';
console.log(math.add(1, 2)); // 输出: 3
console.log(math.pi); // 输出: 3.14
动态导入(Dynamic Import)
在ES2020中,引入了import()
函数,它允许在运行时动态加载模块。这在需要按需加载模块时非常有用。
// app.js
async function loadModule() {
const module = await import('./module.js');
console.log(module.default());
}
loadModule();
注意事项
import
语句必须位于模块的顶层,不能在代码块(如if
语句或循环)中使用。import()
函数返回一个Promise,这意味着你可以使用async/await
来处理异步加载的模块。
浏览器支持
大多数现代浏览器都支持ESM,但为了确保兼容性,你可能需要使用Babel或其他工具来转译你的代码。
Node.js支持
Node.js从版本12开始支持ESM,但你需要在package.json
文件中指定"type": "module"
,或者在命令行中使用--experimental-modules
标志。
结论
ESM提供了一种清晰、简洁的方式来组织和重用代码。它简化了模块的导入和导出,使得JavaScript项目更加模块化和可维护。随着浏览器和Node.js对ESM的进一步支持,它将成为JavaScript模块化的未来标准。