TypeScript路径映射“无法找到映射的模块a /”

时间:2018-10-26 18:42:42

标签: typescript typescript3.0

我有一个结构如下的项目:

┌ tsconfig.json
│ {
│   "compilerOptions": {
│     "baseUrl": ".",
│     "paths": { "a-mapped/*": ["a/*"] }
│   }
│ }
│
├ a
│ └─ a.ts
│    export const a = 1;
└ b
  └─ b.ts
     import { a } from "a-mapped/a";
     export const b = a + 1;

当我运行tsc时,生成的b.js包含:

var a_1 = require("a-mapped/a");
exports.b = a_1.a + 1;

如果尝试使用node运行它,则会收到错误“找不到模块a-mapped/a”。

我希望tsc../a/a而非a-mapped/a生成导入。我想念什么或做错什么了?

1 个答案:

答案 0 :(得分:3)

我不久前就遇到了这个问题。有趣的是,打字稿将理解路径映射,但将它们保留在已编译的javascript by design 中。

  

编译器不会重写模块名称。模块名称被视为资源标识符,并按照它们在源代码中出现的方式映射到输出中

     

您编写的模块名称不会在输出中更改。 “ paths”和“ baseURL”在那里告诉编译器它们在运行时的位置。   https://github.com/Microsoft/TypeScript/issues/9910#issuecomment-234729007

有几种解决方法。

ts-node

您可以使用ts-node而不是node来运行您的项目。

专家

  • 易于使用,没有麻烦。

缺点

  • 您可能无法执行此操作,例如,如果您正在编写浏览器代码,库或无法控制运行时环境。
  • 性能可能是个问题,尤其是启动时间。

变形金刚

或者,您可以使用typescript transformers来使编译器输出正确的javascript文件(例如@zerollup/ts-transform-pathsttypescript)。

专家

  • 编译速度更快,您可以可靠地使用ttsc --watch
  

注意:使用--watch时,我已经测试了此设置及其比使用任何工具都要快的速度。

缺点

  • 至少到目前为止,您需要使用像ttypescript这样的打字稿包装器。
  • 设置起来有些困难。

工具

最后,您可以使用一个工具来为您生成的javascript(ts-module-aliasmodule-aliasef-tspm)中的路径进行修复。

专家

  • 使用纯净的打字稿。
  • 易于设置(编译后只需运行该工具即可!)

缺点

  • 可能会导致编译时间变慢。
  • 观看操作更难设置。

我最终使用ef-tspm来修复文件,尽管我对构建时间并不完全满意,但它通常可以正常工作,并且可能值得探讨一下转换器和ttypescript。如果有帮助,我创建了一个typescript / node project with path aliases set-up