Ringkasan perbedaan perilaku penting:
Opsi terkait tidak dibahas di sini:
ketergantungan
dependencies
diperlukan untuk menjalankan, devDependencies
hanya 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 devDependency
dependensi 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 dev
opsi konfigurasi true
, mungkin dari baris perintah sebagai:
npm install "$package" --dev
Opsi ini false
secara 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_modules
dalam dependensi.
Misalnya jika dependency1
dan dependency2
keduanya bergantung pada dependency3
versi 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 dependency1
dan dependency2
rekan bergantung pada dependency3
, pohon proyek akan terlihat seperti:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Ini terjadi meskipun Anda tidak pernah menyebutkan dependency3
dalam package.json
file 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 Gruntfile
dengan menambahkan grunt.loadNpmTasks('grunt-contrib-uglify')
baris, tetapi grunt
pengguna 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.
optionalDependencies
sekarang.