web-dev-qa-db-ja.com

npmの通常の依存関係に対するbundledDependenciesの利点

npmでは bundledDependencies を指定できますが、そうすることの利点は何ですか?参照するモジュールが削除された場合でも、適切なバージョンを確実に取得したい場合、またはバンドルにより速度が向上する場合があると思いますか?

誰でもbundledDependenciesが通常の依存関係より優れていることを知っていますか?

70
balupton

Nodeの現在の最大の問題の1つは、どれだけ速く変化するかです。これは、実稼働システムが非常に壊れやすく、npm updateは簡単に壊れる可能性があります。

BundledDependenciesを使用することで、他のどのような変更が行われようとも、常に正しい依存関係を提供することを正しく推測して、この問題を回避することができます。

また、これを使用して独自のプライベートバンドルをバンドルし、インストールで提供することもできます。

38
Julian Knight

クイックリーダーの場合:このQAは package.json bundledDependenciesフィールド、 package についてnot.

BundledDependenciesが行うこと

「bundledDependencies」は、まさにその名前が意味するものです。プロジェクト内にあるべき依存関係。したがって、機能は基本的に通常の依存関係と同じです。 npm packの実行時にもパックされます。

それらを使用する場合

通常、通常の依存関係はnpmレジストリからインストールされます。したがって、バンドルされた依存関係は次の場合に役立ちます。

  • npmレジストリから来ていない、または変更されたサードパーティのライブラリを再利用したい
  • 独自のプロジェクトをモジュールとして再利用したい
  • モジュールとともにいくつかのファイルを配布したい

この方法では、独自のnpmリポジトリを作成(および保守)する必要はありませんが、npmパッケージから得られるのと同じ利点を得ることができます。

バンドルされた依存関係を使用するnotの場合

しかし、開発するとき、主なポイントは偶発的な更新を防ぐことだとは思いません。そのためのより良いツール、すなわちコードリポジトリ(git、Mercurial、svn ...)、またはファイルをロックするツールがあります。

パッケージバージョンを固定するには、次を使用できます。

  • オプション1:ノード8に付属する新しいNPMバージョン5を使用します。package-lock.jsonファイルを使用します( node blog およびノー​​ド8リリースを参照)

  • Option2:npmの代わりに yarn を使用します。 facebookのパッケージマネージャーであり、npmよりも高速で、 yarn.lock ファイルを使用します。それ以外は同じpackage.jsonを使用します。

これは、BundlerやCargoなどの他のパッケージマネージャーのロックファイルに匹敵します。 npmのnpm-shrinkwrap.jsonに似ていますが、損失はなく、再現可能な結果を​​作成します。

npmは、とりわけ、その機能をyarnから実際にコピーしました。

  • オプション3:これは以前に推奨されたアプローチでしたが、もう推奨しません。アイデアは、ほとんどの場合npm shrinkwrapを使用し、node_moduleフォルダを含むすべてのものをコードリポジトリに入れることでした。または、おそらく shrinkpack を使用します。当時のベストプラクティスは node.jsブログ および joyent developer Webサイトで議論されました。

こちらもご覧ください

これは質問の範囲外ですが、最後の種類の依存関係(私が知っている)について言及したいと思います。 ピア依存関係 。また、これを参照してください related SO question およびおそらく bundledDependenciesyarnのドキュメント。

95
nha

その他の利点は、内部の依存関係(アプリケーションコンポーネント)をそこに配置し、lib /を混乱させてnpmに公開する代わりに、独立したモジュールであるかのようにアプリでそれらを要求できることです。

それらが別々のモジュールとして存在できる程度に成熟した場合、コードを変更せずに簡単にnpmに配置できます。

22
Boris Egorov

ここにはまだ表示されていませんが、注意深く選択すると、bundledDependenciesを使用して、npmが設定されていないシステムで実行されるnpm packから配布可能なパッケージを生成できます。これは、たとえばネットワークに接続されていない/インターネットに接続されていないシステム:パッケージをサムドライブ(またはその他)に持ち込み、tarballを展開してから、npm runまたはnode index.jsを実行します。

「オフライン」で実行するためにアプリケーションをバンドルするより良い方法があるかもしれませんが、もしあれば私はそれを見つけていません。

1
Coderer

運用上、bundledDependenciesはモジュールのプライベートモジュールストアと見なされます。依存関係はより公開され、モジュールとその依存関係(およびサブ依存関係)の間で解決されます。モジュールは、たとえばリアクションの古いバージョンに依存する場合がありますが、依存関係には最新かつ最高のものが必要です。パッケージ/インストールにより、node_modules/$yourmodule/node_modules/react、依存関係のバージョンはnode_modules/react(またはnode_modules/$dependency/node_modules/reactそうした傾向がある場合)。

警告:最近、reactの依存関係を適切に構成しない依存関係に遭遇しました。bundledDependenciesで反応すると、実行時に依存モジュールが失敗しました。

0
mushuweasel