gpt4 book ai didi

javascript - 无法在 Node 中导入 ESM .ts 模块

转载 作者:行者123 更新时间:2023-12-05 00:25:14 25 4
gpt4 key购买 nike

我一直在尝试在 nodejs 中导入一个用 typescript 编写的 ESM 模块。但我收到以下错误:

An import path cannot end with a '.ts' extension.
实用程序
 export class Util {
constructor ( ) {

}
log(msg) {
console.log(msg)
}
}
index.ts
import {log} from './Util.ts'
log(task.query.criteria, payload.parameters)
我还添加了 "type":"module"里面 package.json 我将 .ts 更改为 .js 只是为了看看它是否有效,然后我得到:
Object.defineProperty(exports, "__esModule", { value: true });                         ^

ReferenceError: exports is not defined
at file:///C:/Users/abc/NestJsPOC/NestPOC/dist/main.js:2:23
tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "es2017",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"incremental": true
}
}
编辑
我也试过:
 var log = require('../utility/util.js');
实用程序.js
    function log(msg) {
console.log(msg)

}
module.exports= { log}
index.ts
    log('hello')
错误 :
TypeError: log is not a function

最佳答案

我已经创建了一个带有必要设置的存储库,可以通过 ts-node 或使用 tsc 将 esm 直接运行到 Node 中,并使用 NodeJS 运行转译的 esm 文件。 https://github.com/felipeplets/esm-examples
请记住,您需要使用 ts Node 10+ NodeJS 12+ 为了使用下面的设置。
您似乎希望将 ESM 与 Node 和 TS 一起使用。
在我回答您的问题时(于 29.05.2022 更新)的更新设置是:
tsconfig.json (TypeScript 4.7.2)
在您的 tsconfig.json 文件中确保具有以下设置:

{
"compilerOptions": {
"lib": ["ES2022"], // ES2020 in earlier versions
"module": "ES2022", //ESNext
"moduleResolution": "Node",
"target": "ES2022", // ES2020 in earlier versions
"esModuleInterop": true,
...
},
...
}

包.json
确保您的 package.json 上具有以下属性文件。
{ 
...
"type":"module",
...
}
使用转译文件运行它
不要忘记在 NodeJS 中不能直接导入 TS 文件,需要先使用 tsc 进行转译。然后在运行时将它导入NodeJS,所以最后你将导入js而不是ts文件。要将其作为 TS 运行,请务必阅读我的答案的下一部分。
此外,在运行它时,请确保使用标志 --experimental-specifier-resolution=node因为它将使您能够像在 TypeScript 中那样进行没有扩展的导入:
node --experimental-specifier-resolution=node index
有关标志的更多详细信息,请阅读 https://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm
使用 ts-node 运行它
TS Node 是一个运行时转译器​​,因此它允许您在使用 node 时在运行时导入 typescript 文件。
TS Node 中有一个功能允许您使用 ESM 运行它,要使用它,您需要安装 TS Node 9.1+。
有关实现和可能出现的问题的更多详细信息,请查看: https://github.com/TypeStrong/ts-node/issues/1007
要安装它,您需要运行:
npm i -D ts-node 
要运行支持新分辨率模式的服务和 TSNode 加载器,您需要运行:
ts Node 10.8+
您可以添加 esmexperimentalSpecifierResolution在您的 tsconfig 文件中。
{
...
"ts-node": {
"esm": true,
"experimentalSpecifierResolution": true
}
}
然后你只需要运行
ts-node index
或者,您可以设置 ts-node --esmts-node-esm在不设置 tsconfig.json 的情况下实现相同的效果文件。
ts-node 高达 10.6
node --experimental-specifier-resolution=node --loader ts-node/esm index.ts
在此之后,您将能够在运行时在您的项目中使用 TS 和 ESM,并且可以使用以下语句:
import { log } from './Util'
其中 log 是从 Util.ts 导出的成员
重要的! 我不建议在生产环境中使用 ts-node,因此这对于开发环境非常方便和有用,但请确保在生产环境中转译和使用生成的代码,以避免 TS Node 可能出现的内存问题。

关于javascript - 无法在 Node 中导入 ESM .ts 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63742790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com