JavaScript依存関係管理:npm対bower対volo [終了]


160

どのように比較するかnpmbowervolo

3つすべてを使用して、UIプロジェクトのJavaScript依存関係をインストールできます。npmよりノード固有であると理解しています。

それで、いつ何を使うのですか?

npmまだ遠い立って、しかし、bowervolo私は間に線を引くことができないのですが、まったく同じ問題を解決しているようだnpmbower-volo



1
ここでこの質問を読んでいて、2015年からの回答が必要な場合は、私の最新の回答を参照してください。
gustavohenke 2015

回答:


104

npmとbowerの違いを最もよく表す説明は次のとおりです。npmはパッケージと呼ばれるJavaScriptモジュールを管理し、Bowerはコンポーネントと呼ばれるフロントエンドコンポーネント(つまり、css、html、JavaScript)を管理します。npmは、bowerのインストールにも使用されます。これは、npmとバウアー(voloはカバーしていません)に関する詳細な記事です。


88
これは非常に良い説明ではありません。Npmは、フロントエンドコンポーネントのインストールに使用できます。
BT

npmの一部の「フロントエンド」ライブラリーが、対応するライブラリーのために放棄されることに気づきましたが。たとえば、1年間発行されていないEmberを例にとります。
briangonzalez 14

4
@Nate名前は単に始まった場所です。NPMは現在、非常に汎用的なパッケージ管理システムです。私は定期的にnpmを使用してフロントエンドモジュールをインストールしています。commonjsモジュール、vs amd、その他のNPMの使用に違いはありません。JavaScript以外のモジュールにもnpmを使用できます。したがって、それは単にnpmとbowerの違いではありません。それらをパッケージと呼ぶにせよコンポーネントと呼ぶにせよ、それらはどちらも任意のファイルのコレクションであるという点で同じです。
BT

2
これは、bowerがhtml、css、およびjavascriptを処理するポリシーを持っていないことを考えると、非常に誤解を招く答えです。npmにもポリシーはありません。ただし、npmのほぼすべてのものが、少なくともcommonjsと他の形式をサポートするように記述されています。bowerと同じように、htmlとcssをnpmパッケージに入れることができます。cssとhtmlを含むパッケージを含む、npmには多くのフロントエンドのみのパッケージがあります。
サブスタック2014

3
browserifyを使用している場合、npmは完璧なパッケージマネージャーです。どのパッケージマネージャーを使用するかは重要ではないと思いますが、個人的にはプロジェクトごとに1つだけに固執します。
Eruant 2014

72

お辞儀

機能はほとんどありませんが、フロントエンド開発者の間では依然として非常に人気があります。すべてのフロントエンドパッケージがそれを使用しています。bowerをnpmにマージするイニシアチブもあります。

Bowerはクライアント側向けに最適化され、フラットな依存関係ツリーのみをサポートします。つまり、各ライブラリーは1回だけ使用する必要があり(同じライブラリーの異なるバージョンをクライアントに出荷するのはコストがかかるため)、依存関係の制約はユーザーが解決する必要があります。

bowerレジストリ(bower search <some keyword>)でフロントエンドに関連するものは何でも見つかるはずです-私の意見では、それが他のパッケージマネージャーとの関係でのbowerの最大の利点です。

ボロ

私はそれを何年も5分以上使用していません。それについて知らないが、私が見ることができることから、それはいくつかのビルドツールを含みます、そしてそれはGruntユーザーにとても馴染みがあります。

npm

はい、npmはNode Package Managerの略です。しかし、今日では、それをすべてに使用できます。人々はもはやnpm install物事を処理するだけではなく、ノード環境でのみ機能することを期待しています。たとえば、Twitter Bootstrapには多くのnpmパッケージがあります

Npmはサーバー側での使用に最適化されており、依存関係ツリーがネストされています。各依存関係は、独自の依存関係を持つことができ、独自の依存関係を持つことができます。これにより、各依存関係がアンダースコアなどの独自のバージョンを使用できるため、依存関係バージョンの競合が解消されました。ただし、次のnpmバージョン3では、依存関係ツリーがフラット化されます

