ECMAScript modules (ESM) 是一种在 JavaScript 中组织和使用模块的标准。这种格式支持在浏览器和Node.js环境中使用,允许开发者导入和导出功能、变量等。下面是一些ECMAScript modules的基本用法示例。
导出 (Export)
-
命名导出 (Named Exports)
// 在一个模块中导出多个功能 export const name = 'value'; export function myFunction() { /* ... */ } export class MyClass { /* ... */ }
-
默认导出 (Default Exports)
// 只导出一个功能或值 export default function() { /* ... */ } // 或 const myFunction = () => { /* ... */ }; export default myFunction;
导入 (Import)
-
导入命名导出
// 导入单个功能 import { myFunction } from './myModule.js'; // 导入多个功能 import { myFunction, MyClass } from './myModule.js'; // 使用别名 import { myFunction as functionOne } from './myModule.js';
-
导入默认导出
// 导入默认功能 import myDefaultFunction from './myModule.js';
-
同时导入命名和默认导出
import myDefault, { myFunction, MyClass } from './myModule.js';
-
导入整个模块作为命名空间
import * as myModule from './myModule.js'; myModule.myFunction();
动态导入 (Dynamic Imports)
动态导入允许你按需加载模块。
// 使用 Promise 方式
import('./myModule.js')
.then((module) => {
// 使用导入的模块
module.myFunction();
})
.catch(err => {
// 处理错误
});
// 使用 async/await
async function loadModule() {
try {
const module = await import('./myModule.js');
module.myFunction();
} catch (err) {
// 处理错误
}
}
注意事项
- 路径: 导入时,模块路径可以是相对路径(如
./module.js
)或绝对路径(如/lib/module.js
)。 - 文件扩展名: 在 Node.js 中,通常需要指定文件的扩展名(如
.js
),但在一些构建工具和浏览器中可能不需要。 - 顶级导入: ESM 规定所有
import
语句必须在文件的顶部。
这就是 ECMAScript modules 的基本用法。根据你的开发环境(浏览器、Node.js、不同的构建工具),可能还有一些特定的注意事项和最佳实践。
接下来我将结合一个例子进行讲解:
我们可以通过一个简单的项目例子来理解 ECMAScript Modules 的使用。假设我们有一个小项目,其中包含两个文件:mathUtils.js
和 app.js
。在 mathUtils.js
中,我们定义了一些基本的数学函数,并将它们导出。在 app.js
中,我们将导入并使用这些数学函数。
mathUtils.js
这个文件包含了一些数学相关的函数,我们将这些函数作为模块成员导出。
// mathUtils.js
// 命名导出
export function add(x, y) {
return x + y;
}
export function subtract(x, y) {
return x - y;
}
// 默认导出
export default function multiply(x, y) {
return x * y;
}
在这个文件中,我们定义了三个函数:add
、subtract
和 multiply
。其中,add
和 subtract
是通过命名导出的方式导出的,而 multiply
是作为默认导出的。
app.js
这个文件是我们的主应用文件,它导入并使用 mathUtils.js
中定义的函数。
// app.js
// 导入命名导出的函数
import { add, subtract } from './mathUtils.js';
// 导入默认导出的函数
import multiply from './mathUtils.js';
// 使用导入的函数
console.log("Addition: ", add(5, 3)); // 输出 8
console.log("Subtraction: ", subtract(5, 3)); // 输出 2
console.log("Multiplication: ", multiply(5, 3)); // 输出 15
在 app.js
中,我们首先使用命名导入的方式来导入 add
和 subtract
函数。然后,我们使用默认导入的方式来导入 multiply
函数。接着,我们调用这些函数并打印结果。
使用动态导入
如果我们只在某些条件下需要 mathUtils.js
,我们可以使用动态导入:
// 动态导入示例
if (needMathFunctions) {
import('./mathUtils.js')
.then(mathUtils => {
console.log(mathUtils.add(5, 3));
})
.catch(error => {
console.error("Failed to load mathUtils module", error);
});
}
在这个例子中,mathUtils.js
模块只有在 needMathFunctions
为真时才会被导入。
这就是在实际项目中如何使用 ECMAScript Modules 的一个简单例子。通过这种方式,你可以将你的代码组织成高度模块化和可重用的结构。