基本的な違いは何ですかbower
とはnpm
?単純でシンプルなものが欲しいだけです。私は私の同僚の使用のいくつかを見てきましたbower
し、npm
自分のプロジェクトでは交換可能にします。
基本的な違いは何ですかbower
とはnpm
?単純でシンプルなものが欲しいだけです。私は私の同僚の使用のいくつかを見てきましたbower
し、npm
自分のプロジェクトでは交換可能にします。
回答:
すべてのパッケージマネージャーには多くの欠点があります。あなたはあなたが一緒に暮らすことができるものを選ぶ必要があります。
npmはnode.jsモジュールの管理を開始しました(そのため、パッケージはnode_modules
デフォルトで使用されます)が、Browserifyまたはwebpackと組み合わせると、フロントエンドでも機能します。
Bowerはフロントエンド専用に作成され、それを念頭に置いて最適化されています。
npmは、bowerよりもはるかに大きく、汎用のJavaScript(country-data
国の情報やsorts
、フロントエンドやバックエンドで使用できるソート関数など)を含みます。
Bowerのパッケージ数ははるかに少ないです。
Bowerにはスタイルなどが含まれています
npmはJavaScriptに焦点を当てています。スタイルは個別にダウンロードされるか、npm-sass
またはのようなものによって要求されますsass-npm
。
最大の違いは、npmはネストされた依存関係(デフォルトではフラット)を実行するのに対し、Bowerはフラットな依存関係ツリーを必要とする(ユーザーに依存関係の解決の負担をかける)ことです。
ネストされた依存関係ツリーは、依存関係が独自の依存関係を持つことができることを意味します。これにより、2つのモジュールが同じ依存関係の異なるバージョンを必要とする場合でも機能します。npm v3以降、依存関係ツリーはデフォルトでフラットになり(スペースを節約)、必要な場合にのみネストされます(たとえば、2つの依存関係に独自のバージョンのUnderscoreが必要な場合)。
一部のプロジェクトでは、フロントエンドパッケージにはBowerを使用し、Yeoman、Grunt、Gulp、JSHint、CoffeeScriptなどの開発者ツールにはnpmを使用しています。
この回答は、シンドレソルフスの回答への追加です。npmとBowerの主な違いは、再帰的な依存関係の扱い方です。これらは1つのプロジェクトで一緒に使用できることに注意してください。
オンNPMよくある質問:(2015年9月6日からarchive.orgリンク)
依存関係をネストせずに依存関係の競合を回避することははるかに困難です。これはnpmが機能する方法の基本であり、非常に成功したアプローチであることが証明されています。
オンバウアーのホームページ:
Bowerはフロントエンド向けに最適化されています。Bowerは、パッケージごとに1つのバージョンのみを必要とするフラットな依存関係ツリーを使用して、ページの負荷を最小限に抑えます。
つまり、npmは安定性を目指しています。Bowerは最小限のリソース負荷を目指しています。依存構造を描くと、次のようになります。
npm:
project root
[node_modules] // default directory for dependencies
-> dependency A
-> dependency B
[node_modules]
-> dependency A
-> dependency C
[node_modules]
-> dependency B
[node_modules]
-> dependency A
-> dependency D
ご覧のとおり、一部の依存関係が再帰的にインストールされます。依存関係Aには3つのインスタンスがインストールされています!
バウアー:
project root
[bower_components] // default directory for dependencies
-> dependency A
-> dependency B // needs A
-> dependency C // needs B and D
-> dependency D
ここでは、すべての固有の依存関係が同じレベルにあることがわかります。
では、なぜnpmを使用するのですか?
おそらく、依存関係Bには依存関係Cとは異なるバージョンの依存関係Aが必要です。npmはこの依存関係の両方のバージョンをインストールするため、どちらのバージョンでも機能しますが、Bowerは重複を好まないため競合を引き起こします(Webページに同じリソースをロードするため、非常に非効率的で費用がかかり、重大なエラーが発生する可能性もあります)。インストールするバージョンを手動で選択する必要があります。これにより、依存関係の1つが壊れる可能性がありますが、それはとにかく修正する必要があります。
したがって、一般的な使用方法は、Webページに公開するパッケージ(例:ランタイム、重複を回避する場所)のBowerであり、テスト、ビルド、最適化、チェックなど、他のもの(開発時間など)にnpmを使用します。、重複の心配が少ない場合)。
npm 3の更新:
npm 3は、Bowerとは異なる方法で動作します。依存関係をグローバルにインストールしますが、最初のバージョンでのみ発生します。他のバージョンはツリーにインストールされます(親モジュール、次にnode_modules)。
詳細については、npm 3のドキュメントを読むことをお勧めします
npm
か、リソースの負荷を最小限に抑える必要がありますbower
。
TL; DR:日常の使用における最大の違いは、ネストされた依存関係ではありません...それは、モジュールとグローバルの違いです。
以前のポスターは基本的な違いのいくつかをうまくカバーしていたと思います。(npmのネストされた依存関係の使用は、大規模で複雑なアプリケーションの管理に非常に役立ちますが、それが最も重要な違いだとは思いません。)
ただし、Bowerとnpmの最も基本的な違いの1つを明確に説明した人がいないことに驚いています。上記の回答を読むと、npmのコンテキストでよく使用される「モジュール」という単語が表示されます。しかし、それは単なる構文の違いであるかのように、さりげなく言及されています。
しかし、モジュールとグローバル(またはモジュールと「スクリプト」)のこの区別は、おそらくBowerとnpmの最も重要な違いです。すべてをモジュールに配置するnpmアプローチでは、ブラウザーのJavascriptの記述方法を変更する必要があります。
<script>
タグのようなグローバルリソースルートでは、Bowerは古いスクリプトファイルをロードします。これらのスクリプトファイルに何が含まれていても、Bowerはそれらをロードします。これは基本的に、Bowerがすべてのスクリプトをプレーン・オールド<script>
の<head>
HTMLに含めるのと同じことを意味します。
つまり、これまでと同じ基本的なアプローチですが、便利な自動化機能がいくつかあります。
bower install
ローカルで必要なものをすばやく簡単に実行できます。bower.json
、それらもダウンロードされます。しかし、それを超えて、バウアーは私たちがjavascriptを書く方法を変えません。Bowerによってロードされたファイル内に含まれる内容については、何も変更する必要はありません。特に、これは、Bowerによってロードされたスクリプトで提供されるリソースが(通常、常にではないが)グローバル変数として定義され、ブラウザー実行コンテキストのどこからでも利用できることを意味します。
Nodeランドのすべてのコード(したがって、npmを介して読み込まれるすべてのコード)は、モジュールとして(具体的には、CommonJSモジュール形式の実装として、または現在はES6モジュールとして)構造化されています。したがって、NPMを使用してブラウザー側の依存関係を処理する場合(Browserifyまたは同じことを行う他の何かを介して)、Nodeと同じようにコードを構成します。
私が「なぜモジュールなのか」という問題に取り組んだよりも賢い人たちですが、ここにカプセルの要約があります:
window.variable
。まだ発生しやすいという1件の事故が代入されthis.variable
、それを実現していないことはthis
、実際にありますwindow
現在のコンテキストで。)私にとって、フロントエンドコードでのモジュールの使用は、結局のところ、推論とテストが容易な非常に狭いコンテキストで作業し、何が起こっているかについてより確実なものにすることです。
CommonJS / Nodeモジュールの構文の使用方法を習得するには、約30秒しかかかりません。モジュールとなる特定のJSファイル内で、まず、次のように、使用する外部依存関係を宣言します。
var React = require('react');
ファイル/モジュール内では、通常どおりに何でも行い、外部ユーザーに公開したいオブジェクトまたは関数を作成し、おそらくそれを呼び出します myModule
ます。
ファイルの最後で、次のように、世界と共有したいものはすべてエクスポートします。
module.exports = myModule;
次に、ブラウザーでCommonJSベースのワークフローを使用するには、Browserifyなどのツールを使用して、これらの個々のモジュールファイルをすべて取得し、実行時にそれらのコンテンツをカプセル化し、必要に応じて相互に挿入します。
また、ES6モジュール(BabelなどでES5にトランスパイルする可能性が高い)は広く受け入れられており、ブラウザーとNode 4.0の両方で機能するため、それらの概要についても言及する必要があります。
このデッキでモジュールを操作するためのパターンの詳細。
編集(2017年2月):Facebookの糸は、最近のnpmの非常に重要な潜在的な置き換え/補足です。npmが提供するものに基づいて構築された高速で確定的なオフラインパッケージ管理。JSプロジェクトは一見の価値があります。特に、プロジェクトを簡単に入れ替えることができるためです。
編集(2019年5月)「Bowerがついに非推奨になりました。ストーリーの終わり。」(h / t:簡潔な要約については、以下の@DanDascalescu。)
また、Yarn はまだアクティブですが、Yarnの主要な機能の一部を採用すると、Yarnの勢いの多くはnpmに戻りました。
SpotifyのJavaScript開発者であるMattias Petter Johanssonから:
ほとんどすべての場合、BowerよりもBrowserifyとnpmを使用する方が適切です。これは、Bowerよりもフロントエンドアプリのパッケージソリューションとして優れています。Spotifyでは、npmを使用してWebモジュール全体(html、css、js)をパッケージ化しており、非常にうまく機能します。
Bowerは、自身をWebのパッケージマネージャーとしてブランド化しています。これが本当なら素晴らしいだろう-フロントエンド開発者として私の人生をより良くしたパッケージマネージャーは素晴らしいだろう。問題は、Bowerがこの目的のための特別なツールを提供していないことです。これは、npmが提供していないことを知っているツールを提供していません。特に、フロントエンドの開発者に特に役立つツールは提供していません。フロントエンド開発者がnpmよりもBowerを使用するメリットはありません。
bowerの使用を中止し、npmあたりで統合する必要があります。ありがたいことに、それが起こっています。
browserifyまたはwebpackを使用すると、すべてのモジュールを大きな縮小ファイルに連結するのが非常に簡単になり、特にモバイルデバイスでのパフォーマンスに優れています。同じ効果を得るためにかなり多くの労力を必要とするBowerではそうではありません。
npmには、モジュールの複数のバージョンを同時に使用する機能もあります。アプリケーション開発をあまり行っていない場合、これは最初は悪いことと思われるかもしれませんが、Dependency hellを何度か試してみると、1つのモジュールの複数のバージョンを持つことができるのはかなり難しいことに気づくでしょう。素晴らしい機能。NPMは非常に便利含まれることに注意してください重複排除のツールを自動的にあなたが実際に場合にのみモジュールの2つのバージョンを使用することを確認することを持っている二つのモジュールの両方があれば-にすることができ、彼らは意志一つのモジュールの同じバージョンを使用しています。しかし、それができない場合は、非常に便利です。
Bowerは単一バージョンのモジュールを維持していますが、それはあなたにあなたに合った/最適なものを選択する手助けをしようとするだけです。
モジュールシステムがあり、ローカルで作業しているため、NPMはノードモジュールに適しています。Bowerはブラウザーには適しています。現在、グローバルスコープしかなく、操作するバージョンを非常に厳選したいからです。
私のチームはBowerから離れてnpmに移行しました。理由は次のとおりです。
詳細については、「私のチームがbowerではなくnpmを使用する理由」を参照してください。
http://ng-learn.org/2013/11/Bower-vs-npm/からこの有用な説明が見つかりました
一方、npmは、node.js環境で使用されるモジュール、またはnode.jsを使用して作成されたKarma、lint、minifiersなどの開発ツールをインストールするために作成されました。npmは、モジュールをプロジェクトのローカルに(デフォルトではnode_modulesに)インストールするか、グローバルにインストールして複数のプロジェクトで使用できます。大規模なプロジェクトでは、依存関係を指定する方法は、依存関係のリストを含むpackage.jsonというファイルを作成することです。npm installを実行すると、そのリストがnpmによって認識され、ダウンロードしてインストールされます。
一方、bowerはフロントエンドの依存関係を管理するために作成されました。jQuery、AngularJS、アンダースコアなどのライブラリ。npmと同様に、bower.jsonと呼ばれる依存関係のリストを指定できるファイルがあります。この場合、フロントエンドの依存関係は、デフォルトでbower_componentsというフォルダーにインストールされるbower installを実行することによってインストールされます。
ご覧のとおり、これらは同様のタスクを実行しますが、非常に異なるライブラリのセットを対象としています。
npm dedupe
、これは少し時代遅れです。Mattiasの回答を参照してください。
node.jsを使用する多くの人々にとって、bowerの主な利点は、javascriptではない依存関係を管理することです。javascriptにコンパイルする言語を使用している場合、npmを使用して依存関係の一部を管理できます。ただし、すべての依存関係がnode.jsモジュールになるわけではありません。JavaScriptにコンパイルするものの中には、ユーザーがソースコードを期待しているときに、JavaScriptにコンパイルして渡すことを不愉快なオプションにする、奇妙なソース言語固有の変換がある場合があります。
npmパッケージのすべてがユーザー向けのJavaScriptである必要はありませんが、npmライブラリパッケージの場合、少なくとも一部は必要です。