npm @ 3を使用すると、node_modulesディレクトリはよりフラットになります。すべての依存関係とほとんどのサブ依存関係(および(サブ)+依存関係)は、トップレベルで互いに隣り合っています。競合がある場合のみ、モジュールはより深いレベルでインストールされます。これにより、Windowsユーザーにとって非常に簡単になります。

npmを使用する上で私が見るいくつかの利点:

  • 他のすべてのパッケージマネージャー(コンポーネント、bower、volo、JSPMなど)で使用されます。
  • ビルドスクリプトを使用できます。
  • npmベースのパッケージをイントロスペクトするための多くのツールが利用可能

npmはJavaScriptのパッケージマネージャーです。

npmjs.comスクリーンショット


2013年2月現在、私の意見は以下の通りです。もう考慮しないでください。

npm

Nodeプロジェクトの場合は、それに固執することをお勧めします。ブラウザで使用できるプロジェクトもほとんどありません...

お辞儀

バウアーは今、ポップな男です。彼らは内部に多くのプロジェクトを抱えており、プロジェクトのメンテナはそれらをバウアーレジストリで最新の状態に保ちたいと思っています...

彼が時々少しバギーであるのは残念です。

ボロ

それ以来5分以上ボロを試していませんが、ボウよりも柔軟性があるように見えます。

voloのマイナス点は、プロジェクトが非常に古いことです。


19
npmには何千ものモジュールがあり、ブラウザーでのみ機能するか、ノードとブラウザーの両方で機能します。それらの多くは、どのブラウザーで動作するかを正確に示すciバッジさえ持っています。bowerなどのほとんどすべては、おそらくnpmにあります。
サブスタック2013年

ngBoilerplateのようなプロジェクトがbowerを使用する必要性を理解してい
ませんが

5
「ポップガイ」とは何ですか?「ポップ」は略語です。「人気」の?
ブライアンオークリー

4
スクリーンショットでは、npmは核計画マニュアルを表しています;)
ジムジョーンズ

24

彼らは同じ問題を解決しているようですが、環境や世界が異なります。nodejsとvoloのNPM、ブラウザーの代わりに。

真実は、NPMを使用して、ブラウザーのJavaScriptとCSSを管理することもできます。あなたがそれをするのを妨げるものは何もありません。その意味では、NPMを使用することは、同じ目的のために2つの異なるツールを管理する必要があるよりも自然に感じられます。

bowerは、少なくともより人気のあるパッケージについては、より多くのパッケージを利用できるようです。しかし、jQueryはすぐにNPMでも直接利用できるようになり、おそらく他のすべてのライブラリも同じ傾向に従うでしょう。

私の意見では、ブラウザでノードモジュールを使用するのに役立つbrowserifywebmakeなどのツールがあるため、他に何かを提供しない限り、bowervoloの本当のニーズはありません(特定のモジュールがそれらのレジストリ)。

VoloBowerのどちらも優れていますが、私の観点からは、すでにNPMを使用している場合は、それに固執することをお勧めします。

NPMを使用すると、browserifyやwebmakeを使用しなくてもクライアントの依存関係を管理できることに注意してください。私が取り組んでいるほとんどのプロジェクトでは、npmモジュールがインストールされた後、スクリプトを実行して、クライアントアプリが使用する場所にそれらをデプロイします。そのファイルを他のjsファイルと連結するためにgruntを使用することもあれば、自分のWebアプリのテンプレートファイルから直接参照することもあります。いずれにせよ、これは個人的な好みです。他のユーザーは、ワークフローに自然に収まるBowerやVoloを使いやすくすることができます。


1
同じ問題に対して競合する解決策があることは良いことです。yeoman私たちがすでに持っていたのに、なぜプロジェクトが新しいパッケージマネージャーを思いついたのnpmですか?(成熟していて、有名で機能が豊富でした)この考えは、私はまだ実際のポイントを見逃しているように感じます。
Yugal Jindle 2013年

