Hari ini kami menerbitkan bagian keempat dari terjemahan Node.js. Pada artikel ini, kita akan mulai berbicara tentang npm dan juga mempertimbangkan fitur-fitur file 
package.json dan 
package-lock.json .

[Kami menyarankan Anda untuk membaca] Bagian lain dari siklus iniBagian 1: 
Informasi Umum dan MemulaiBagian 2: 
JavaScript, V8, beberapa trik pengembanganBagian 3: 
Hosting, REPL, bekerja dengan konsol, modulBagian 4: 
npm, package.json dan file package-lock.jsonBagian 5: 
npm dan npxBagian 6: 
loop acara, tumpukan panggilan, timerBagian 7: 
Pemrograman AsinkronBagian 8: 
Panduan Node.js, Bagian 8: HTTP dan Protokol WebSocketBagian 9: 
Panduan Node.js, bagian 9: bekerja dengan sistem fileBagian 10: 
Panduan Node.js, Bagian 10: Modul Standar, Streaming, Database, NODE_ENVPDF lengkap dari Node.js Guide Dasar-dasar NPM
Npm (manajer paket simpul) adalah manajer paket Node.js. Pada bagian pertama dari materi ini, kami telah menyebutkan bahwa sekarang di npm ada lebih dari setengah juta paket, yang membuatnya menjadi repositori kode terbesar di dunia yang ditulis dalam satu bahasa. Ini menunjukkan bahwa dalam npm Anda dapat menemukan paket yang dirancang untuk menyelesaikan hampir semua tugas.
Awalnya, npm dibuat sebagai sistem manajemen paket untuk Node.js, tetapi hari ini npm juga digunakan untuk mengembangkan proyek front-end dalam JavaScript. Untuk berinteraksi dengan registri npm, perintah dengan nama yang sama digunakan, yang memberi pengembang sejumlah besar peluang.
â–ŤMemuat paket
Menggunakan perintah 
npm , Anda dapat mengunduh paket dari registri. Di bawah ini kami akan mempertimbangkan contoh penggunaannya.
â–ŤMenginstal semua dependensi proyek
Jika proyek memiliki file 
package.json , maka Anda dapat menginstal semua dependensi proyek ini dengan perintah berikut:
 npm install 
Perintah ini akan mengunduh semua yang dibutuhkan proyek dan menempatkan materi-materi ini di folder 
node_modules , membuatnya jika tidak ada di direktori proyek.
â–ŤMenginstal paket terpisah
Yang terpisah dapat diinstal dengan perintah berikut:
 npm install <package-name> 
Anda dapat sering melihat bagaimana perintah ini digunakan tidak dalam bentuk yang sederhana, tetapi dengan beberapa flag. Pertimbangkan mereka:
- Bendera --savememungkinkan--saveuntuk menginstal paket dan menambahkan entri tentangnya ke bagiandependenciesdari filepackage.json, yang menjelaskan dependensi proyek. Ketergantungan ini digunakan oleh proyek untuk mengimplementasikan fungsi utamanya, mereka diinstal selama penyebarannya di server (setelah rilis npm 5, entri tentang paket yang diinstal di bagian dependensi dibuat secara otomatis, dan tanpa menggunakan flag ini).
- Bendera --save-devmemungkinkan Anda untuk menginstal paket dan menambahkan entri tentangnya ke bagian yang berisi daftar dependensi pengembangan (yaitu, paket yang diperlukan selama pengembangan proyek, seperti perpustakaan untuk pengujian, tetapi tidak diperlukan untuk operasinya) dari filepackage.jsondisebutdevDependencies.
â–Ť Pembaruan Paket
Untuk memperbarui paket, gunakan perintah berikut:
 npm update 
Setelah menerima perintah ini, npm akan memeriksa semua paket untuk versi baru mereka, dan jika mereka menemukan versi baru mereka yang memenuhi batasan versi paket yang ditentukan dalam 
package.json , instal.
Anda juga dapat memutakhirkan paket terpisah:
 npm update <package-name> 
