这是一个可克隆项目,其中包含我的问题的最少代码:GitHub / ronjouch / demo-ts-project-references。
\n在此项目中,我正在设置一个基于TS Project References的项目,以便子项目app依赖于复合子项目lib。
通过这个设置,在内部app/index.js,我能够
import { LETTER_A } from \'../lib\';\nRun Code Online (Sandbox Code Playgroud)\n有了这个设置,好消息,
\nnpm run compile(调用tsc -b lib app)成功构建。npm start(调用node dist/app/index.js)成功运行。现在,我注意到(感谢 VSCode)如果我lib使用非相对导入进行导入,TSC 也会很高兴:
import { LETTER_A } from \'lib\';\n// no "../" here ^\nRun Code Online (Sandbox Code Playgroud)\n,我更喜欢并且想要,因为在真正的应用程序中,从深度嵌套的文件中进行这样的导入是非常方便的,而不是
\nimport { LETTER_A } from \'../../../../lib\';\n// AAaaaAaAAaaargh :( ^^^^^^^^^^^^\nRun Code Online (Sandbox Code Playgroud)\n然而,尽管 TSServer 很高兴并且 TSC 成功编译并输出了以下出色的tsc --traceResolution输出......
======== Resolving module \'lib\' from \'/home/ronjouch/demo-ts-proj/app/index.ts\'. ========\nExplicitly specified module resolution kind: \'NodeJs\'.\n\'baseUrl\' option is set to \'/home/ronjouch/demo-ts-proj\', using this value to resolve non-relative module name \'lib\'.\nResolving module name \'lib\' relative to base url \'/home/ronjouch/demo-ts-proj\' - \'/home/ronjouch/demo-ts-proj/lib\'.\nLoading module as file / folder, candidate module location \'/home/ronjouch/demo-ts-proj/lib\', target file type \'TypeScript\'.\nFile \'/home/ronjouch/demo-ts-proj/lib.ts\' does not exist.\nFile \'/home/ronjouch/demo-ts-proj/lib.tsx\' does not exist.\nFile \'/home/ronjouch/demo-ts-proj/lib.d.ts\' does not exist.\nFile \'/home/ronjouch/demo-ts-proj/lib/package.json\' does not exist.\nFile \'/home/ronjouch/demo-ts-proj/lib/index.ts\' exist - use it as a name resolution result.\n======== Module name \'lib\' was successfully resolved to \'/home/ronjouch/demo-ts-proj/lib/index.ts\'. ========\nRun Code Online (Sandbox Code Playgroud)\n...运行时事情进展不顺利,我的程序崩溃了Error: Cannot find module \'lib\',这是合理的,因为生成的 JS 是:
import { LETTER_A } from \'../lib\';\nRun Code Online (Sandbox Code Playgroud)\n,考虑到文件夹结构(其中app和lib是同一级别的兄弟文件夹),这显然是假的!此时,我本希望 TS 能够将我的非相对导入转变为相对导入!
baseUrl,,,,,rootDir但没有成功:生成的JS仍然有问题,并且仍然崩溃rootDirs。paths"paths": { "/*": [ "*" ] }加上将我的\'lib\'导入替换为\'/lib\',这也很好),但没有成功:类似地,/未处理并最终出现在生成的 JS 中,这预计会崩溃。是否可以同时使用路径映射和项目引用?\xe2\x86\x92 有没有办法告诉 TSC 将我的非亲属转为亲属?或者我是否误用了该功能,在这种情况下,为什么 tsc + tsserver 在检查/编译时对它们感到高兴?如果我使用不当,达到我想要的效果的正确方法是什么(项目引用+绝对导入避免../../../../lib地狱)?
谢谢您的帮助!
\n找到了我的问题的答案:我的问题不是关于项目引用,而是关于路径映射功能,我的问题与TypeScript 路径映射“找不到模块 a-mapped/a”相同:我期待一种TSC在设计上并未进行代码修改/生成。
从已关闭的 TypeScript 问题 #9910 中引用 mhegazy - 路径映射应该是相对路径吗?,
编译器不会重写模块名称。模块名称被视为资源标识符,并映射到源中出现的输出
您编写的模块名称不会在输出中更改。“paths”和“baseURL”用于告诉编译器它们在运行时的位置。
TypeScript 路径映射“Cannot find module a-mapped/a”然后提供了解决方案,但我都不喜欢,所以我想我又回到了../../../..相对导入。
| 归档时间: |
|
| 查看次数: |
1037 次 |
| 最近记录: |