我正在查看同事写的一些代码,她在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.
答案 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?