在节点module名称中使用@ 符号

IT技术 javascript node.js npm
2021-01-13 06:48:31

我正在查看一位同事编写的一些代码,她@在 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个回答

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 处理范围文件夹的方式没有什么特别之处,这只是指定在名为@myorg 的文件夹中需要module mypackage。

@范围是指一组包的共同所有权包

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

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

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

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

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

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

@angular/cli

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

另一方面,不能说同样的话:

angular-cli

TODO:网页UI / URL方案确实是靠不住的,你怎么轻易链接:https://www.npmjs.com/package/@angular/cli到相应的组织/用户页面,想必HTTPS://www.npmjs .com/~角度通过搜索页面源,该 URL 的唯一命中位于“合作者”下,但也包含其他合作者:https : //www.npmjs.com/~angular-clihttps://www.npmjs.com /~google-wobot

另请参阅:npm 包上的“at”(@) 前缀是什么意思?

@PetarVasilev 以前没见过,如果你发现了,请告诉我。
2021-03-23 06:48:31
这种情况是什么意思:npm install -D tailwindcss@npm:@tailwindcss/postcss7-compat我得到@tailwindcss 是范围,但到底是tailwindcss@npm:什么?
2021-03-30 06:48:31
最好的解释。
2021-04-13 06:48:31

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

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

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

除了作用域包之外,“@”可能是由于npm 中的module别名包而出现的。通过module别名,您可以使用常用的module而无需其完整路径。当目录结构很长时,它也很有效。例如)require('../../../../some/very/deep/module')

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

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

"_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
2021-03-15 06:48:31
简单的回答。谢谢
2021-03-18 06:48:31

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

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

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

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

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

我不建议在里面放任何modulenode_modules,它只是一个npm的“容器” 尝试创建一个新的配置文件并更改 require 路由,或者简单地删除 require 并在主文件中创建一个配置对象。

谢谢!这是一个很好的答案,有一些有用,但我实际上在不久前解决了我自己的问题。为了回答其他人的问题,我会发布它。
2021-03-22 06:48:31