这是一个名为“作用域包”的NPM技术。这里是官方文档:
作用域类似于npm模块的命名空间。如果软件包的名称以@开头,则它是一个作用域包。范围是@和斜杠之间的所有内容。
所有作用域包都存储在以@开头的文件夹中。例如,所有Angular软件包都存储在node_modules中的@angular文件夹中,而如果没有@作用域标识符并且您使用了angular/core和angular/compiler,则每个软件包都会有一个单独的文件夹。同样适用于@types软件包。
TypeScript导入语句如何识别或与“@”集成?
由node使用的require函数可以遍历node_modules文件夹,如果您在路径中使用正斜杠,则不限于作用域包。
node_modules
a
b
index.js
module.exports = 3;
m.js
console.log(require('a/b')); // logs 3
Typescript编译器在幕后使用Node的statSync
函数来检查文件夹:
function fileSystemEntryExists(path, entryKind) {
try {
var stat = _fs.statSync(path);
switch (entryKind) {
case 0 : return stat.isFile();
case 1 : return stat.isDirectory();
}
}
catch (e) {
return false;
}
}
当然,该函数将斜杠视为路径分隔符。在解析路径时,TypeScript编译器会在路径前面添加node_modules
,如果NODE模块解析策略被设置。