【问题标题】:running node with loader ts-node/esm.js requires imports to have the .js extension使用加载器 ts-node/esm.js 运行节点需要导入具有 .js 扩展名
【发布时间】:2020-12-27 15:33:54
【问题描述】:

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

"type": "module",

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

 node --loader ts-node/esm.mjs --experimental-top-level-await ./src/scripts/ts-build.ts --trace-warnings --experimental-json-modules

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

import { logger } from './logger';

我明白了

ERR_MODULE_NOT_FOUND

但是如果我把它改成

import { logger } from './logger.js';

有效。

这是为什么?

【问题讨论】:

    标签: javascript node.js typescript es6-modules


    【解决方案1】:

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

    node --loader ts-node/esm --experimental-specifier-resolution=node your/entry.ts
    

    但是,如果您只希望命令 nodets-nodewebpack serve 使用带有 import 语句的 typescript 条目文件(例如 server.ts 或 webpack.config.ts),您可以通过设置来解决问题compilerOptions 在您的 tsconfig.ts 中的 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"
        ]
    }
    

    【讨论】:

      【解决方案2】:

      如果我们看一下规范,this section 指出:

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

      还有另一个section 声明:

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

      所以看起来扩展实际上是必要的。但是,您尝试将 option --experimental-specifier-resolution 设置为 --experimental-specifier-resolution=node

      【讨论】:

        猜你喜欢
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 2022-11-04
        • 2022-11-04
        • 2020-04-03
        相关资源
        最近更新 更多