TypeScript 4.7源Map文件扩展名不匹配

8ehkhllq  于 4个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(52)

Bug报告

🔎 搜索词

source map, extension

🕗 版本与回归信息

TypeScript 4.7.2

⏯ Playground链接

不是Playground链接,但重现问题的方法在这里:https://github.com/unional/tersify/tree/webpack
要重现这个问题,运行yarn bundle并在浏览器中打开demo.html

你可以看到source-map-loader能够获取到unpartial/ts/index.ts文件,但是无法获取它引用的文件(./required.js, ./unpartial.js)。
这是因为这些文件实际上是在TS中的。也就是说,它们是required.tsunpartial.ts
我不确定这是TypeScript 4.7的bug还是需要更新source-map-loader来支持这个功能。
但是考虑到在TypeScript 4.7之前以及JS本身的情况下,它应该是可以正常工作的,
所以很可能是由TypeScript 4.7生成的sourcemap需要一些调整。

💻 代码

被引用的代码unpartial在这里:https://github.com/unional/unpartial
它是用sourceMap: true构建的,位于tsconfig.json中。
由于这与代码的构建和消费方式有关,我没有一个最小重现问题的示例。
但是我选择演示的库足够简单,应该足够简单。

🙁 实际行为

无法使用TypeScript库生成的sourcemap进行消耗

🙂 预期行为

应该可以正常工作,就像在这个分支中展示的那样:https://github.com/unional/tersify/tree/webpack-old

ippsafx7

ippsafx71#

这似乎是TypeScript不为您重写源文件扩展名的另一个意外后果。#49083正在要求改变这种行为。

f2uvfpb9

f2uvfpb92#

@unional ,你提到的上述分支(https://github.com/unional/tersify/tree/webpack)似乎不可用,因为当我尝试访问该链接时,我得到了404错误,所以我对上下文不是100%清楚。

这是一个长期存在的TypeScript行为。我们不会重写你在importexport声明中使用的扩展名,所以如果你的模块引用使用了.js扩展名,我们会原样发出。我们还不允许具有.ts扩展名的模块引用,因为那在运行时将不是正确的扩展名。

你确定这与TS 4.7有关吗?从我所了解的情况来看,你最近也在两周前将模块引用从不带扩展名的形式更改为包括.js扩展名(根据unional/unpartial@c77f694)。

yuvru6vn

yuvru6vn3#

嗨,我已经恢复了分支。
是的,这与TS 4.7有关,而且确实与.js扩展有关。
在TS 4.7中,为了支持moduleReolution: NodeNext,需要将.js扩展添加到导入路径中,这似乎破坏了源Map。
这很可能是由于源Map引用了实际文件路径(.ts)而不是输出文件路径(.js)。

xam8gpfp

xam8gpfp4#

源Map应该引用源文件路径:https://sourcemaps.info/spec.html#h.mofvlxcwqzej。如果存在 "file" 条目(如果有),则引用生成的输出,但 "sources" 数组应始终引用原始源文件路径。

我不清楚您在这里所说的问题是什么。source-map-loader 可能不理解 TypeScript 的行为。我不认为这仅限于 4.7,因为我们多年来一直支持附加 .js 扩展名的能力,尽管这可能是导致您在项目中切换到使用 .js 扩展名的原因。

tpgth1q7

tpgth1q75#

我不清楚你在这里说的哪里出了问题。
请按照上述步骤和描述操作:

To repro it, run yarn bundle and open the demo.html in browser.

You can see that the source-map-loader able to get the unpartial/ts/index.ts file, but not the files it referenced (./required.js, ./unpartial.js).

总之,TypeScript生成的源Map在某些情况下可以正常工作,而在其他情况下则无法正常工作。
TypeScript将代码编译成JavaScript,并将其与源Map一起分发。
当使用TypeScript编写的包时,源Map应该可以正常工作。编写它时使用的是TypeScript这一点应该不重要。

相关问题