【发布时间】:2020-10-18 11:46:44
【问题描述】:
这似乎是一个微不足道的问题,但解决这个问题需要使用哪些设置/配置并不是很明显。
这里是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]: Cannot find module 'HelloWorld' imported from HelloWorld\index.js
Did you mean to import ../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.<anonymous> (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 语句中没有 .js 扩展名(import {HelloWorld} from "./HelloWorld";)。 Typescript 在编译期间没有抛出任何错误。但是,在运行时 Node (v14.4.0) 需要 .js 扩展。
希望上下文清楚。
现在,如何更改编译器输出设置(tsconfig.json 或任何标志),以便在 index.js 文件中的 Typescript 到 Javascript 编译期间,本地相对路径导入(例如 import {HelloWorld} from ./Helloworld;)将被 import {HelloWorld} from ./Helloworld.js; 替换?
注意:
It is possible to directly use the .js extension while importing inside typescript file. However, it doesn't help much while working with hundreds of old typescript modules, because then we have to go back and manually add .js extension. Rather than that for us better solution is to batch rename and remove all the .js extension from all the generated .js filenames at last.
【问题讨论】:
-
只要
import {HelloWorld} from "./HelloWorld.js";TypeScript 足够聪明,可以在编译过程中找出你想要的是HelloWorld.ts。 -
TS 不会重写导入路径。 TS团队一直坚持这一点。编写在运行时有效的路径,并在需要时配置 ts 以使这些路径有效。 (在这种情况下不需要配置)
-
@SonNguyen 作者已经知道这种解决方法,但它并没有帮助,因为这个问题源于一个旧项目,需要管理数百个文件和数百或数千个导入语句。如果您必须使用它,我们已经在使用比这更好的解决方法。
-
@TitianCernicova-Dragomir 是的,这对 TS 团队来说肯定是傲慢或自负,而且相当粗鲁。这是一项微不足道的任务,当然这个小功能对大多数开发人员都有帮助。至少在我们的例子中,如果编译器可以从生成的“.js”文件名本身中删除“.js”扩展名,这个问题会得到更好的解决。这就是我们目前正在做的——最后只是从所有 js 文件中删除扩展名,并留给服务器以正确的 MIME 类型提供服务。
-
@user3330840 这与傲慢无关,而是与设计原则有关。如果您在 typescript 中粘贴一段 Javascript,则两个版本之间应该没有运行时差异。当您开始重写路径时,您开始在两者之间产生差异。但我确实感到沮丧,这是很多人在关于这个主题的多个 github 问题上分享的。
标签: javascript node.js typescript npm node-modules