â–ŤMengunggah paket versi tertentu
Selain unduhan paket standar, npm juga mendukung pengunduhan versi spesifiknya. Secara khusus, dapat dicatat bahwa beberapa perpustakaan hanya kompatibel dengan rilis besar tertentu dari perpustakaan lain, yaitu, jika dependensi perpustakaan tersebut dipasang tanpa mempertimbangkan versi, ini dapat mengganggu pekerjaan mereka. Kemampuan untuk menginstal versi tertentu dari sebuah paket berguna dalam situasi di mana, misalnya, rilis terbaru dari paket ini sangat cocok untuk Anda, tetapi ternyata ada kesalahan di dalamnya. Menunggu rilis versi tetap dari paket, Anda dapat menggunakan rilis yang lebih lama tetapi stabil.
Kemampuan untuk menentukan versi spesifik dari perpustakaan yang dibutuhkan oleh proyek berguna dalam pengembangan tim ketika semua anggota tim menggunakan perpustakaan yang sama persis. Transisi ke versi baru mereka juga dilakukan secara terpusat, dengan membuat perubahan pada file proyek 
package.json .
Dalam semua kasus ini, kemampuan untuk menentukan versi paket yang diperlukan oleh proyek sangat berguna. Npm mengikuti standar versi semantik (semver).
â–ŤJalankan skrip
File 
package.json mendukung kemampuan untuk menggambarkan perintah (skrip) yang dapat diluncurkan menggunakan konstruksi ini:
 npm <task-name> 
Sebagai contoh, berikut adalah tampilan daftar skrip pada bagian yang sesuai dari file:
 { "scripts": {   "start-dev": "node lib/server-development",   "start": "node lib/server-production" } } 
Sangat umum untuk menggunakan fitur ini untuk memulai Webpack:
 { "scripts": {   "watch": "webpack --watch --progress --colors --config webpack.conf.js",   "dev": "webpack --progress --colors --config webpack.conf.js",   "prod": "NODE_ENV=production webpack -p --config webpack.conf.js", } } 
Pendekatan ini memungkinkan untuk mengganti input dari perintah panjang, penuh dengan kesalahan, dengan konstruksi sederhana berikut:
 $ npm watch $ npm dev $ npm prod 
â–Ť Di mana npm menginstal paket?
Saat memasang paket menggunakan npm (atau 
benang ), tersedia dua opsi instalasi: lokal dan global.
Secara default, ketika Anda menggunakan perintah seperti 
npm install lodash , paket muncul di folder 
node_modules terletak di folder proyek. Selain itu, jika perintah di atas dijalankan, npm juga akan menambahkan entri untuk pustaka 
lodash ke bagian 
dependencies file 
package.json , yang ada di direktori saat ini.
Instalasi global paket dilakukan menggunakan flag 
-g :
 npm install -g lodash 
Dengan menjalankan perintah seperti itu, npm tidak menginstal paket di folder lokal proyek. Sebagai gantinya, itu menyalin file paket ke beberapa lokasi global. Di mana tepatnya file-file ini pergi?
Untuk mengetahuinya, gunakan perintah berikut:
 npm root -g 
Pada macOS atau Linux, file paket dapat muncul di 
/usr/local/lib/node_modules . Di Windows, itu bisa berupa 
C:\Users\YOU\AppData\Roaming\npm\node_modules .
Namun, jika Anda menggunakan Node.js nvm untuk kontrol versi, jalur ke folder paket global dapat berubah.
Sebagai contoh, saya menggunakan nvm, dan perintah di atas memberi tahu saya bahwa paket global diinstal pada alamat ini: / 
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules / 
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules / 
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules / 
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules / 
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules / 
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules / 
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules / 
/Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules .
â–ŤGunakan dan jalankan paket yang diinstal dengan npm
Bagaimana cara menggunakan modul yang diinstal menggunakan npm, secara lokal atau global, jatuh ke folder 
node_modules ? Misalkan Anda menginstal perpustakaan 
lodash populer, yang berisi banyak fungsi pembantu yang digunakan dalam pengembangan JavaScript:
 npm install lodash 
