【问题标题】: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
  • npm help scope
  • 相关:为什么有些模块没有作用域?通过我的一个项目,我看到 D3、'has'、'postcss' 每个都有许多子组件,但它们不使用 @ 范围。他们是否因不受范围限制而获得了一些有益的财产?

标签: javascript node.js npm


【解决方案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-clihttps://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 以前没有见过,如果你发现了,请告诉我。
      猜你喜欢
      • 2013-07-15
      • 2011-04-07
      • 1970-01-01
      • 2012-03-10
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多