我有一个结构如下的项目:
┌ 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
生成导入。我想念什么或做错什么了?
答案 0 :(得分:3)
我不久前就遇到了这个问题。有趣的是,打字稿将理解路径映射,但将它们保留在已编译的javascript by design 中。
编译器不会重写模块名称。模块名称被视为资源标识符,并按照它们在源代码中出现的方式映射到输出中
您编写的模块名称不会在输出中更改。 “ paths”和“ baseURL”在那里告诉编译器它们在运行时的位置。 https://github.com/Microsoft/TypeScript/issues/9910#issuecomment-234729007
有几种解决方法。
您可以使用ts-node而不是node来运行您的项目。
专家:
缺点:
或者,您可以使用typescript transformers来使编译器输出正确的javascript文件(例如@zerollup/ts-transform-paths和ttypescript)。
专家:
ttsc --watch
。注意:使用
--watch
时,我已经测试了此设置及其比使用任何工具都要快的速度。
缺点:
最后,您可以使用一个工具来为您生成的javascript(ts-module-alias,module-alias,ef-tspm)中的路径进行修复。
专家:
缺点:
我最终使用ef-tspm来修复文件,尽管我对构建时间并不完全满意,但它通常可以正常工作,并且可能值得探讨一下转换器和ttypescript。如果有帮助,我创建了一个typescript / node project with path aliases set-up。