Perintah seperti itu akan menginstal perpustakaan di folder lokal dari proyek 
node_modules .
Untuk menggunakannya dalam kode Anda, cukup impor menggunakan perintah need:
 const _ = require('lodash') 
Bagaimana jika paket tersebut adalah file yang dapat dieksekusi?
Dalam hal ini, file yang dapat dieksekusi akan 
node_modules/.bin/ folder di 
node_modules/.bin/ folder .
Anda dapat melihat bagaimana mekanisme ini bekerja dengan menginstal paket 
cowsay . Ini adalah program komik yang ditulis untuk baris perintah. Jika Anda mengirimkan beberapa teks ke paket ini, di konsol, dengan gaya seni ASCII, gambar seekor sapi akan ditampilkan yang "mengucapkan" teks yang sesuai. Makhluk lain dapat "menyuarakan" teks.
Jadi, setelah menginstal paket menggunakan 
npm install cowsay , itu, bersama dengan dependensinya, akan 
node_modules di 
node_modules . Dan dalam folder 
.bin tersembunyi akan ditulis tautan simbolis ke file biner cowsay.
Bagaimana cara melaksanakannya?
Tentu saja, Anda dapat memasukkan sesuatu seperti 
./node_modules/.bin/cowsay di terminal untuk memanggil program, ini adalah pendekatan yang berfungsi, tetapi jauh lebih baik menggunakan 
npx , alat untuk meluncurkan paket eksekusi npm, termasuk dalam npm sejak versi 5.2. Yaitu, dalam kasus kami, kami membutuhkan perintah berikut:
 npx cowsay 
Path ke paket npx akan ditemukan secara otomatis.
File package.json
File 
package.json adalah elemen penting dari banyak proyek berdasarkan ekosistem Node.js. Jika Anda memprogram dalam JavaScript, apakah itu pengembangan server atau klien, maka Anda mungkin sudah melihat file ini. Mengapa itu dibutuhkan? Apa yang harus Anda ketahui tentang dia dan peluang apa yang dia berikan kepada Anda?
Package.json adalah semacam file manifes untuk proyek. Dia menempatkan pada pengembang kemungkinan beragam beragam. Sebagai contoh, ini mewakili repositori pusat pengaturan untuk alat yang digunakan dalam proyek. Selain itu, ini adalah tempat 
npm dan 
benang menulis informasi tentang nama dan versi paket yang diinstal.
â–Ť Struktur file
Berikut adalah contoh file 
package.json sederhana:
 { } 
Seperti yang Anda lihat, itu kosong. Tidak ada persyaratan ketat mengenai apa yang harus ada dalam file tersebut untuk aplikasi tertentu. Satu-satunya persyaratan untuk struktur file adalah harus mengikuti aturan format JSON. Jika tidak, file ini tidak dapat dibaca oleh program yang mencoba mengakses kontennya.
Jika Anda membuat paket Node.js yang ingin Anda bagikan melalui npm, maka semuanya berubah secara radikal, dan 
package.json Anda harus memiliki seperangkat properti yang akan membantu orang lain menggunakan paket tersebut. Kami akan membicarakan lebih lanjut tentang ini nanti.
Berikut ini contoh lain 
package.json :
 { "name": "test-project" } 
