在节点模块名称中使用@符号

时间:2016-03-29 19:31:09

标签: javascript node.js npm chef

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

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

当我尝试运行此代码时,出现错误:

  

Error: Cannot find module '@company/config'

我坦率地说,在我的目录中没有任何东西看起来像需要识别!看起来这里有一些魔法,我讨厌。

所有我能猜到的是,这是一些我没有接触过的模糊的npm或Node技巧,或者也许是其他一些我没有得到的暗配置艺术。任何信息都会受到赞赏,即使它只是@如何使用require的解释。

其他想法:厨师涉及这个问题的某个地方,所以这可能是相关的。

更新: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.

5 个答案:

答案 0 :(得分:31)

npm中的范围包裹前面有一个“@”符号:https://docs.npmjs.com/misc/scope

文档包含有关要求范围包的其他信息: https://docs.npmjs.com/misc/scope#requiring-scoped-packages

  

需要范围包

     

因为范围包已安装到范围文件夹中,所以必须这样做   在代码中需要时包括范围的名称,例如

<class '__main__.data_base'>
     

Node对待作用域文件夹的方式没有什么特别之处   只是指定要求文件夹中的模块mypackage   叫@myorg。

答案 1 :(得分:12)

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

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

使用@可能是也可能不是我不知道私有NPM回购的协议,如果遇到此问题,请记住这一点。

答案 2 :(得分:2)

当您致电require()时,它会读取路线。如果您将文件夹命名为@company似乎没有问题,那么您应该能够要求@的内容。

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

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

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

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

我不建议将任何模块放在node_modules内,它只是一个容器&#39;用于npm个包裹。尝试创建新的配置文件并更改require路由,或者只需删除require并在主文件中创建配置对象。

答案 3 :(得分:2)

除作用域软件包外,“ @”可能是由于npm中的 module-alias 软件包引起的。通过模块别名,您可以使用常用模块,而无需使用其完整路径。当目录结构很长时,它也有效。例如)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');

有关详细信息,请参见此处:module-alias

答案 4 :(得分:0)

范围表明软件包的所有权

到目前为止,我所看到的范围的主要优点是每个范围都由组织/用户的npm帐户控制,就像GitHub用户名一样。

通过这种方式,可以轻松确定正在查看的软件包是否属于您信任的组织,或者它是否是第三方工具。

例如,如果您看到:

@angular/cli

那么您知道它来自Angular团队并且可以信任。

另一方面,不能这样说:

angular-cli

另请参阅:What is the meaning of the "at" (@) prefix on npm packages?