“@”符号在@angular或@types中代表什么?

5
我正在尝试理解像下面这样的导入语句中的“@”符号所代表的含义:

Import { Injectable } from@angular/core’;

或者像下面这样使用npm cli命令:

npm -install –save @types/lodash

这些语句或命令对我来说运行良好,我只想了解“@”符号背后发生的事情。

这个“@”是TypeScript功能还是NPM的东西?

指向深入的在线文档的指针将非常有帮助。

2个回答

8
这是一个名为“作用域包”的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 /* File */: return stat.isFile();
            case 1 /* Directory */: return stat.isDirectory();
        }
    }
    catch (e) {
        return false;
    }
}

当然,该函数将斜杠视为路径分隔符。在解析路径时,TypeScript编译器会在路径前面添加node_modules,如果NODE模块解析策略被设置。


感谢您的帮助。TypeScript 的 import 语句是如何识别或与 '@' 集成的? - Allan Xu

3
这是一个名为“作用域包”的NPM功能。
简单来说,这是一种组织功能,允许组织在一个官方标识符下将其所有包分组。如官方文档所述:
“作用域是一种将相关软件包组合在一起的方式,并且还会影响npm处理软件包的几个方面。每个npm用户/组织都有自己的作用域,只有你可以在你的作用域中添加包。这意味着你不必担心有人会在你之前取走你的包名称。因此这也是向组织发出官方软件包信号的好方法。”
NPM处理作用域包的方式有一些小调整,例如,在 "node_modules" 中,为作用域创建一个目录,并将该作用域下的所有软件包存储在该目录中。但在几乎所有情况下,您可以将作用域包视为非作用域包。

1
抱歉偷了你的赞,你的答案非常好。 - Max Koretskyi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接