Ini menetapkan properti 
name , yang nilainya adalah nama aplikasi atau paket yang materinya terkandung dalam folder yang sama di mana file ini berada.
Berikut adalah contoh yang lebih rumit yang saya ambil dari contoh aplikasi yang ditulis menggunakan Vue.js:
 { "name": "test-project", "version": "1.0.0", "description": "A Vue.js project", "main": "src/main.js", "private": true, "scripts": {   "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",   "start": "npm run dev",   "unit": "jest --config test/unit/jest.conf.js --coverage",   "test": "npm run unit",   "lint": "eslint --ext .js,.vue src test/unit",   "build": "node build/build.js" }, "dependencies": {   "vue": "^2.5.2" }, "devDependencies": {   "autoprefixer": "^7.1.2",   "babel-core": "^6.22.1",   "babel-eslint": "^8.2.1",   "babel-helper-vue-jsx-merge-props": "^2.0.3",   "babel-jest": "^21.0.2",   "babel-loader": "^7.1.1",   "babel-plugin-dynamic-import-node": "^1.2.0",   "babel-plugin-syntax-jsx": "^6.18.0",   "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",   "babel-plugin-transform-runtime": "^6.22.0",   "babel-plugin-transform-vue-jsx": "^3.5.0",   "babel-preset-env": "^1.3.2",   "babel-preset-stage-2": "^6.22.0",   "chalk": "^2.0.1",   "copy-webpack-plugin": "^4.0.1",   "css-loader": "^0.28.0",   "eslint": "^4.15.0",   "eslint-config-airbnb-base": "^11.3.0",   "eslint-friendly-formatter": "^3.0.0",   "eslint-import-resolver-webpack": "^0.8.3",   "eslint-loader": "^1.7.1",   "eslint-plugin-import": "^2.7.0",   "eslint-plugin-vue": "^4.0.0",   "extract-text-webpack-plugin": "^3.0.0",   "file-loader": "^1.1.4",   "friendly-errors-webpack-plugin": "^1.6.1",   "html-webpack-plugin": "^2.30.1",   "jest": "^22.0.4",   "jest-serializer-vue": "^0.3.0",   "node-notifier": "^5.1.2",   "optimize-css-assets-webpack-plugin": "^3.2.0",   "ora": "^1.2.0",   "portfinder": "^1.0.13",   "postcss-import": "^11.0.0",   "postcss-loader": "^2.0.8",   "postcss-url": "^7.2.1",   "rimraf": "^2.6.0",   "semver": "^5.3.0",   "shelljs": "^0.7.6",   "uglifyjs-webpack-plugin": "^1.1.1",   "url-loader": "^0.5.8",   "vue-jest": "^1.0.2",   "vue-loader": "^13.3.0",   "vue-style-loader": "^3.0.1",   "vue-template-compiler": "^2.5.2",   "webpack": "^3.6.0",   "webpack-bundle-analyzer": "^2.9.0",   "webpack-dev-server": "^2.9.1",   "webpack-merge": "^4.1.0" }, "engines": {   "node": ">= 6.0.0",   "npm": ">= 3.0.0" }, "browserslist": [   "> 1%",   "last 2 versions",   "not ie <= 8" ] } 
Seperti yang Anda lihat, ada banyak hal menarik. Yaitu, sifat-sifat berikut dapat dibedakan di sini:
- name- mengatur nama aplikasi (paket).
- version- berisi informasi tentang versi aplikasi saat ini.
- description-- descriptionsingkat dari aplikasi.
- main- mengatur titik masuk ke aplikasi.
- private- jika properti ini disetel ke- true, ini mencegah paket dari yang tidak sengaja diterbitkan ke npm.
- scripts- mendefinisikan satu set skrip Node.js yang dapat dijalankan.
- dependencies- berisi daftar paket npm yang menjadi dasar aplikasi.
- devDependencies- berisi daftar paket npm yang digunakan saat mengembangkan sebuah proyek, tetapi tidak ketika itu benar-benar berfungsi.
- engines- mengatur daftar versi Node.js tempat aplikasi berjalan.
- daftar browser - digunakan untuk menyimpan daftar browser (dan versinya) yang harus didukung aplikasi.
Semua properti ini digunakan oleh npm atau oleh alat lain yang digunakan selama siklus hidup aplikasi.
â–ŤProperti yang digunakan dalam package.json
Mari kita bicara tentang properti yang bisa digunakan di 
package.json . Di sini kita akan menggunakan istilah "paket", tetapi semua yang dikatakan tentang paket juga berlaku untuk aplikasi lokal yang tidak direncanakan untuk digunakan sebagai paket.
Sebagian besar properti yang kami uraikan hanya digunakan untuk kebutuhan 
repositori npm, beberapa digunakan oleh program yang berinteraksi dengan kode seperti npm yang sama.
Nama properti
Properti 
name menetapkan nama paket:
 "name": "test-project" 
