web-dev-qa-db-ja.com

Nodeモジュール名での@記号の使用

私が書いた同僚のコードを見て、彼女はrequireステートメントで@シンボルを使用しています。これは、これらのファイルの1行目の最初の行です。

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

このコードを実行しようとすると、エラーが発生します。

Error: Cannot find module '@company/config'

私が率直に期待していることは、私のディレクトリにはこれを認識する必要があるために見えるものは何もありません!ここでいくつかの魔法が起こっているように思えますが、それは嫌いです。

私が推測できるのは、これがいくつかのあいまいなnpmまたはNodeのトリックに触れたことがないか、または他の設定の暗い芸術が得られないことです。 @がrequireでどのように機能するかの単なる説明であっても、どんな情報でも高く評価されています。

他のアイデア:シェフはこの全体のどこかに関与しているので、それは関連があるかもしれません。

更新:99%は、これがnpm configがこの時点で機能する方法の問題であることを確信していますが、それを修正する方法はまだ不明です。

pdate2私が発見したいくつかのものに基づいて:

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.
70
Derek Janni

だから私はこれを自分で解決しました。

@company/configはプライベートNPMリポジトリの1つであり、npmでホストされ、このエイリアスによって内部GitHubリポジトリに定義されています。これはrequireの動作とは関係ありません。

@を使用することは、プライベートNPMリポジトリに関して私が知らなかったプロトコルである場合とそうでない場合があります。

13
Derek Janni

Npmのスコープパッケージの前には「@」記号が付きます。 https://docs.npmjs.com/misc/scope

ドキュメントには、スコープパッケージの要求に関する追加情報が含まれています。 https://docs.npmjs.com/misc/scope#requiring-scoped-packages

スコープパッケージを要求する

スコープパッケージはスコープフォルダーにインストールされるため、コードでパッケージを要求する場合はスコープの名前を含める必要があります。

require('@myorg/mypackage')

Nodeがスコープフォルダーを処理する方法について特別なことはありません。これは、@ myorgというフォルダー内のモジュールmypackageを要求することを指定するだけです。

40
vaer-k

@スコープはパッケージの所有権を示します

これまで見てきたスコープの主な利点は、GitHubのユーザー名/組織名のように、各スコープが組織/ユーザーのnpmアカウントによって制御されることです。

これにより、見ているパッケージが信頼できる組織のものであるか、サードパーティのツールであるかを簡単に判断できます。

たとえば、表示される場合:

@angular/cli

Angularチームからのものであり、信頼できることがわかっています。

一方、同じことは言うことができませんでした:

angular-cli

参照: npmパッケージの「at」(@)プレフィックスの意味は何ですか?

スコープパッケージとは別に、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
Pransh Tiwari

require()を呼び出すと、ルートを読み取ります。フォルダーに@companyという名前を付けても問題ないように思えるので、@で何かを要求できるはずです。

構成は通常個人的なものであり、別のユーザーと同じにすることはできないため、同僚は@company/config.jsを自分で保持したいと思っているかもしれません。

requireは、プロジェクトフォルダー内のファイルを詳細とともに呼び出します。

  • プロジェクトフォルダー内のファイルを呼び出す場合、ルートの前に./を追加する必要があります。
  • httpnpmモジュール(node_modulesにインストールされている)などのグローバルパッケージを呼び出す場合は、./を省略できます。

テストプロジェクトフォルダー内に@company/configルートを作成しました。 ./@company/configを使用してのみ要求することができました。 node_modules内でフォルダーを移動した場合にのみ、require('@company/config');が許可されました。

node_modules内にモジュールを配置することはお勧めしません。これはnpmパッケージの単なる「コンテナー」です。新しい設定ファイルを作成して必要なルートを変更するか、単に必要なファイルを削除してメインファイルに設定オブジェクトを作成してみてください。

2
user5402942