Ringkasan perbedaan perilaku penting:
Opsi terkait tidak dibahas di sini:
ketergantungan
dependenciesdiperlukan untuk menjalankan, devDependencieshanya untuk mengembangkan, misalnya: tes unit, Transkrip CoffeeScript ke JavaScript, minifikasi, ...
Jika Anda ingin mengembangkan sebuah paket, Anda mengunduhnya (mis. Via git clone), pergi ke root-nya yang berisi package.json, dan jalankan:
npm install
Karena Anda memiliki sumber aktual, jelas bahwa Anda ingin mengembangkannya, jadi secara default, keduanya dependencies(karena Anda harus, tentu saja, jalankan untuk mengembangkan) dan devDependencydependensi juga diinstal.
Namun, jika Anda hanya pengguna akhir yang hanya ingin menginstal paket untuk menggunakannya, Anda dapat melakukannya dari direktori mana saja:
npm install "$package"
Dalam hal ini, Anda biasanya tidak ingin dependensi pembangunan, sehingga Anda hanya mendapatkan apa yang dibutuhkan untuk menggunakan paket: dependencies.
Jika Anda benar-benar ingin menginstal paket pengembangan dalam kasus itu, Anda dapat mengatur devopsi konfigurasi true, mungkin dari baris perintah sebagai:
npm install "$package" --dev
Opsi ini falsesecara default karena ini adalah kasus yang jauh lebih jarang.
dependensi sebaya
(Diuji sebelum 3.0)
Sumber: https://nodejs.org/en/blog/npm/peer-dependencies/
Dengan dependensi reguler, Anda dapat memiliki beberapa versi dependensi: itu hanya diinstal di node_modulesdalam dependensi.
Misalnya jika dependency1dan dependency2keduanya bergantung pada dependency3versi yang berbeda, pohon proyek akan terlihat seperti:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Plugin, bagaimanapun, adalah paket yang biasanya tidak memerlukan paket lain, yang disebut host dalam konteks ini. Sebagai gantinya:
- plugin diperlukan oleh tuan rumah
- plugins menawarkan antarmuka standar yang tuan rumah harapkan temukan
- hanya host yang akan dipanggil langsung oleh pengguna, jadi harus ada satu versi.
Misalkan jika dependency1dan dependency2rekan bergantung pada dependency3, pohon proyek akan terlihat seperti:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Ini terjadi meskipun Anda tidak pernah menyebutkan dependency3dalam package.jsonfile Anda .
Saya pikir ini adalah contoh dari pola desain Inversion of Control .
Contoh prototipikal dari dependensi rekan adalah Grunt, host, dan plugin-nya.
Misalnya, pada plugin Grunt seperti https://github.com/gruntjs/grunt-contrib-uglify , Anda akan melihat bahwa:
grunt adalah peer-dependency
- satu-satunya di
require('grunt')bawah tests/: itu tidak benar-benar digunakan oleh program.
Kemudian, ketika pengguna akan menggunakan plugin, ia secara implisit akan memerlukan plugin dari Gruntfiledengan menambahkan grunt.loadNpmTasks('grunt-contrib-uglify')baris, tetapi gruntpengguna akan langsung menelepon.
Ini tidak akan berfungsi jika masing-masing plugin memerlukan versi Grunt yang berbeda.
Manual
Saya pikir dokumentasi menjawab pertanyaan dengan cukup baik, mungkin Anda tidak cukup akrab dengan node / manajer paket lainnya. Saya mungkin hanya memahaminya karena saya tahu sedikit tentang Ruby bundler.
Kuncinya adalah:
Hal-hal ini akan diinstal ketika melakukan npm link atau menginstal npm dari root paket dan dapat dikelola seperti parameter konfigurasi npm lainnya. Lihat npm-config (7) untuk informasi lebih lanjut tentang topik ini.
Dan kemudian di bawah npm-config (7) temukan dev:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
optionalDependenciessekarang.