Javascript 在节点模块名称中使用@符号
我正在查看一位同事编写的一些代码,她在require语句中使用了Javascript 在节点模块名称中使用@符号,javascript,node.js,npm,Javascript,Node.js,Npm,我正在查看一位同事编写的一些代码,她在require语句中使用了@符号。这是其中一个文件的第一行: var restServer = require('@company/config') 当我尝试运行此代码时,我得到一个错误: 错误:找不到模块'@company/config' 坦白地说,我的目录中没有这样的东西需要识别!这里似乎有一些魔力,我讨厌 我所能猜到的是,要么这是一些我从未接触过的晦涩的npm或节点技巧,要么可能是我没有接触到的其他一些黑暗的配置艺术。欢迎提供任何信息,即使只是解释@
@
符号。这是其中一个文件的第一行:
var restServer = require('@company/config')
当我尝试运行此代码时,我得到一个错误:
错误:找不到模块'@company/config'
坦白地说,我的目录中没有这样的东西需要识别!这里似乎有一些魔力,我讨厌
我所能猜到的是,要么这是一些我从未接触过的晦涩的npm或节点技巧,要么可能是我没有接触到的其他一些黑暗的配置艺术。欢迎提供任何信息,即使只是解释@
如何与require协同工作
其他想法:厨师参与了整个事情,所以这可能是相关的
更新:99%确定这是npm配置此时的工作方式存在问题,但仍不确定如何着手解决
根据我发现的一些东西更新2:
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.
当您调用
require()
时,它读取一条路由。由于如果将文件夹命名为@company
,似乎没有问题,因此您应该能够要求具有@
的文件夹
您的同事可能想为自己保留@company/config.js
,因为配置通常是个人的,对于其他用户来说不可能相同
require
将调用项目文件夹中的文件,并提供详细信息:
- 如果调用项目文件夹中的文件,则必须在路由前面添加
李>/
- 如果调用任何全局包,如
或任何http
模块(安装在npm
),可以忽略节点上的模块
/
@company/config
。它只允许我使用/@company/config
来要求它。只有当我将文件夹移动到node_modules
中时,它才允许我require('@company/config')代码>
我不建议在node\u模块中放置任何模块,它只是npm
包的“容器”。尝试创建一个新的配置文件并更改require路由,或者简单地删除require并在主文件中创建一个配置对象。所以我自己解决了这个问题
事实证明,@company/config
是我们的私有NPM存储库之一,托管在NPM上,并由该别名定义为内部GitHub存储库:它与require
的工作方式无关
使用@
可能是也可能不是我不知道的用于私有NPM回购的协议,如果遇到这种情况,请记住。NPM中的作用域包前面有一个“@”符号
作用域是将相关包分组在一起的一种方式,它还影响npm处理包的方式。每个npm用户/组织都有自己的作用域,只有您可以在自己的作用域中添加包。这意味着你不必担心有人把你的包名放在你前面。因此,它也是向组织发送官方软件包的一种好方法
作用域允许您创建与其他用户或组织创建的包同名的包,而不会产生冲突
这些文件包括关于要求范围包的附加信息:
需要范围包
由于作用域包安装在作用域文件夹中,因此必须
在代码中需要范围名称时,请包括范围名称,例如
require('@myorg/mypackage')
节点处理范围文件夹的方式没有什么特别之处,这是
只是指定需要文件夹中的模块mypackage
叫@myorg
除了作用域包之外,npm中的模块别名包可能会导致“@”出现。通过模块别名,您可以使用经常使用的模块,而无需整个路径。当目录结构很长时,它也很有效。e、 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');
有关详细信息,请参阅此处:范围是表示一组包的通用包所有权
官方文件载于:
当您注册npm用户帐户或创建组织时,您将被授予与您的用户或组织名称匹配的范围。您可以将此范围用作相关包的命名空间
作用域允许您创建与其他用户或组织创建的包同名的包,而不会产生冲突
到目前为止,我看到的作用域的主要优点是,每个作用域都由组织/用户的npm帐户控制,这与GitHub用户名/组织名称非常相似
通过这种方式,可以轻松确定您正在查看的包是属于您信任的组织,还是属于第三方工具
例如,如果您看到一个包:
@angular/cli
然后您知道它来自控制Angular团队的用户/组,可以信任
另一方面,关于以下方面,情况却并非如此:
angular-cli
TODO:WebUI/URL方案真的很不稳定,你如何轻松地链接到相应的组织/用户页面?通过搜索页面源,该URL的唯一点击点位于“collaborators”下,但也包含其他合作者:和
另请参见:将操作与作用域注册表的作用域相关联。首次登录到私有注册表时非常有用:npm login--scope=@organization--registry=registry.organization.com,这将导致@organization映射到注册表,以便将来安装sp包