我一直试图在nodejs中导入以打字稿编写的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');
Util.js
function log(msg) {
console.log(msg)
}
module.exports= { log}
index.ts
log('hello')
错误:
TypeError: log is not a function
答案 0 :(得分:0)
似乎您希望将ESM与Node和TS结合使用。
在我回答您的问题时要进行更新的设置是:
在tsconfig.json文件上,确保具有以下设置:
{
"compilerOptions": {
"lib": ["es2020"],
"module": "ESNext",
"moduleResolution": "node",
"target": "ES2020",
"esModuleInterop": true,
...
},
...
}
请确保您的package.json
文件具有以下属性。
{
...
"type":"module",
...
}
别忘了您不能直接在NodeJS中导入TS文件,您需要先使用tsc
对其进行转换,然后在运行时将其导入NodeJS中,因此最终您将要导入js而不是ts文件。要将其作为TS运行,请确保阅读答案的下一部分。
另外,在运行它时,请确保使用标志--experimental-specifier-resolution=node
,因为它将使您具有TypeScript中没有扩展名的导入:
node --experimental-specifier-resolution=node index.js
有关该标志的更多详细信息,请阅读https://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm
TS Node是一个运行时编译器,因此使用Node时可以在运行时导入打字稿文件。
当前,TS节点中有一项实验功能,允许您使用ESM运行它,要使用它,您需要安装TS节点9.1+。 有关实施和可能出现的问题的更多详细信息,请检查:https://github.com/TypeStrong/ts-node/issues/1007
要安装它,您将需要运行:
npm i -D ts-node
要运行支持新解析模式和TSNode加载器的服务,您将需要运行:
node --experimental-specifier-resolution=node --loader ts-node/esm index.ts
此后,您将可以在运行时在项目中使用TS和ESM,并且可以执行以下语句:
import {log} from './Util'
其中日志是Util.ts的导出成员
重要!我不建议在生产环境中使用ts-node,因此这对于开发环境非常方便且有用,但请确保在生产环境中进行转换和使用生成的代码,以避免可能TS节点的内存问题。