1
実際にはそうではありませんが、あなたができるという理由だけで、時にはそれを行うことで、同じ問題を解決しようとする間にいくつかの改善が行われるという理由で、ホイールを再発明するのは面白いことがあります。フロントエンドの開発者がパッケージを見つけやすくすることを除いて、彼らが新しいものを作ることを選んだ理由ではありません。すべてのフロントエンド開発者がノードの経験を持っているわけではありません。それが、バウアーのようなプロジェクトの背後にある主な理由だと思います。非ノードユーザーが簡単にできるようにしてください。私はここで推測しています。
roy riojas 2013年

npmフロントエンドのシンプルさを優先して、面倒を解消したかったのでしょう。したがって、フロントエンド開発用です。
Yugal Jindle 2013年

15

NPMに対するBowerの大きな利点は、コンポーネントの単一のバージョンを使用して依存関係を管理することです(NPMは異なるモジュールのサブ依存関係として異なるコピー/バージョンを持つことで機能します)。これは、A VERY GOOD THINGそれが異なるバージョンでコンポーネントの複数のコピーを含める必要が肥大化してなってきて、あなたのクライアント側のJavaScriptを防ぐため。モジュールの複数のコピーを含めることは、NPMの依存関係管理のしくみの中心であり、したがって、NPMはクライアント側のパッケージ管理には完全に適していません。

上記の結果、bowerパッケージのメンテナーとコンシューマーは、競合を回避するために依存バージョン番号を維持することにもっと注意を払う必要がありますが、それは支払う価値があります。また、NPMモジュールはメジャー、マイナー、パッチリリースの発行でずさんなことが多いので、NPMの依存関係管理もバラのベッドではありません。


3
これは、パッケージマネージャーがファイルを配置したフォルダーからフロントエンドコードを直接提供している場合にのみ当てはまります。私の場合、less / jsファイルを処理するビルドスクリプトを使用するか、これらのファイルからバンドルを作成するためにbrowserifyを実行します。ですから、私の場合はそれほど大きな問題ではありません。配布されているコードは常に正しいバージョンを持っています。開発中に他のサブコンポーネントが重複していても、本番環境に到達することはありません。
roy riojas 2014年

誤って同じ依存関係の2つの異なるバージョンを(サブ依存関係として)要求している場合でも、この場合、あなたは間違っていると思います
wheresrhys

私は通常、私が制御しないモジュールを必要としないので、それらは常に正しいものです...誤ってモジュールがシムされたモジュールから特定のモジュールを要求しようとすると、ビルドは失敗します。私の場合にバウアーを使用しても意味がありません。追加されたメリットはありません
roy riojas 14年

したがって、依存関係ツリー全体を制御できる場合にのみ、npmは安全にクライアント側コードでモジュールの重複を回避するとしか言えません。これは確かに私が取り組んでいる大部分の場合には当てはまりません。おそらく、依存関係マネージャーを使用してクライアント側モジュールを含めるほとんどのプロジェクトには当てはまりません。
wheresrhys 2014年

1
マッシュアップに取り組んでいない限り、少なくともサードパーティのコードでは、依存関係ツリーはそれほど複雑ではありません。ほとんどのjsライブラリは単一のグローバルをエクスポートするため、browserify-shimを使用すると、それらをグローバルスコープから確実に使用できるため、常に制御するバージョンを使用できます。私のポイントは、あなたがすでに持っているものの上に別のパッケージマネージャーを必要とせずに同じことを達成できるということです。結局、それは好みの問題かもしれません。常に妥協が必要です。
roy riojas 2014年

5

これは問題の範囲外であることはわかっていますが、別の方法もあります。Jam JS- http://jamjs.org/興味深い点の1つは、Jamにうなり声機能があることです。

jam compile output.js

誰かがさらに別のパッケージマネージャーを作成し、それに名前を付ける必要があります:yapm :)


5
あなたの願いが付与されます。github.com/rlidwka/yapm:P
アレックス

1
よく私はブラウザ側の依存関係マネージャを考えていましたが、両方でこれはうまくいくと思います:pこれが私がスタートアップを行うことができない理由です、私の考えはすべてすでに考えられていました。
Bruce Lim

@BruceLimええ、私たちが良いアイデアを持っていると思うときはいつでも、すでにそれをすでに得ている他の人々が常にいます。
Evan Hu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.