在 Node 模块名称中使用@符号

我正在看一个同事写的代码,她正在使用需求语句中的 @符号。这是其中一个文件的第一行:

var restServer = require('@company/config')

当我尝试运行这段代码时,我得到一个错误:

Error: Cannot find module '@company/config'

坦率地说,我希望,在我的目录中没有像这样的东西需要识别!这里好像有什么魔法,我讨厌这样。

我所能猜测的是,要么这是一些模糊的 npm 或节点的把戏,我还没有接触到,或者也许有一些其他黑暗的艺术配置,我没有得到。感谢任何信息,即使它只是一个解释如何 @与需求工作。

其他想法: 厨师参与了整个事情的某个地方,所以这可能是相关的。

更新 : 99% 的人确信这是 npm config工作方式的问题,但仍然不确定如何着手修复它。

Update2 基于我发现的一些东西:

Dereks-MacBook-Pro:project-dir derekjanni$ npm config set //registry.npmjs.org/:authtoken $SECRET_TOKEN


Dereks-MacBook-Pro:project-dir derekjanni$ npm install
npm ERR! Darwin 15.0.0
npm ERR! argv "/usr/local/Cellar/node/5.5.0/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v5.5.0
npm ERR! npm  v3.5.3
npm ERR! code E404
npm ERR! 404 Not found : @company/config
npm ERR! 404  '@company/config' is not in the npm registry.
69975 次浏览

当你调用 require()时,它会读取一个路由。因为如果您将一个文件夹命名为 @company似乎没有问题,所以您应该能够要求使用 @

您的同事可能希望自己保留 @company/config.js,因为配置通常是个人的,对于其他用户不可能是相同的。

require将调用项目文件夹中的文件,并提供详细信息:

  • 如果在项目文件夹中调用文件,则必须在路线前面添加 ./
  • 如果您调用任何全局包,如 http或任何 npm模块(安装在 node_modules) ,您可以省略 ./

我在我的测试项目文件夹中创建了一个路由 @company/config。它只允许我使用 ./@company/config来要求它。只有当我移动文件夹内的 node_modules,它允许我的 require('@company/config');

我不建议在 node_modules中放置任何模块,它只是 npm包的“容器”。尝试创建一个新的配置文件并更改请求路由,或者干脆删除请求并在主文件中创建一个配置对象。

所以我自己解决了这个问题。

原来 @company/config是我们的私有 NPM 存储库之一,托管在 NPM 上,并由内部 GitHub 存储库的别名定义: 它与 require的工作方式无关。

使用 @可能是或可能不是一个协议,我不知道的私人 NPM 回购,请记住,如果您遇到这一点。

Npm 中的作用域包前面有一个“@”符号。

范围允许您创建与另一个用户或 Org 创建的包同名的包,而不会产生冲突。https://docs.npmjs.com/about-scopes

作用域是将相关软件包分组在一起的一种方法,它还会影响 npm 处理软件包的一些方式。每个 npm 用户/组织都有自己的作用域,只有您可以在自己的作用域中添加包。这意味着你不必担心有人抢在你前面使用你的软件包名称。因此,它也是一个很好的方式来表示组织的官方软件包。https://docs.npmjs.com/misc/scope

这些文件包括关于要求有范围的软件包的补充信息: Https://docs.npmjs.com/misc/scope#requiring-scoped-packages

需要有作用域的包

因为作用域包被安装到作用域文件夹中,所以必须 当需要在代码中包含作用域的名称时,例如。

require('@myorg/mypackage')

Node 处理范围文件夹的方式没有什么特别之处 只是指定要求文件夹中的模块 mypackage 叫@myorg。

除了限定作用域的包之外,npm 中的 模块化名包也会产生“@”。通过模块别名,您可以使用经常使用的模块,而不需要它的整个路径。当目录结构很长时,它也是有效的。例如: require('../../../../some/very/deep/module')

相反,您可以使用: var module = require('@deep/module')

在 package.json 中,您可以为其提供别名的模块:

"_moduleAliases": {
"@root"      : ".", // Application's root
"@deep"      : "src/some/very/deep/directory/or/file",
"@my_module" : "lib/some-file.js",
"something"  : "src/foo", // Or without @. Actually, it could be any string
}

在应用程序的主文件中使用以下内容:

require('module-alias/register');

详细信息请参考这里: 模块化名

@作用域表示一组包的公共包所有权

从官方文件是在: https://docs.npmjs.com/about-scopes

当您注册 npm 用户帐户或创建 Org 时,将被授予与您的用户或 Org 名称匹配的作用域。您可以将此范围用作相关包的命名空间。

范围允许您创建与另一个用户或 Org 创建的包同名的包,而不会产生冲突。

到目前为止,我所看到的作用域的主要优点是,每个作用域都由组织/用户的 npm 帐户控制,非常类似于 GitHub 用户名/组织名称。

通过这种方式,可以很容易地确定您正在查看的包是属于您信任的组织,还是属于第三方工具。

例如,如果您看到一个包:

@angular/cli

那么你就知道它来自于控制 Angular 团队的用户/组,并且是可以信任的。

另一方面,情况并非如此:

angular-cli

待办事项: web UI/URL 方案确实不稳定,你如何轻松地链接: https://www.npmjs.com/package/@angular/cli到相应的组织/用户页面,大概是 https://www.npmjs.com/~angular?通过搜索页面源,该 URL 的唯一命中位置在“协作者”下,但它也包含其他协作者: https://www.npmjs.com/~angular-clihttps://www.npmjs.com/~google-wombot

参见: Npm 包上的“ at”(@)前缀是什么意思?