在JS中导入模块时,我试图使用绝对路径,不幸的是,tsc
未能正确解决路径问题,返回错误:
未解析模块名称"test2"。
我有以下文件结构
project
│
└───tsconfig.json
└───js
│ └───another
│ │ └───child
│ │ │ test1.js
│ │
│ └───some
│ │ test2.js
这是test1.js
代码:
import { sayHi } from "test2";
sayHi("John");
这是test2.js
代码:
function sayHi(user) {
alert(`Hello, ${user}!`);
}
export { sayHi };
这是我的tsconfig.json
:
{
"compilerOptions": {
"noEmit": true,
"allowJs": true
},
"include": [
"js/**/*"
],
"exclude": []
}
当我运行tsc --traceResolution
时,通过CLI命令,我得到以下内容:
╰─ tsc --traceResolution
======== Resolving module 'test2' from '/Users/Sites/LocalTests/js/another/child/test1.js'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'test2' from 'node_modules' folder, target file type 'TypeScript'.
Directory '/Users/Sites/LocalTests/js/another/child/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/Sites/LocalTests/js/another/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/Sites/LocalTests/js/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/Sites/LocalTests/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/Sites/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
Loading module 'test2' from 'node_modules' folder, target file type 'JavaScript'.
Directory '/Users/Sites/LocalTests/js/another/child/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/Sites/LocalTests/js/another/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/Sites/LocalTests/js/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/Sites/LocalTests/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/Sites/node_modules' does not exist, skipping all lookups in it.
Directory '/Users/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
======== Module name 'test2' was not resolved. ========
我如何设置它,使它不仅在目录中搜索,而且在同级目录中搜索。查看返回的跟踪,它看起来从未查看过/some
目录,因此从未找到test2.js
。
看看其他帖子,我似乎可以在tsconfig.json
的paths:
部分添加/some
的路径,但这意味着我必须手动添加每一个路径,这没有意义,因为我计划在这个项目中使用多个目录。
如果你想知道,我计划在VScode上使用这个tsconfig.json
文件,让它找到绝对路径,并允许它的"转到定义"功能正常工作。
这不应该起作用。当您导入"test2"
时,TypeScript编译器无法知道在哪里可以找到您的文件。
此外,"test2"
是一个文件名,而不是一个绝对路径。要使其成为一个绝对路径,它需要从硬盘驱动器根目录开始的路径,这显然是一种糟糕的做法,因为这会使代码具体取决于文件在机器上的存储位置。
TypeScript编译器查找导入的方式是:
- 如果是相对路径,请按照它
- 如果没有,请在
node_modules
中搜索 - 如果没有,请在父文件夹的
node_modules
中搜索 - 继续这样做,直到找到为止
所以你需要你的文件有一个相对路径,或者你需要它是一个npm
模块。
一个可能对您有所帮助的功能是路径映射,它允许您为TypeScript定义要查找的自定义路径,您可以在这种情况下使用它。
例如:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"test2": ["some/test2.js"], // This mapping is relative to "baseUrl"
"some/*": ["some/*"] // You could use this to then import "some/test2"
}
}
}
您必须将其添加到tsconfig.json 中
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"src/*": [
"./src/*"
],
}
}
}