在TypeScript编译(ES6模块)期间,在相对导入语句上附加.js扩展名。
在TypeScript编译(ES6模块)期间,在相对导入语句上附加.js扩展名。
这似乎是一个琐碎的问题,但并不明显需要使用什么设置/配置来解决这个问题。
以下是Hello World程序的目录结构和源代码:
目录结构:
| -- HelloWorldProgram
| -- HelloWorld.ts
| -- index.ts
| -- package.json
| -- tsconfig.json
index.ts:
import {HelloWorld} from "./HelloWorld";
let world = new HelloWorld();
HelloWorld.ts:
export class HelloWorld {
constructor(){
console.log("Hello World!");
}
}
package.json:
{
"type": "module",
"scripts": {
"start": "tsc && node index.js"
}
}
现在,执行命令tsc && node index.js会导致以下错误:
internal/modules/run_main.js:54
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_MODULE_NOT_FOUND]: 在HelloWorld\index.js中找不到模块'HelloWorld'
你是不是要导入../HelloWorld.js?
at finalizeResolution (internal/modules/esm/resolve.js:284:11)
at moduleResolve (internal/modules/esm/resolve.js:662:10)
at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:752:11)
at Loader.resolve (internal/modules/esm/loader.js:97:40)
at Loader.getModuleJob (internal/modules/esm/loader.js:242:28)
at ModuleWrap.
at link (internal/modules/esm/module_job.js:49:36) {
code: 'ERR_MODULE_NOT_FOUND'
}
很明显,问题似乎源自于在index.ts TypeScript文件中的导入语句(import {HelloWorld} from "./HelloWorld";)中没有.js扩展名。在编译过程中,TypeScript没有抛出任何错误。然而,在运行时,Node(v14.4.0)需要.js扩展名。
希望上下文清楚。
现在,如何更改编译器输出设置(tsconfig.json或任何标志),以便在TypeScript到JavaScript编译过程中,像import {HelloWorld} from ./Helloworld;这样的本地相对路径导入将被替换为import {HelloWorld} from ./Helloworld.js;在index.js文件中?
注意:
在TypeScript文件中直接使用.js扩展名是可能的。但是,当使用数百个旧TypeScript模块时,这并没有太大帮助,因为我们必须返回并手动添加.js扩展名。相比之下,对我们来说更好的解决方案是在最后批量重命名并删除所有生成的.js文件名的.js扩展名。