Grunt、NPM、Bowerの違い(package.jsonとbower.json)


612

私はnpmとbowerを初めて使用し、emberjsで最初のアプリを作成します:)。
Railsについては少し経験があるので、依存関係をリストするためのファイル(Bundler Gemfileなど)の考え方に精通しています。

質問:パッケージを追加したい(そして依存関係をgitにチェックインしたい)場合、それはどこに属しpackage.jsonていbower.jsonますか-どこに属しますか?

私が収集したものから、
実行bower installするとパッケージがフェッチされて/vendorディレクトリに配置され、
実行npm installするとパッケージがフェッチされて/node_modulesディレクトリに配置されます。

このSOの答えは、bowerがフロントエンド用で、npmがバックエンド用のものであることを示しています。
Ember-app-kitは一見するとこの違いに準拠しているようです...しかし、一部の機能有効にするためのgruntfileの指示には2つの明示的なコマンドが含まれているため、ここでは完全に混乱しています。

直感的に私はそれを推測します

  1. npm install --save-dev package-nameは、package-jをpackage.jsonに追加することと同じです。

  2. 亭--saveパッケージ名はインストール私にパッケージを追加するのと同じかもしれないbower.jsonとランニング亭がインストール

その場合、依存関係を管理するファイルに追加せずに、そのようなパッケージを明示的にインストールする必要があります(コマンドラインツールをグローバルにインストールすることは別として)。



14
@SindreSorhusこれは完全に重複しているわけではありません。この投稿にも関連する追加の質問があります。ところであなたは反対投票を説明してもいいですか?
sachinjain024 2014年

1
受け入れられた回答を変更しましたか?2014年に高く評価されたものは、2016年に受け入れられたものとはまったく異なることを示しているようです。また、別のアプローチを提案する理由も説明しているので、私はそれでクールです。それが受け入れられた(または再受け入れられた)ことに少し驚いた。

1
はい、受け入れた回答を変更しました。なぜなら、後者の回答の方がはるかに関連性があると思うからです。このフロントエンドのジャングルでは、多くの人が私と同じように混乱していると思います。そのため、この質問は私の予想をはるかに超えて人気を得ました。Pawelのおかげで、人々が参照するためのより現在の答えがあります(現在の仕事でwebpackを使用しています)。
apprenticeDev

回答:


154

2016年半ばの更新

状況は急速に変化しているため、2017年の後半になると、この回答は最新のものではなくなる可能性があります。

初心者は、ビルドツールとワークフローの選択にすぐに夢中になってしまう可能性がありますが、2016年の最新情報は、Bower、Grunt、Gulpをまったく使用していません。Webpackを使用すると、NPMですべてを直接実行できます。

誤解しないでください。他のワークフローを使用していて、私は以前のプロジェクトでGULPを使用しています(ただし、ゆっくりと移行します)が、これは、このワークフローで作業している最高の企業や開発者が大いにお金を稼ぐ方法です。

このテンプレートを見てください。これは、最高のテクノロジーと最新のテクノロジーを組み合わせた非常に最新のセットアップです。https//github.com/coryhouse/react-slingshot

  • Webpack
  • ビルドツールとしてのNPM(Gulp、Grunt、Bowerなし)
  • Reduxと反応する
  • ESLint
  • リストは長いです。行って探検しよう!

あなたの質問:

パッケージを追加したい(そして依存関係をgitにチェックインしたい)場合、それはどこに属していますか-package.jsonまたはbower.jsonに

  • すべてがpackage.jsonに属しています

  • ビルドに必要な依存関係は「devDependencies」にありnpm install require-dir --save-devます(つまり、-save -devは、devDependenciesにエントリを追加してpackage.jsonを更新します)

  • 実行時にアプリケーションに必要な依存関係は「依存関係」にありnpm install lodash --saveます(つまり、依存関係にエントリを追加して、package.jsonを更新して保存します)

その場合、依存関係を管理するファイルに追加せずに、そのようなパッケージを明示的にインストールする必要があります(コマンドラインツールをグローバルにインストールすることは別として)。

常に。快適だからといって。フラグ(--save-devまたは--save)を追加すると、depを管理するファイル(package.json)が自動的に更新されます。依存関係を手動で編集して時間を無駄にしないでください。ショートカットがnpm install --save-dev package-nameあるnpm i -D package-nameとのショートカットnpm install --save package-nameISnpm i -S package-name


6
あなたの答えは非常に意見With help of Webpack you can do everything directly in NPM! が分かれています:> それは真実ではありません、彼のワークフローにwebpackさえ必要としません
Augustin Riedinger

