Manual Node.js, Bagian 4: File npm, package.json dan package-lock.json

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 .




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 --save memungkinkan --save untuk menginstal paket dan menambahkan entri tentangnya ke bagian dependencies dari file package.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-dev memungkinkan 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 file package.json disebut devDependencies .

â–Ť 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 - description singkat 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 .

:

  • : , , - .
  • latest : , .

, , -. , 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?

Source: https://habr.com/ru/post/id423703/


All Articles