使用加载器 ts-node/esm.js 运行节点需要导入具有 .js 扩展名

dag*_*da1 9 javascript node.js typescript es6-modules

我正在尝试将我的 package.json 设置为模块来运行节点 14:

"type": "module",
Run Code Online (Sandbox Code Playgroud)

如果我在打字稿文件上运行此命令:

 node --loader ts-node/esm.mjs --experimental-top-level-await ./src/scripts/ts-build.ts --trace-warnings --experimental-json-modules
Run Code Online (Sandbox Code Playgroud)

我在打字稿文件中有这样的无扩展导入

import { logger } from './logger';
Run Code Online (Sandbox Code Playgroud)

我明白了

ERR_MODULE_NOT_FOUND

但如果我把它改成

import { logger } from './logger.js';
Run Code Online (Sandbox Code Playgroud)

有用。

为什么是这样?

Cha*_*ark 10

我通过 Node 上的这些实验性功能解决了这个问题v14.15.0

node --loader ts-node/esm --experimental-specifier-resolution=node your/entry.ts
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想使用 command nodets-node或者webpack serve使用带有 import 语句的打字稿条目文件(例如 server.ts 或 webpack.config.ts),您可以通过在 tsconfig.ts 中的选项compilerOptions下设置来解决问题。ts-node

{
    "ts-node": {
        "compilerOptions": {
            "module": "CommonJS"
        }
    },
    "compilerOptions": {
        "target": "ES6",
        "module": "ES6",
        "moduleResolution": "Node",
        "esModuleInterop": true
    },
    "include": [
        // below entries are just examples
        "src/**/*",
        "server.ts"
        "webpack.config.ts"
    ]
}
Run Code Online (Sandbox Code Playgroud)


eol*_*eol 1

如果我们看一下规范,有这一部分指出:

当前说明符解析不支持 CommonJS 加载器的所有默认行为。行为差异之一是文件扩展名的自动解析以及导入具有索引文件的目录的能力。

还有另一指出:

使用 import 关键字时必须提供文件扩展名。目录索引(例如“./startup/index.js”)也必须完全指定。

如此看来,延期其实是有必要的。但是,您可以尝试将选项 设置为。--experimental-specifier-resolution--experimental-specifier-resolution=node