26
この答えは多くの仮定をしているようです。問題はnpmとbowerの違いを尋ねることであり、この答えは何らかの理由でwebpackについて言及しています。はい、webpackはそれを行う1つの方法ですが、この答えは、それがそれを行う唯一の正しい方法であるように思わせています。たとえば、誰かがPolymer 1.xを使用している場合、標準ワークフローはbowerを使用し、webpackのサポートはあまりありません。
John Powers

1
答えは実際には関連がありますが、与えられた議論は実際にはそうではありません。「しかし、これはそれがどのように行われるか」です。お金はワークフローの推論とは何の関係もありません。
フォースバーグ

3
2017年にこの回答をご覧ください。ドキュメントに移動:「webpack v1は非推奨です。すべての開発者にwebpack 2へのアップグレードをお勧めします。詳細については、移行ガイドを参照するか、webpack 2のドキュメントを参照してください。」ハハの古典的なウェブ開発。
user643011 2017

1
@ user643011移行ガイドを見ると、ほとんどの設定は同じままで、残りは設定構造の表面的な変更にすぎないことがわかります。私はPRを含む午後に移行を行いました
Pawel 2017

576

NpmとBowerはどちらも依存関係管理ツールです。しかし、両者の主な違いは、npmがNode jsモジュールのインストールに使用されるのに対し、bower jsはhtml、css、jsなどのフロントエンドコンポーネントの管理に使用されることです

これをさらに混乱させる事実は、npmが、gruntおよびなどのフロントエンド開発でも使用できるいくつかのパッケージを提供することjshintです。

これらの行はより多くの意味を追加します

Bowerは、npmとは異なり、メインファイルと見なされる複数のファイル(.js、.css、.html、.png、.ttfなど)を持つことができます。Bowerは、これらの主要なファイルを一緒にパッケージ化すると、コンポーネントと意味的に見なします。

編集GruntはNpmやBowerとはかなり異なります。Gruntは、JavaScriptタスクランナーツールです。それ以外の場合は手動で行わなければならなかったgruntを使用して多くのことを行うことができます。Gruntの使用法のいくつかを強調します。

  1. 一部のファイルの圧縮(例:zipupプラグイン)
  2. jsファイルのリンティング(jshint)
  3. より少ないファイルのコンパイル(grunt-contrib-less)

sassコンパイル、javascriptの醜悪化、ファイル/フォルダーのコピー、javascriptの縮小などのためのイヤなプラグインがあります。

gruntプラグインもnpmパッケージであることに注意してください。

質問1

パッケージを追加したい(そして依存関係をgitにチェックインしたい)場合、それはどこに属していますか-package.jsonまたはbower.jsonに

このパッケージがどこに属しているかによります。ノードモジュール(grunt、requestなど)の場合は、package.jsonに格納され、そうでない場合はbower jsonに格納されます。

質問2

依存関係を管理するファイルにパッケージを追加せずに、そのようなパッケージを明示的にインストールする必要があるとき

パッケージを明示的にインストールするか、依存関係を.jsonファイルで言及するかは関係ありません。ノードプロジェクトで作業している最中に、別のプロジェクト、たとえばが必要だとするとrequest、次の2つのオプションがあります。

  • package.jsonファイルを編集し、「リクエスト」への依存関係を追加します
  • npmインストール

または

  • コマンドラインを使用: npm install --save request

--saveoptionsは、package.jsonファイルにも依存関係を追加します。--saveオプションを指定しない場合は、パッケージをダウンロードするだけですが、jsonファイルは影響を受けません。

どちらの方法でもこれを行うことができ、大きな違いはありません。


3
説明と記事をありがとう!洞察に富み、違いを明確にします(依存関係をどこに置くかを決定するのに役立ちます)。誰かが最後の質問に答えてくれるのを待って(再:いつパッケージを個別にインストールしたいのか)、後で答えを受け入れます:)
apprenticeDev

1
npmに関しては、それはNodeJSモジュールのパッケージマネージャーである可能性がありますが、NodeJSだけに限定されているわけではないことがわかりません。npmは、クライアント側の依存関係の管理と同じくらい効果的です。例:dontkry.com/posts/code/using-npm-on-the-client-side.html
Matt Smith

15
npmができないことをバウアーは何ができますか?
Adam Soffer 2014

1
jQueryプラグインリポジトリ(plugins.jquery.com)はnpmに置き換えられました。
thdoan 2015年

2
npmnpmとbowerの両方を使用していたv1チュートリアルとは異なり、最新のクイックスタートAngular 2(RC)チュートリアルとgit seed のみが使用します。私は本当に、本当に()という事実を愛するpackage.json維持する唯一のものである、(b)は、それが再帰的に1ライナーで依存関係を計算していることnpm install、および(c)はあなただけ削除する必要がある問題があるとき、node_modulesフォルダをインストールNPM実行再び。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.