我想用Node.js建立项目&打印稿,ts-node,编译成ESM模块
NPM中的一些库在其最新版本中需要ESM。这就是为什么我需要把Typescript代码编译成使用ESM而不是CommonJS的Javascript代码。
但是当我运行index.js
时,我仍然得到错误:
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for SomeClass.ts
代码如下:
index.js
import TsNode from "ts-node";
//
const tsNodeService = TsNode.register({
transpileOnly: false
});
TsNode.createEsmHooks(tsNodeService); //tried with & without that line
//
(async () => {
const SomeClass = await import("./SomeClass.ts");
console.log(new SomeClass().method("abc", 123));
})();
// alternatively tried also:
/*
import SomeClass from "./SomeClass.ts";
console.log(new SomeClass().method("abc", 123));
*/
SomeClass.ts
export default class SomeClass {
method(a: string, b: number) {
return `${a} and ${b}`;
}
}
tsconfig.json
{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"baseUrl": "./",
"outDir": "./output/",
"module": "Node16",
"target": "ES2022",
"strict": true,
"strictPropertyInitialization": false,
"esModuleInterop": true,
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": true,
"pretty": true,
"experimentalDecorators": true,
"allowJs": true,
"resolveJsonModule": true
},
"exclude": [
"node_modules/**/*"
]
}
package.json
{
"name": "testesmts",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"type": "module",
"license": "ISC",
"dependencies": {
"ts-node": "^10.9.1",
"typescript": "^4.9.3"
}
}
我也遇到过类似的问题。但是我用ts-import
解决了。
https://www.npmjs.com/package/ts-import
另一个解决方案在代码下面。这个代码更简单。TsNode.register()
允许导入ts文件。
#!/usr/bin/env node
const TsNode = require('ts-node')
const path = require('path')
const tsNodeService = TsNode.register({
transpileOnly: false
});
TsNode.createEsmHooks(tsNodeService);
(async () => {
require(path.resolve(__dirname, 'src/index.ts'));
})();