在节点模块名称中使用 @ 符号 [重复]

Posted

技术标签:

【中文标题】在节点模块名称中使用 @ 符号 [重复]【英文标题】:Use of @ symbol in Node module names [duplicate] 【发布时间】:2016-07-17 13:12:41 【问题描述】:

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

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

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

Error: Cannot find module '@company/config'

坦率地说,我的预期是,在我的目录中没有任何类似这样的东西需要识别!好像这里有什么魔法,我讨厌。

我只能猜测这是我没有接触过的一些晦涩难懂的 npm 或 Node 技巧,或者可能还有其他一些我没有掌握的黑暗配置艺术。任何信息都值得赞赏,即使它只是对 @ 如何与 require 一起使用的解释。

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

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

【问题讨论】:

将操作与作用域注册表的作用域相关联。首次登录私有注册表时很有用:npm login --scope=@organization --registry=registry.organization.com,这将导致@organization映射到注册表,以便将来安装根据指定的包模式@organization/package。来自docs.npmjs.com/misc/config 相关帖子 - What is the meaning of the “at” (@) prefix on npm packages? npm help scope 相关:为什么有些模块没有作用域?通过我的一个项目,我看到 D3、'has'、'postcss' 每个都有许多子组件,但它们不使用 @ 范围。他们是否因不受范围限制而获得了一些有益的财产? 【参考方案1】:

当您调用 require() 时,它会读取一条路线。因为如果您将文件夹命名为@company 似乎没有问题,您应该能够要求带有@ 的东西。

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

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

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

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

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

【讨论】:

谢谢!这是一个很好的答案,有一些有用,但我实际上在不久前解决了我自己的问题。为了回答其他问题,我会发布它。【参考方案2】:

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

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

对于私有 NPM 存储库,使用 @ 可能是也可能不是我不知道的协议,如果遇到这种情况,请记住这一点。

【讨论】:

【参考方案3】:

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

作用域是一种将相关包组合在一起的方式,也影响 npm 处理包的方式。每个 npm 用户/组织都有自己的范围,只有你可以在你的范围内添加包。这意味着您不必担心有人抢先您的包裹名称。因此,这也是向组织发出官方软件包信号的好方法。 https://docs.npmjs.com/misc/scope

范围允许您创建与其他用户或组织创建的包同名的包,而不会发生冲突。 https://docs.npmjs.com/about-scopes

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

需要范围包

因为作用域包被安装到作用域文件夹中,你必须 在您的代码中需要它们时包括范围的名称,例如

require('@myorg/mypackage')

Node 处理作用域文件夹的方式没有什么特别之处,这 只是指定在文件夹中需要模块 mypackage 叫@myorg。

【讨论】:

【参考方案4】:

除了作用域包之外,'@' 可能是由于 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

【讨论】:

简单的答案。谢谢 如果在你的堆栈中使用 Webpack 可能还需要检查 webpack.app.config.js【参考方案5】:

@ 范围表示一组包的共同包所有权

来自官方文档位于:https://docs.npmjs.com/about-scopes

当您注册 npm 用户帐户或创建组织时,您将获得与您的用户或组织名称匹配的范围。您可以将此范围用作相关包的命名空间。

范围允许您创建与其他用户或组织创建的包同名的包,而不会发生冲突。

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

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

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

@angular/cli

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

另一方面,同样不能说:

angular-cli

TODO:Web UI / URL 方案真的很奇怪,你如何轻松地将:https://www.npmjs.com/package/@angular/cli 链接到相应的组织/用户页面,大概是https://www.npmjs.com/~angular?通过搜索页面源,该 URL 的唯一命中位于“合作者”下,但其中也包含其他合作者:https://www.npmjs.com/~angular-cli 和 https://www.npmjs.com/~google-wombot

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

【讨论】:

最佳解释。 这个案例是什么意思:npm install -D tailwindcss@npm:@tailwindcss/postcss7-compat 我知道@tailwindcss 是作用域但到底是什么tailwindcss@npm: @PetarVasilev 以前没有见过,如果你发现了,请告诉我。

以上是关于在节点模块名称中使用 @ 符号 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL - 字段名称中的转义与符号[重复]

节点 postgres 并获得具有重复名称的连接字段

在嵌套集中重复节点名称

使用来自同一包的不同节点模块版本[重复]

neo4j,python,批量建立节点时,会重复建立相同名称节点。去重。

如果放在模块中,Python 无法导入名称 [重复]