更新:因为这个答案得到了重要的关注,所以我对其进行了更新,以更好地展示 2022 年该问题的可用解决方案。
该错误意味着 Node 发现了一个import
在文件中声明它不考虑 ECMAScript (ES) 模块。Adding "type": "module" to package.json会告诉 Node 你正在使用 ES 模块,但是你需要通过设置告诉 TypeScript 编译器发出这种类型的模块"module": "es2015"
或更高(例如:"es2020"
) in tsconfig.json
。如果你想发出 CommonJS 模块(require
), set "module": "commonjs"
.
如果您不想在项目级别设置模块系统,还有更细粒度的选项。文件与.mjs
扩展名始终被视为 ES 模块,而带有.cjs
始终被视为 CommonJS 模块。从 TypeScript 4.5 开始,可以使用.mts
and .cts
扩展以及让编译器发出.mjs
or .cjs
文件,分别。
这两个系统部分兼容。例如,可以使用默认导出将 CommonJS 模块导入到 ES 模块中:
// in an ES module
import thing from "./main.cjs";
另一种方式。 ES 模块可以通过动态导入导入到 CommonJS 模块中(需要 ES2020 功能才能工作):
// in a CommonJS module
const thing = await import("./main.mjs");
原始答案(2020):
Adding "type": "module"
to package.json
会告诉 Node 你正在使用 ES2015 模块,这应该会消除错误,但是你需要告诉 Typescript 通过设置来生成这种类型的模块"module": "es2015"
代替"commonjs"
in tsconfig.json
.
然而,这会导致当前代码出现问题,因为尽管您使用的是 ES6import {}
您使用 commonJS 导出的语句module.exports = {}
语法,Node 的 ES 模块加载器会遇到问题。有两种方法可以处理:
- 保留 module.exports,但通过给它一个 .cjs 扩展名来告诉 Node 将此文件解释为 commonJS。
- 将导出语句更改为ES2015语法:
export function execute(…)..
第一个选项可能会有点棘手,因为编译器将输出 .js 文件,而您必须始终将其更改为 .cjs (据我所知)。使用第二个选项,您应该能够使用 Node 运行该文件(包括版本
如果您绝对需要使用 commonJS,也许最好安装 Node 的类型定义:@types/node
并将导入更改为 commonJS 格式:require('abc')
并保持其余设置不变(尽管您可以添加"type": "commonjs"
到 package.json 来明确)。