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


83

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

bundledDependencies通常の依存関係に対する利点を知っている人はいますか?


16
「これが「bundleDependencies」と綴られている場合、それもまた名誉なことです。」素晴らしいドキュメント!
パニック大佐2012年

10
それでも、どういうわけか、単に「また光栄です」と読むように修正するのは悲しいことです。狭い場所で、侍や騎士に援助を命じた場合、彼に互換性のある武器と鎧を同梱してもらい、名誉を与えてもらいたいと思います。
Jon Coombs 2015年

3
「参照しているモジュールが削除された場合でも、正しいバージョンを確実に取得したいのなら」と突然大きな
joews 2016年

1
stackoverflow.com/questions/11459475/…も参照してください。
アノン2017

回答:


49

Nodeの現在の最大の問題の1つは、Nodeの変化の速さです。つまり、本番システムは非常に壊れやすく、npm update簡単に壊れてしまう可能性があります。

bundledDependenciesを使用することは、正しく推測しているように、他に何が変更されても常に正しい依存関係を提供することを保証することによって、この問題を回避する方法です。

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


1
どのようにして常に正しい依存関係を提供しますか?これはnpm update、bundledDependenciesの依存関係に影響を与えないことを意味しますか?
Kevin Ghadyani 2015

2
はい正解。バンドルされた依存関係は、基本的な方法で「正しく」ない場合があることに注意してください。それらは、SAIDをバンドルしている人が正しかったことです。
ジュリアンナイト

7
たぶんあなたが5年半前の答えを見ているからでしょう!その間にNode.JSが進んだ量は驚異的です。代わりに、コメントとして役立つものを追加したいと思いませんか?
ジュリアンナイト

105

クイックリーダーの場合:このQAは、パッケージに関するものではなく package.jsonbundledDependenciesフィールドに関するものです。

bundledDependenciesの機能

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

いつ使用するか

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

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

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

バンドルされた依存関係を使用しない場合

開発するときは、偶発的な更新を防ぐことが重要だとは思いませんが。そのためのより優れたツール、つまりコードリポジトリ(git、mercurial、svn ...)があるか、ファイルをロックするようになりました。

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

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

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

これは、BundlerやCargoなどの他のパッケージマネージャーのロックファイルに相当します。これはnpmのnpm-shrinkwrap.jsonに似ていますが、損失がなく、再現性のある結果が得られます。

npmyarnとりわけ、その機能を実際にコピーしました。

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

も参照してください

これは質問の範囲外ですが、最後の種類の依存関係(私が知っている)であるピア依存関係について言及したいと思います。また、この参照関連のSOの質問との可能性がドキュメントyarnbundledDependenciesを


6
「node_moduleフォルダを含む」 -それはあなたがネイティブモジュールで作業している場合は特に...生成されたコードを使用してレポを汚染かなり奇妙なことだ...
オレクサンドル

@Olexandrそれと、パッケージがアプリを壊すリスクを冒すまでの間、選択は簡単だと思います。別のブランチに入れることができることに注意してください(たとえば、gitを使用している場合)。同意しました、それは理想的な解決策にはほど遠いです。
nha 2015

3
たとえば、現在のシステムに適切なバイナリをインストールするphantomjsのようなパッケージがあるため、node_modulesをチェックインしないことをお勧めします。つまり、ある開発者がLinuxでnpm installを実行し、node_modulesをチェックインした場合、Windowsでリポジトリのクローンを作成する別の開発者には機能しません。npmがダウンロードをインストールするtarballをチェックインし、npm-shrinkwrap.jsonをそれらに向けることをお勧めします。このnpm install -g shrinkpackツールを使用して、このプロセスを自動化できます。
ジェイミーメイソン

1
@nhaに感謝します。レジストリtarballがプロジェクトリポジトリにあるので、shrinkpackでもそれから保護されます。
ジェイミーメイソン

1
@fold_leftはい、確かに、それを指してくれてありがとう(そしてシュリンクパックを作ってくれてありがとう)。npmレジストリが不変のデータストアのように機能していれば、これはすべて回避できたはずだと言っていました。
nha 2016

22

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

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


3

これがまだここに表示されていないことに驚いていますが、慎重に選択すると、構成されていないシステムで実行されるbundledDependencies配布可能なパッケージを作成するために使用できます。これは、たとえば、ネットワークに接続されていない、またはインターネットに接続されていないシステムがある場合に役立ちます。パッケージをサムドライブ(またはその他)に持ってきて、tarballを解凍すると、またはそれだけで機能します。npm packnpmnpm runnode index.js

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.