npm 包上的“at”(@) 前缀是什么意思?

IT技术 javascript angular npm
2021-02-06 15:37:05

Angular Component Router 文档中,我偶然发现了一个我以前从未见过的 npm 命令,我不明白发生了什么:

npm install @angular/router --save

是什么意思@angular/router

整个字符串是包名吗?但是当我在npmjs.com上使用搜索时,我没有找到那个包而且命令行搜索确实不返回这样的包:

npm search @angular/router
:No match found for "@angular/router"

那么是@angular/npm 中的某种前缀机制吗?它是如何工作的?

3个回答

这是 NPM 的一个新特性,称为“范围包”,它有效地允许 NPM 包被命名空间。NPM 上的每个用户和组织都有自己的范围,他们是唯一可以向其中添加包的人。

这很有用,原因有几个:

  • 它允许组织明确哪些软件包是“官方的”,哪些不是。
    • 例如,如果一个包有 scope @angular,你就知道它是由 Angular 核心团队发布的。
  • 包名只需要在它发布的范围内是唯一的,而不是整个注册表。
    • 例如,包名称http已经在主存储库中使用,但 Angular 也可以使用@angular/http

其原因范围的包不要在公共场所搜索显示出来是因为他们中的很多都是通过NPM的支付服务组织创建的私有包,而且他们不舒服开放搜索,直到他们可以完全肯定他们是不是将不应该公开的任何事情公开——从法律的角度来看,这是可以理解的。

有关更多信息,请参阅NPM 文档Angular 文档

编辑:现在看来公共范围的包在搜索中正确显​​示了!

npm 上基本上有两种类型的module,它们是 -

  • 全局module - 这些是遵循当今存在的命名约定的module。require('foo')和有很多欢欣鼓舞。它们通过npm install XYZ命令由一个或多个人拥有

  • 作用域module - 这些是在组织名称下“作用域”的新module,该组织名称以@组织名称、斜杠和包名开头,例如@someOrgScope/packagename. 作用域是一种将相关包组合在一起的方式,也会影响 npm 处理包的方式。

作用域包是通过在 npm install 中通过名称引用它来安装的,前面是 @-symbol:

npm install @myorg/mypackage

也可以看看

@ 根据它在 npm 包名称中的位置而具有不同的含义,即包是:a)。包含 package.json 文件描述的程序的文件夹

b)。包含 (a) 的 gzip 压缩包

C)。解析为 (b) 的网址

d)。使用 (c) 在注册表上发布的 @

e)。@ 指向 (d)

F)。具有满足 (e) 的“最新”标签的 A

G)。A 解析为 (a)

npm install [<@scope>/]<name>
<scope>是可选的。该包将从与指定范围关联的注册表下载。如果没有注册表与给定范围相关联,则假定为默认注册表

注意:如果您的范围名称中没有包含 @-symbol,npm 会将其解释为 GitHub 存储库,请参见下文。范围名称也必须后跟斜杠。

npm install [<@scope>/] <名称>@<标签>
安装指定标签引用的包版本。如果该标记在该包的注册表数据中不存在,则此操作将失败。例子:

npm install packagename@latest
npm install @myorg/mypackage@latest

npm install [<@scope>/]<name>@<version>
安装指定版本的包。如果版本尚未发布到注册表,这将失败。例子:

npm install packagename@0.1.1
npm install @myorg/privatepackage@1.5.0

npm install [<@scope>/]<名称>@<版本范围>
安装与指定版本范围匹配的软件包版本。例子:

npm install packagename@">=0.1.0 <0.2.0"
npm install @myorg/privatepackage@">=0.1.0 <0.2.0"