ECMAScript (简称 ES)模块化 JavaScript 代码以供重用的官方标准格式,它使用 import 和 export 语句定义模块:
// 模块导入示例
import myFunc from './my-func';
// 模块导出示例
export myOtherFunc(param) {
const result = myFunc(param);
// ....
return otherResult;
}
Node.js 于 13.2.0 内置支持 ES 模块,在本文中,我们将学习如何在 Node.js 中启用及使用 ES 模块。
默认情况下,Node.js 将 JavaScript 代码视为 CommonJS 模块,可通过以下方式启用 ECMAScript 模块:
.mjs
package.json
中添加 { "type": "module" }
node --input-type=module --eval "<module-code>"
,将模块的代码作为字符串传递 STDIN本文主要介绍文件扩展名(.mjs
)和文件配置( {"type": "module"}
)这两种方式。
使用 .mjs
文件扩展名告诉 Node.js 以 ECMAScript 格式对待模块的一种简单方法。
以下 ES 模块 month-from-date.mjs
(请注意.mjs文件扩展名)导出一个函数 monthFromDate()
,该函数返回任意日期的所属月份:
// month-from-date.mjs (ES Module)
const MONTHS = ['January', 'February', 'March','April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'];
export function monthFromDate(date) {
if (!(date instanceof Date)) {
date = new Date(date);
}
return MONTHS[date.getMonth()];
}
另一个模块 month.mjs 使用 ES 模块的 import 语法导入 monthFromDate()
函数,此模块还作为CLI脚本运行,并打印作为参数传递的日期字符串的月份名称:
// month.mjs (ES Module)
import { monthFromDate } from './month-from-date.mjs';
const dateString = process.argv[2] ?? null;
console.log(monthFromDate(dateString));
让我们 month.mjs 在命令行中运行模块:
node ./month.mjs "2021-04-28"
控制台将会输出 April。
{ type:"module"}
默认情况下,Node.js 将文件扩展名为 .js
的代码视为 CommonJS 模块,为了使 .js文件作为 ES 模块只需设置 package.json
中的 type
属性为module
:
{
"name": "my-app",
"version": "1.0.0",
"type": "module",
// ...
}
现在,让我们修改 month-from-date.mjs
和 month.mjs
的文件扩展名为 .js
,在 package.json
添加 type
属性并设置为 module
,再来运行以上代码:
node ./month.js "2021-04-28"
控制台仍将正常输出 April。
总体来说,ES 模块和 CommonJS 的使用差异不大,但也有一些小问题需要我们注意,在 ECMAScript 模块作用域内,不可使用 CommonJS 中的特定变量,例如:
require()
exports
module.exports
__dirname
__filename
但是,我们可以 import.meta.url
用来确定当前模块的绝对路径:
// An ES module at path "/usr/opt/module.mjs"
console.log(import.meta.url); // "file:///usr/opt/module.mjs"
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8