在TypeScript编译(ES6模块)期间,在相对导入语句上附加.js扩展名。

15 浏览
0 Comments

在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. (internal/modules/esm/module_job.js:50:40)

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扩展名。

0