TypeScript 路径映射“找不到模块 a-mapped/a”

Posted

技术标签:

【中文标题】TypeScript 路径映射“找不到模块 a-mapped/a”【英文标题】:TypeScript path mapping "Cannot find module a-mapped/a" 【发布时间】:2019-03-31 13:29:25 【问题描述】:

我有一个具有以下结构的项目:

┌ 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】:

不久前我自己也遇到过这个问题。有趣的是,typescript 会理解路径映射,但在编译后的 javascript by design 中保持原样。

编译器不会重写模块名称。模块名称被视为资源标识符,并在源中出现时映射到输出

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

有几种方法可以解决这个问题。

ts 节点

您可以使用 ts-node 代替 node 来运行您的项目。

优点

易于使用,轻松无忧。

缺点

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

变压器

您也可以使用typescript transformers 使编译器输出正确的javascript 文件(例如@zerollup/ts-transform-paths 和ttypescript)。

优点

更快的编译时间,您可以可靠地使用ttsc --watch

注意:我已经测试过这个设置,在使用--watch 时,它比使用任何工具都快得多。

缺点

至少现在,您需要使用像 ttypescript 这样的 typescript 包装器。 设置起来有点困难。

工具

最后,您可以使用一个工具来修复您生成的 javascript 中的路径(ts-module-alias、module-alias、ef-tspm)。

优点

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

缺点

可能会导致编译时间变慢。 手表操作更难设置。

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

【讨论】:

感谢您的回答,您回答了我的duplicate question?。一个问题,在这一点上:如果 TS Path Mapping 没有做我们自然期望它做的事情,它有什么用,预期用途是什么?我正在阅读its documentation,但我仍然感到困惑:如果 TSC 没有重写,你什么时候使用它?! 很遗憾 ef-tspm 不适用于 esnext 模块。

以上是关于TypeScript 路径映射“找不到模块 a-mapped/a”的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 路径映射“找不到模块 a-mapped/a”

VS Code TypeScript Jest 模块映射

打字稿路径映射未在节点应用程序中翻译

使用打字稿路径映射时反应本机加载模块错误

Typescript visual Studio项目属性

typescript Typescript预定义的映射类型