如何在 Node.js 中使用 ECMAScript 模块

399次阅读  |  发布于3年以前

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 中启用 ES 模块

默认情况下,Node.js 将 JavaScript 代码视为 CommonJS 模块,可通过以下方式启用 ECMAScript 模块:

  1. 设置模块的文件扩展名为 .mjs
  2. package.json 中添加 { "type": "module" }
  3. node --input-type=module --eval "<module-code>",将模块的代码作为字符串传递 STDIN

本文主要介绍文件扩展名(.mjs)和文件配置( {"type": "module"})这两种方式。

.mjs文件扩展

使用 .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。

package.json 中的 { type:"module"}

默认情况下,Node.js 将文件扩展名为 .js 的代码视为 CommonJS 模块,为了使 .js文件作为 ES 模块只需设置 package.json 中的 type 属性为module

{
  "name": "my-app",
  "version": "1.0.0",
  "type": "module",
  // ...
}

现在,让我们修改 month-from-date.mjsmonth.mjs 的文件扩展名为 .js,在 package.json 添加 type 属性并设置为 module,再来运行以上代码:

node ./month.js "2021-04-28"

控制台仍将正常输出 April。

ECMAScript 模块和 Node.js 环境

总体来说,ES 模块和 CommonJS 的使用差异不大,但也有一些小问题需要我们注意,在 ECMAScript 模块作用域内,不可使用 CommonJS 中的特定变量,例如:

但是,我们可以 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