Nama harus lebih pendek dari 214 karakter, tidak boleh termasuk spasi, hanya terdiri dari huruf kapital, tanda hubung ( 
- ) dan garis bawah ( 
_ ).
Pembatasan serupa ada karena ketika sebuah paket diterbitkan dalam npm, namanya digunakan untuk membentuk URL halaman paket.
Jika Anda menerbitkan kode paket pada GitHub, di domain publik, maka pilihan yang baik untuk nama paket adalah nama repositori GitHub yang sesuai.
Properti penulis
Properti 
author berisi informasi tentang pembuat paket:
 { "author": "Flavio Copes <flavio@flaviocopes.com> (https://flaviocopes.com)" } 
Itu dapat disajikan dalam format berikut:
 { "author": {   "name": "Flavio Copes",   "email": "flavio@flaviocopes.com",   "url": "https://flaviocopes.com" } } 
Properti kontributor
Properti 
contributors berisi array dengan informasi tentang orang-orang yang berkontribusi pada proyek:
 { "contributors": [   "Flavio Copes <flavio@flaviocopes.com> (https://flaviocopes.com)" ] } 
Properti ini mungkin terlihat seperti ini:
 { "contributors": [   {     "name": "Flavio Copes",     "email": "flavio@flaviocopes.com",     "url": "https://flaviocopes.com"   } ] } 
Properti bug
Properti 
bugs berisi tautan ke pelacak bug proyek, sangat mungkin tautan seperti itu akan mengarah ke halaman sistem pelacakan kesalahan GitHub:
 { "bugs": "https://github.com/flaviocopes/package/issues" } 
Properti beranda
Properti 
homepage memungkinkan Anda untuk mengatur beranda paket:
 { "homepage": "https://flaviocopes.com/package" } 
Properti versi
Properti 
version berisi informasi tentang versi paket saat ini:
 "version": "1.0.0" 
Saat membentuk nilai properti ini, Anda harus mengikuti aturan 
versi semantik . Ini berarti, khususnya, bahwa nomor versi selalu diwakili oleh tiga digit: xxx
Angka pertama adalah versi utama dari paket, yang kedua adalah versi minor, yang ketiga adalah versi patch.
Mengubah angka-angka ini membawa arti tertentu. Dengan demikian, rilis paket di mana kesalahan hanya diperbaiki menyebabkan peningkatan nilai versi patch. Jika sebuah paket dilepaskan, perubahan yang dibuat yang kompatibel dengan rilis sebelumnya, maka versi kecil berubah. Versi utama paket mungkin berisi perubahan yang membuat paket ini tidak kompatibel dengan paket versi utama sebelumnya.
Properti lisensi
Properti 
license berisi informasi 
license paket:
 "license": "MIT" 
Properti kata kunci
Properti 
keywords berisi serangkaian kata kunci yang terkait dengan fungsionalitas paket:
 "keywords": [ "email", "machine learning", "ai" ] 
Pilihan kata kunci yang tepat membantu orang menemukan apa yang mereka butuhkan ketika mencari paket untuk memecahkan masalah tertentu, memungkinkan mereka untuk mengelompokkan paket dan dengan cepat mengevaluasi fungsionalitas yang mungkin ketika melihat situs npm.
Deskripsi properti
Properti 
description berisi deskripsi singkat tentang paket:
 "description": "A package to work with strings" 
Properti ini sangat penting jika Anda berencana untuk mempublikasikan paket dalam npm, karena memungkinkan pengguna situs npm untuk memahami tujuan paket.
Properti repositori
Properti 
repository menunjukkan di mana repositori paket berada:
 "repository": "github:flaviocopes/testing", 
Perhatikan bahwa nilai properti ini memiliki awalan 
github . Npm juga mendukung awalan untuk beberapa layanan populer semacam ini:
 "repository": "gitlab:flaviocopes/testing", "repository": "bitbucket:flaviocopes/testing", 
Sistem kontrol versi yang digunakan dalam pengembangan paket juga dapat diatur secara eksplisit:
 "repository": { "type": "git", "url": "https://github.com/flaviocopes/testing.git" } 
Paket yang sama dapat menggunakan sistem kontrol versi yang berbeda:
 "repository": { "type": "svn", "url": "..." } 
Properti utama
Properti 
main menetapkan titik masuk ke paket:
 "main": "src/main.js" 
Ketika sebuah paket diimpor ke dalam aplikasi, ini adalah tempat pencarian akan dilakukan untuk apa yang ekspor modul yang sesuai.
Properti pribadi
Properti 
private disetel ke 
true mencegah paket agar tidak dipublikasikan secara tidak sengaja ke npm:
 "private": true 
Properti skrip
Properti 
scripts mengatur daftar skrip atau utilitas yang dapat diluncurkan menggunakan alat npm:
 "scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "unit": "jest --config test/unit/jest.conf.js --coverage", "test": "npm run unit", "lint": "eslint --ext .js,.vue src test/unit", "build": "node build/build.js" } 
Skrip ini adalah aplikasi baris perintah. Anda dapat menjalankannya menggunakan npm atau benang, masing-masing, dengan menjalankan perintah dari form 
npm run XXXX atau 
yarn XXXX , di mana 
XXXX adalah nama skrip. Misalnya, mungkin terlihat seperti ini:
 npm run dev 
Script dapat dipanggil seperti yang Anda inginkan, mereka dapat melakukan hampir semua hal yang mungkin diinginkan pengembang.
Properti ketergantungan
Properti 
dependencies berisi daftar paket npm yang diinstal sebagai dependensi paket:
 "dependencies": { "vue": "^2.5.2" } 
Saat memasang paket menggunakan npm atau benang, perintah berikut digunakan:
 npm install <PACKAGENAME> yarn add <PACKAGENAME> 
Paket-paket ini secara otomatis ditambahkan ke daftar dependensi dari paket yang sedang dikembangkan.
Properti DevDependencies
Properti 
devDependencies berisi daftar paket npm yang diinstal sebagai dependensi pengembangan:
 "devDependencies": { "autoprefixer": "^7.1.2", "babel-core": "^6.22.1" } 
Daftar ini berbeda dari yang disimpan di properti 
dependencies , karena paket yang tersedia di dalamnya diinstal hanya dalam sistem pengembang paket, dalam penggunaan praktis paket, mereka tidak digunakan.
Paket termasuk dalam daftar ini ketika mereka diinstal menggunakan npm atau benang, sebagai berikut:
 npm install --dev <PACKAGENAME> yarn add --dev <PACKAGENAME> 
Properti mesin
Properti 
engines menunjukkan versi Node.js dan produk perangkat lunak lain yang digunakan untuk menyediakan paket:
 "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0", "yarn": "^0.13.0" } 
Properti daftar browser
Properti daftar 
browserlist memungkinkan 
browserlist untuk melaporkan browser mana (dan versinya) yang akan didukung oleh pengembang paket:
 "browserslist": [ "> 1%", "last 2 versions", "not ie <= 8" ] 
Properti ini digunakan oleh Babel, Autoprefixer, dan alat lainnya. Analisis daftar ini memungkinkan mereka untuk menambah hanya paket polyfill dan mekanisme tambahan yang diperlukan untuk browser yang terdaftar.
Nilai properti daftar 
browserlist ditampilkan di sini sebagai contoh berarti bahwa Anda ingin mendukung setidaknya 2 versi utama dari semua browser dengan penggunaan minimal 1% (data ini diambil dari 
CanIUse.com ), dengan pengecualian IE 8 dan versi yang lebih lama dari browser ini (selengkapnya ini dapat ditemukan di 
halaman paket 
browserlist ).
Pengaturan penyimpanan dalam package.json untuk berbagai alat perangkat lunak
Di 
package.json Anda dapat menyimpan pengaturan untuk berbagai alat bantu seperti Babel atau ESLint.
Masing-masing alat ini memiliki properti khusus, seperti 
eslintConfig atau 
babel . Rincian tentang penggunaan properti tersebut dapat ditemukan dalam dokumentasi masing-masing proyek.
â–ŤTentang versi paket dan versi semantik
, , , . , 
~3.0.0 ^0.13.0 . , , .
, , , , :
- ~:- ~0.13.0, - . ,- 0.13.1,- 0.14.0— .
- ^:- ^0.13.0, , - . ,- 0.13.1,- 0.14.0, .
- *: , , , — .
- >: , .
- >=: , .
- <=: , .
- <: , .
- =: .
- -: , —- 2.1.0 - 2.6.2.
- ||: , .- < 2.1 || > 2.6.
:
, , -. , 
1.0.0 || >=1.1.0 <1.2.0 , 
1.0.0 , , 
1.1.0 , 
1.2.0 .
package-lock.json
package-lock.json npm 5. Node.js-. ? , 
package.json , .
, , , , .
, 
package.json . 
package.json , (- ) .
Git 
node_modules , . , 
npm install , , , 
~ , -, , , -.
^ . , , , .
, - , 
npm install . , . , , - , , , ( ) .
package-lock.json npm 
npm install .
, , ( Composer PHP) .
package-lock.json Git-, , , , , Git .
package-lock.json npm update .
â–Ť package-lock.json
package-lock.json , cowsay, npm 
install cowsay :
 { "requires": true, "lockfileVersion": 1, "dependencies": {   "ansi-regex": {     "version": "3.0.0",     "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3. 0.0.tgz",     "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="   },   "cowsay": {     "version": "1.3.1",     "resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz" ,     "integrity": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkM Ajufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==",     "requires": {       "get-stdin": "^5.0.1",       "optimist": "~0.6.1",       "string-width": "~2.1.1",       "strip-eof": "^1.0.0"     }   },   "get-stdin": {     "version": "5.0.1",     "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0. 1.tgz",     "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="   },   "is-fullwidth-code-point": {     "version": "2.0.0",     "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/ is-fullwidth-code-point-2.0.0.tgz",     "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="   },   "minimist": {     "version": "0.0.10",     "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10 .tgz",     "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="   },   "optimist": {     "version": "0.6.1",     "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",     "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",     "requires": {       "minimist": "~0.0.1",       "wordwrap": "~0.0.2"     }   },   "string-width": {     "version": "2.1.1",     "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",     "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",     "requires": {       "is-fullwidth-code-point": "^2.0.0",       "strip-ansi": "^4.0.0"     }   },   "strip-ansi": {     "version": "4.0.0",     "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",     "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",     "requires": {       "ansi-regex": "^3.0.0"     }   },   "strip-eof": {     "version": "1.0.0",     "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",     "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="   },   "wordwrap": {     "version": "0.0.3",     "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",     "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="   } } } 
. cowsay, :
- get-stdin
- optimist
- string-width
- strip-eof
, , , 
requires , :
- ansi-regex
- is-fullwidth-code-point
- minimist
- wordwrap
- strip-eof
, 
version , 
resolved , , 
integrity , .
npm 
package.json package-lock.json . npm npx.
Pembaca yang budiman! — npm yarn?
