Ada tiga pemain utama dalam ruang manajer paket:
npm
Yarn
Kinerja Tinggi npm (pnpm)
Pada dasarnya kami memiliki fungsi serupa yang diterapkan di semua manajer paket, jadi kemungkinan besar Anda akan memutuskan mana yang akan digunakan berdasarkan persyaratan non-fungsional Manajer paket , seperti kecepatan pemasangan, konsumsi penyimpanan, atau kepraktisan.
Tentu saja, cara Anda memilih untuk menggunakan setiap manajer paket akan berbeda, tetapi semuanya pada dasarnya memiliki konsep yang konsisten. Semua manajer paket di atas dapat melakukan perintah berikut:
Namun, meskipun demikian, manajer paket pada dasarnya berbeda. Biasanya npm
dan Yarn
menginstal dependensi di folder node_modules datar. (Perhatikan urutannya di sini, yarn
diurutkan terlebih dahulu, dan npm
sebelumnya bersifat rekursif). Namun pemasangan ubin juga dapat menyebabkan serangkaian masalah keamanan.
Ketidakpastian struktur ketergantungan.
Algoritme perataan itu sendiri sangat rumit dan memakan waktu.
Paket dengan dependensi yang dinyatakan
masih dapat diakses secara ilegal dalam proyek.
Oleh karena itu, pnpm
telah memperkenalkan beberapa konsep baru di folder node_modules
untuk menyimpan dependensi dengan lebih efisien. Yarn Berry
bahkan melangkah lebih jauh dengan meninggalkan mode (PnP) node_modules
sepenuhnya (lebih lanjut tentang ini di artikel lain).
Manajer paket yang paling awal dirilis adalah npm
, pada bulan Januari 2010. Ini menetapkan prinsip-prinsip inti tentang cara kerja manajer paket saat ini. Tapi karena npm
sudah ada selama lebih dari 10 tahun, mengapa ada pilihan lain? Berikut adalah beberapa alasan utama mengapa hal ini mungkin terjadi:
node_modules
memiliki algoritma resolusi ketergantungan yang berbeda (bersarang & ubin, mode node_modules
vs. PnP) danhoisting
).locking
berbeda (kinerja berbeda, seperti yang ditulis oleh yarn
itu sendiri)workspaces
) yang memengaruhi pemeliharaan dan kecepatan monorepos
Mari selami sejarah tentang bagaimana aspek-aspek ini ditentukan setelah munculnya npm
, bagaimana Yarn Classic
memecahkan beberapa masalah ini, bagaimana pnpm
memperluas konsep-konsep ini, dan bagaimana Yarn Berry
, sebagai penerus Yarn Classic
mematahkan konsep dan proses Tradisional ini.
npm
adalah pencetus pengelola paket. Banyak orang secara keliru percaya bahwa npm
adalah singkatan dari "Manajer paket Node", padahal sebenarnya tidak demikian.
Peluncurannya merupakan sebuah revolusi karena sebelumnya, dependensi proyek diunduh dan dikelola secara manual. npm
memperkenalkan hal-hal seperti file dan bidang metadatanya, menyimpan dependensi di node_modules
, skrip khusus, paket publik dan pribadi, dan banyak lagi.
Pada tahun 2020, GitHub mengakuisisi npm, sehingga pada prinsipnya npm
kini dikelola oleh Microsoft. Pada saat penulisan, versi mayor terbaru adalah v8, dirilis pada Oktober 2021.
Pada bulan Oktober 2016, Facebook mengumumkan kemitraan dengan Google dan sejumlah perusahaan lain untuk mengembangkan manajer paket baru (engineering.fb.com/2016/10/11/…) untuk mengatasi konsistensi npm yang ada saat itu. masalah keamanan dan kinerja. Mereka menamai penggantinya Benang.
Meskipun Yarn
masih dirancang dan dirancang berdasarkan banyak konsep dan proses npm
, Yarn
telah memberikan dampak yang signifikan pada bidang manajer paket. Dibandingkan dengan npm
, Yarn
memparalelkan operasi untuk mempercepat proses instalasi, yang merupakan masalah utama pada versi npm
sebelumnya.
Yarn
menetapkan standar yang lebih tinggi untuk membaca dan menulis, keamanan dan kinerja, dan menemukan banyak konsep ( npm
kemudian juga membuat banyak perbaikan untuk ini), termasuk:
monorepo
mendukungLocking
Yarn v1 dalam Memasuki mode pemeliharaan di 2020. Sejak itu, seri v1.x dianggap lawas dan berganti nama menjadi Yarn Classic
. Penerusnya Yarn v2 (Berry) kini menjadi cabang pengembangan yang lebih aktif.
pnpm
yang lebih efisienVersi 1 dari pnpm
dirilis pada tahun 2017 oleh Zoltan Kochan. Ini pengganti npm
, jadi jika Anda memiliki proyek npm
, Anda dapat langsung menggunakan pnpm
!
Alasan utama pnpm
dibuat adalah karena npm
dan Yarn
sangat mubazir dalam hal struktur penyimpanan ketergantungan yang digunakan di seluruh proyek. Meskipun Yarn Classic
memiliki keunggulan kecepatan dibandingkan npm
, ia menggunakan metode resolusi ketergantungan yang sama dengan yang tidak dimiliki pnpm
: npm
dan Yarn Classic
menggunakan hoisting
untuk meratakan node_modules
mereka.
Daripada mengoptimalkan struktur sebelumnya, pnpm
memperkenalkan strategi resolusi ketergantungan lain yang diusulkan: a struktur penyimpanan yang ditujukan pada konten. Folder node_modules
yang dihasilkan dengan metode ini sebenarnya bergantung pada direktori ~/.pnpm-store/
yang disimpan secara global di folder utama. Setiap versi dependensi disimpan secara fisik satu kali dalam folder direktori ini, membentuk satu alamat sumber untuk menghemat banyak ruang disk.
Struktur node_modules
adalah struktur dependensi bersarang yang dibuat dengan menggunakan symlinks
(di mana setiap file/paket dalam folder disimpan melalui tautan keras). (Gambar yang harus diisi: tautan lunak dan keras)
Pengaruh pnpm
terlihat dalam laporan tahun 2021: Karena inovasi mereka dalam penyimpanan beralamat konten, para pesaing ingin mengadopsi konsep pnpm
, seperti struktur tautan simbolik dan manajemen paket dalam disk yang efisien.
Yarn 2 dirilis pada Januari 2020 dan disebut sebagai peningkatan besar ke Yarn
asli. Tim Yarn
menyebutnya Yarn Berry
untuk memperjelas bahwa ini pada dasarnya adalah manajer paket baru dengan basis kode baru dan prinsip-prinsip baru.
Inovasi utama Yarn Berry
adalah pendekatan plug-and-play (PnP) sebagai strategi untuk memperbaiki node_modules. Alih-alih strategi menghasilkan node_modules
, buatlah file .pnp.cjs
dengan tabel pencarian dependensi, yang memungkinkan penanganan dependensi lebih efisien karena ini adalah file tunggal, bukan struktur folder bertumpuk. Selain itu, setiap paket disimpan dalam folder dalam bentuk file zip, bukan .yarn/cache/
, dan memakan lebih sedikit ruang disk dibandingkan node_modules
.
Semua perubahan ini terjadi begitu cepat sehingga menimbulkan banyak kontroversi setelah dirilis. Perubahan yang dapat menyebabkan gangguan pada PnP mengharuskan pengelola untuk memperbarui paket yang ada agar kompatibel dengannya. Menggunakan pendekatan PnP baru secara default dan kembali ke node_modules
pada awalnya tidak mudah, yang menyebabkan banyak pengembang terkenal tidak mempertimbangkannya dan secara terbuka mengkritik Yarn 2.
Sejak itu, tim Yarn Berry
telah mengatasi banyak masalah dalam rilis berikutnya. Untuk mengatasi masalah ketidakcocokan PnP, tim telah menyediakan cara untuk mengubah mode operasi default dengan mudah. Dengan bantuan plugin node_modules, beralih kembali ke pendekatan node_modules
tradisional hanya memerlukan satu baris konfigurasi.
Selain itu, ekosistem JavaScript telah memberikan peningkatan dukungan untuk PnP dari waktu ke waktu, dan seperti yang Anda lihat di tabel kompatibilitas ini, beberapa proyek besar telah mulai mengadopsi Yarn Berry
.
Meskipun Yarn Berry
masih muda, hal ini sudah memberikan dampak pada ruang manajer paket - pnpm
mengadopsi pendekatan PnP pada akhir tahun 2020.
Manajer paket harus terlebih dahulu diinstal pada sistem lokal dan CI/CD masing-masing pengembang.
npm
dikirimkan bersama Node.js
, jadi tidak diperlukan langkah tambahan. Selain mengunduh penginstal Node.js untuk sistem operasi Anda, penggunaan alat CLI untuk mengelola versi perangkat lunak sudah menjadi praktik umum. Dalam konteks Node, Node Version Manager (nvm) atau Volta telah menjadi utilitas yang sangat nyaman.
Anda dapat menginstal Yarn 1 dengan berbagai cara, misalnya, sebagai paket npm
: .$ npm i -g yarn
Untuk bermigrasi dari Yarn Classic ke Yarn Berry, metode yang disarankan adalah:
Instal atau perbarui Yarn Classic
ke
versi
gunakan perintah
benang set versi berry.
Namun, cara yang disarankan untuk menginstal Yarn Berry di sini adalah melalui Corepack.
Corepack dibuat oleh pengembang Yarn Berry. Inisiatif ini awalnya bernama Package Manager Manager (pmm) dan digabungkan dengan Node di LTS v16.
Dengan bantuan Corepack, Node adalah manajer paket alternatif untuk npm
yang tidak perlu Anda instal “secara terpisah” karena mencakup binari Yarn Classic
, Yarn Berry
, dan pnpm
. Shim ini memungkinkan pengguna untuk menjalankan perintah Yarn dan pnpm tanpa menginstalnya secara eksplisit terlebih dahulu dan tanpa mengacaukan distribusi Node.
Corepack sudah diinstal sebelumnya dengan Node.js ≥ v16.9.0. Namun, untuk versi Node yang lebih lama, Anda dapat menggunakan ⬇️
npm install -g corepack
untuk mengaktifkan Corepack sebelum menggunakannya. Contoh ini menunjukkan cara mengaktifkannya di Yarn Berry v3.1.1.
# Anda harus ikut serta terlebih dahulu $corepack aktifkan # shim terinstal tetapi versi konkrit perlu diaktifkan $ corepack siapkan [email protected] --aktifkan
Anda dapat menginstal pnpm
sebagai paket npm
: $ npm i -g pnpm
. Anda juga dapat menginstal pnpm menggunakan Corepack:
$ corepack siapkan [email protected] --aktifkan
Di bagian ini Anda akan melihat sekilas fitur-fitur utama dari berbagai manajer paket. Anda dapat dengan mudah menemukan file mana yang terlibat dalam konfigurasi manajer paket tertentu dan file mana yang dihasilkan oleh langkah instalasi.
Semua manajer paket menyimpan semua informasi meta penting dalam file package.json manifes proyek. Selain itu, file konfigurasi tingkat root dapat digunakan untuk menyiapkan paket pribadi yang berbeda atau konfigurasi resolusi ketergantungan yang berbeda.
Selama langkah instalasi, dependencies
disimpan dalam struktur file seperti node_modules
dan file locking
dibuat. Bagian ini tidak mempertimbangkan pengaturan ruang kerja, jadi semua contoh hanya memperlihatkan satu lokasi tempat dependensi disimpan.
menggunakan $ npm install
atau lebih pendek $ npm i
akan membuat file package-lock.json
dan folder node_modules
. Ada juga file yang dapat dikonfigurasi seperti .npmrc
yang dapat ditempatkan di direktori tingkat root. Lihat bagian selanjutnya untuk informasi lebih lanjut tentang locking
file.
. ├── simpul_modul/ ├── .npmrc ├── paket-lock.json └──
yang menjalankan $ yarn
akan membuat file yarn.lock
dan folder node_modules
. File .yarnrc
juga dapat menjadi opsi konfigurasi, dan Yarn Classic
juga mendukung file .npmrc
. Alternatifnya, Anda dapat menggunakan folder cache .yarn/cache/
dan versi Yarn Classic
terbaru yang disimpan secara lokal di .yarn/releases/
.
. ├── .benang/ │ ├── tembolok/ │ └── rilis/ │ └── benang-1.22.17.cjs ├── simpul_modul/ ├── .yarnrc ├── paket.json └── benang.lock
Karena mode instalasi khusus ini, Anda harus menangani lebih banyak file dan folder di proyek Yarn Berry
Anda dibandingkan dengan manajer paket lainnya. Ada yang opsional dan ada pula yang wajib.
Yarn Berry
tidak lagi mendukung .npmrc
atau .yarnrc
; ia memerlukan .yarnrc.yml. Untuk alur kerja tradisional dalam menghasilkan folder node_modules
, Anda harus menyediakan konfigurasi nodeLinker
untuk menggunakan konfigurasi node_modules
atau pnpm
(saya tidak mengerti bagian ini).
# .yarnrc.yml nodeLinker: node-modules # atau pnpm
yang menjalankan $ yarn
akan menginstal semua dependensi dalam folder node_modules
. Dan file yarn.lock
dibuat, yang lebih baru tetapi tidak kompatibel dengan Yarn Classic
. Selain itu, folder .yarn/cache/
dibuat untuk instalasi offline. Folder ini bersifat opsional dan digunakan untuk menyimpan versi Yarn Berry
yang digunakan oleh proyek.
. ├── .benang/ │ ├── tembolok/ │ └── rilis/ │ └── benang-3.1.1.cjs ├── simpul_modul/ ├── .yarnrc.yml ├── paket.json └── benang.lock
Baik itu mode ketat atau mode longgar untuk PnP, mengeksekusi $ yarn
dengan .pnp.cjs
dan yarn.lock
akan menghasilkan .yarn/cache/
dan .yarn/unplugged
. PnP strict adalah mode default. Jika Anda ingin mengonfigurasi mode longgar, Anda harus mengaktifkannya dalam bentuk berikut⬇️:
# .yarnrc.yml nodeLinker: pnp pnpMode: loose
Dalam proyek PnP, selain folder releases
, folder .yarn
kemungkinan juga berisi folder sdk/
yang menyediakan dukungan IDE. Tergantung pada kasus penggunaan Anda, .yarn
bahkan dapat memuat lebih banyak folder.
. ├── .benang/ │ ├── tembolok/ │ ├── rilis/ │ │ └── benang-3.1.1.cjs │ ├── SDK/ │ └── dicabut/ ├── .pnp.cjs ├── .pnp.loader.mjs ├── .yarnrc.yml ├── paket.json └── Yarn.lock`Keadaan awal
package.json
dengan proyek npm
atau Yarn Classic
juga memerlukan file pnpm
. Setelah menginstal dependensi menggunakan $ pnpm i
menghasilkan folder node_modules
, tetapi strukturnya sangat berbeda karena isinya adalah penyimpanan beralamat.
pnpm
juga membuat file kuncinya sendiri pnp-lock.yml
. Anda dapat memberikan konfigurasi tambahan menggunakan file .npmrc
opsional.
. ├── simpul_modul/ │ └── .pnpm/ ├── .npmrc ├── paket.json └── file kunci pnpm-lock.yml
Seperti disebutkan di bagian sebelumnya, setiap manajer paket membuat file kunci.
File lock
menyimpan versi pasti dari setiap dependensi yang diinstal oleh proyek Anda, sehingga memungkinkan instalasi yang lebih dapat diprediksi dan deterministik. File lock
ini penting karena versi dependen kemungkinan besar akan dideklarasikan dengan rentang versi (misalnya, ≥ v1.2.5) dan jika Anda tidak "mengunci" versi Anda, versi aktual yang diinstal mungkin berbeda.
File kunci terkadang juga menyimpan checksum (hash seingat saya), yang akan kita bahas lebih mendalam di bagian keamanan.
Mulai dari npm
v5+, mengunci file selalu menjadi fungsi utama npm
( package-lock.json
). Di pnpm
, itu adalah pnpm-lock.yaml
. yarn.lock
di Yarn Berry
muncul dalam format YAML baru.
Di bagian sebelumnya kita melihat pendekatan tradisional dalam menginstal dependensi di struktur folder node_modules
. Ini adalah solusi yang digunakan oleh npm
, Yarn Classic dan pnpm ( pnpm
lebih efisien dibandingkan yang lain).
Yarn Berry
melakukan hal berbeda dalam mode PnP. Alih-alih folder node_modules
, dependensi disimpan dalam file zip sebagai kombinasi file .yarn/cache/
dan .pnp.cjs
.
Lebih baik meletakkan file kunci ini di bawah kontrol versi, karena setiap anggota tim menginstal versi yang sama, sehingga ini memecahkan masalah "berfungsi pada mesin Anda dan mesin saya".
Tabel berikut membandingkan berbagai perintah CLI yang tersedia di npm
, Yarn Classic
, Yarn Berry
, dan pnpm
. Ini bukanlah daftar lengkap, melainkan lembar contekan. Bagian ini tidak mencakup perintah terkait alur kerja.
npm
dan pnpm
memiliki banyak alias perintah dan opsi ad hoc, yang berarti perintah dapat memiliki nama berbeda, yaitu $ npm install
vs. $ npm add
. Selain itu, banyak opsi perintah memiliki versi yang disingkat, seperti -D
dari pada --save-dev
. Di tabel, saya menyebut semua versi yang disingkat alias. Dengan menggunakan masing-masing manajer paket ini, Anda dapat menambah, memperbarui, atau menghapus beberapa dependensi.
Tabel ini mencakup perintah manajemen ketergantungan yang digunakan untuk menginstal atau memperbarui semua dependensi yang ditentukan dalam package.json
.
Tindakan | npm | Yarn Classic | Yarn Berry | pnpm | |
---|---|---|---|---|---|
install deps di package.json | npm install alias: i, tambahkan | benang install atau benang | seperti Classic | pnpm install alias: saya | |
perbarui deps di package.json acc semver | npm update alias: up, upgrade | benang | upgrade benang | semver up (melalui plugin) | alias pembaruan pnpm: |
pembaruan deps di package.json ke | N/A | pembaruanbenang | terbaru--benang | terbarupembaruan pnpm --alias terbaru: | |
-L | pembaruan | deps | acc | semver up reaksi | pnpm up |
pembaruan reaksi deps ke | pembaruan npm terbaru react@ | peningkatan benang terbaru reaksi --benang terbaru | reaksi | pnpm up -L | |
pembaruan reaksi deps secara interaktif | N/A | peningkatan benang-interaktif | peningkatan benang-interaktif (melalui plugin) | $ pnpm naik --interaktif alias: -saya | |
menambahkan runtime deps | npm saya bereaksi | benang menambahkan bereaksi | seperti | pnpm klasik menambahkan reaksi | |
menambahkan dev deps | npm i -D babel alias: --save-dev | benang menambahkan -D babel alias: --dev | seperti klasik | pnpm menambahkan -D babel alias: --save-dev | |
tambahkan deps ke package.json tanpa semver | npm i -E react alias: --save-exact | benang tambahkan -E react alias: --exact | like Classic | pnpm add -E react alias: - -save-exact | |
uninstall deps dan hapus dari package.json | npm uninstall react alias: hapus, rm, r, un, unlink | benang hapus reaksi | seperti | pnpm klasik hapus alias reaksi: rm, un, uninstall | |
uninstall deps tanpa pembaruan paket. json | npm uninstall --no-save | N/A | N/A | N/A |
Contoh berikut menunjukkan cara mengelola paket selama pengembangan. Istilah yang digunakan dalam tabel:
- Paket: ketergantungan atau
- biner Biner: Alat eksekusi dari
node_modules/.bin/
atau.yarn/cache/
(PnP)
Penting untuk dipahami bahwa Yarn Berry
hanya mengizinkan kita mengeksekusi di package.json
atau Expose file biner yang ditentukan dalam file bin/
.
Tindakan | npm | Yarn Classic | Yarn Berry | pnpm |
---|---|---|---|---|
instal paket secara global | npm i -g ntl alias: --global | benang global tambahkan ntl | N/A (global dihapus) | pnpm tambahkan --global ntl |
perbarui paket secara global | npm pembaruan -g ntl | benang peningkatan global ntl | N /A | pembaruan pnpm --global ntl |
menghapus paket secara global | npm uninstall -g ntl | benang global hapus ntl | N/A | pnpm hapus --global ntl |
jalankan binari dari terminal | npm exec ntl | benang ntl | benang ntl | pnpm ntl |
jalankan binari dari skrip | ntl | ntl | ntl | ntl |
eksekusi paket dinamis | npx ntl | N/A | benang dlx ntl | pnpm dlx ntl |
tambahkan runtime deps | npm i reaksi | benang tambahkan reaksi | seperti | Pnpm klasik tambahkan reaksi |
tambahkan dev deps | npm i -D babel alias: --save-dev | benang tambahkan -D babel alias: --dev | like Classic | pnpm add -D babel alias: --save-dev |
tambahkan deps ke package.json tanpa semver | npm i -E react alias: --save-exact | benang tambahkan -E react alias: --exact | like Classic | pnpm tambahkan -E alias reaksi: --save-exact |
uninstall deps dan hapus dari package.json | npm uninstall react alias: hapus, rm, r, batalkan | tautan benang hapus reaksi | seperti pnpm klasik | hapus alias reaksi: rm, un, uninstall |
uninstall deps tanpa pembaruan package.json | npm uninstall --no-save | N/A | N/A | N/A |
Tabel ini mencakup beberapa perintah bawaan yang berguna. Jika tidak ada perintah resmi, perintah pihak ketiga biasanya dapat digunakan melalui paket npm
atau plugin Yarn Berry
.
Tindakan | npm | Benang BenangKlasik | Berry | pnpm |
---|---|---|---|---|
terbitkan | npm terbitkan | benang terbitkan | benang npm terbitkan | pnpm terbitkan |
daftar terpasang deps | npm ls alias: daftar, la, ll | daftar benang | alias daftar pnpm: ls | |
daftar ketinggalan jaman deps | npm | benang | ketinggalan jamanbenang ketinggalan jaman peningkatan-interaktif | pnpm ketinggalan jaman |
info cetak tentang deps | npm jelaskan ntl alias: mengapa | benang mengapa ntl | suka | Pnpm klasik mengapa ntl |
init proyek | npm init -y npm init (interaktif) alias: - -yes | benang init -y benang init (interaktif) alias: --yes | benang init | pnpm init -y pnpm init (interaktif) alias: --yes |
info lisensi cetak | N/A (melalui paket pihak ketiga) | daftar lisensi benang | N/ A (atau melalui plugin, plugin lain) | N/A (melalui paket pihak ketiga) |
perbarui manajer paket versi | N/A (dengan alat pihak ketiga, misalnya, nvm) | dengan npm: kebijakan benang set-versi 1.13.0 | dengan Corepack : set benang versi 3.1.1 | N/A (dengan npm, Corepack) |
melakukan audit keamanan | npm audit | benang audit | benang npm audit | pnpm audit |
tambahkan deps ke package.json tanpa semver | npm i -E alias reaksi: --save-exact | benang tambahkan -E alias reaksi: --exact | like Classic | pnpm add -E react alias: --save-exact |
uninstall deps dan hapus dari paket.json | npm uninstall react alias: hapus, rm, r, un, unlink | Yarn hapus reaksi | seperti Classic | pnpm hapus alias reaksi: rm, un, uninstall |
uninstall deps tanpa pembaruan package.json | npm uninstall --no-save | N/A | N/A | N/A |
Mengonfigurasi manajer paket terjadi di package.json
Anda dan file konfigurasi khusus.
monorepo
Sebagian besar konfigurasi terjadi di file konfigurasi pribadi .npmrc
.
Jika Anda ingin menggunakan fitur workspaces
npm
, Anda harus menambahkan bidang metadata ruang kerja di package.json
untuk memberi tahu npm di mana menemukan subproyek atau folder ruang kerja.
// ... "ruang kerja": [ "kait", "utilitas" ] }
Setiap manajer paket dapat menggunakan registri npm
publik. Anda mungkin ingin menggunakannya kembali tanpa menerbitkannya ke pencatatan publik. Anda dapat mengonfigurasi ini untuk memprivatisasi registri di file .npmrc
Anda. (Pada dasarnya semua memiliki sumber pribadi sekarang)
# .npmrc @doppelmutzi:registry=https://gitlab.doppelmutzi.com/api/v4/projects/41/packages/npm/
Ada banyak opsi konfigurasi untuk npm
, yang terbaik adalah memeriksanya di dokumentasi.
Anda dapat mengatur workspaces
yarn
di package.json
(harus berupa paket pribadi).
{ // ... "pribadi": benar, "ruang kerja": ["ruang kerja-a", "ruang kerja-b"] }
Konfigurasi opsional apa pun dimasukkan ke dalam file .yarnrc
. Opsi konfigurasi yang umum adalah menyetel yarn-path:
ini memaksa setiap anggota tim untuk menggunakan versi biner tertentu. yarn-path
menunjuk ke folder yang berisi versi Yarn
tertentu (mis. .yarn/releases/
). Anda dapat menginstal versi Yarn Classic
terpadu menggunakan perintah (classic.yarnpkg.com/en/docs/cli…).
Mengonfigurasi workspaces
di Yarn Berry
mirip dengan konfigurasi di Yarn Classic
( package.json
). Kebanyakan konfigurasi Yarn Berry
terjadi di .yarnrc.yml
, dan ada banyak opsi konfigurasi yang tersedia.
# .yarnrc.yml benangPath: .yarn/releases/yarn-3.1.1.cjs
yarn berry
dapat menggunakan metode impor $> yarn plugin import <name>
untuk memperluas plugin (yarnpkg.com/cli/plugin/…), perintah ini akan juga diperbarui .yarnrc.yml
.
# .yarnrc.yml plugin: - jalur: .yarn/plugins/@yarnpkg/plugin-semver-up.cjs spesifikasi: "https://raw.githubusercontent.com/tophat/yarn-plugin-semver-up/master/bundles/%40yarnpkg/plugin-semver-up.js"
Seperti yang disebutkan di bagian riwayat, karena alasan kompatibilitas, Mungkin ada beberapa masalah dengan ketergantungan dalam mode ketat PnP. Ada solusi umum untuk masalah PnP jenis ini: kebijakan konfigurasi ekstensi paket.
# .yarnrc.yml paketEkstensi: "komponen-gaya@*": ketergantungan: react-is: "*"
pnpm
menggunakan mekanisme konfigurasi yang sama dengan npm
, sehingga Anda dapat menggunakan file .npmrc
. Mengonfigurasi registri pribadi juga berfungsi sama seperti menggunakan npm
. Proyek multi-paket dapat didukung dengan fitur ruang kerja pnpm. Untuk menginisialisasi monorepo
, Anda harus menentukan lokasi paket di file pnpm-workspace.yaml
.
# pnpm-workspace.yaml paket: - 'paket/**'
(Sebenarnya ada tiga konsep di sini, gudang tunggal dan banyak proyek, gudang tunggal dan proyek tunggal, dan banyak gudang dan banyak proyek)
monorepo
adalah repositori yang berisi banyak proyek. Proyek-proyek ini disebut workspace
atau paket. Menyimpan semuanya di satu tempat daripada menggunakan banyak repositori adalah strategi organisasi proyek.
Tentu saja, hal ini menimbulkan kompleksitas tambahan. Yarn Classic
adalah yang pertama mengaktifkan fitur ini, namun sekarang setiap manajer paket utama menawarkan fungsionalitas ruang kerja. Bagian ini menunjukkan cara mengonfigurasi ruang kerja Anda menggunakan masing-masing manajer paket yang berbeda.
Tim npm
telah merilis fitur ruang kerja npm yang telah lama ditunggu-tunggu di v7. Ini berisi banyak perintah CLI untuk membantu mengelola proyek multi-paket dari paket root. Sebagian besar perintah dapat digunakan dengan opsi terkait workspace
untuk memberi tahu npm
apakah harus dijalankan pada ruang kerja tertentu, beberapa, atau semua.
# Menginstal semua dependensi untuk semua ruang kerja $ npm i --ruang kerja. # dijalankan melawan satu paket $ npm jalankan tes --workspace=hook # dijalankan melawan beberapa paket $ npm jalankan pengujian --workspace=hooks --workspace=utils # lari melawan semua $ npm jalankan tes --workspaces #abaikan semua paket tes yang hilang $ npm run test --workspaces --if-present
tips: Dibandingkan dengan manajer paket lainnya, npm
v8 saat ini tidak mendukung pemfilteran lanjutan atau eksekusi paralel beberapa perintah terkait ruang kerja.
Pada bulan Agustus 2017, tim Yarn
mengumumkan dukungan monorepo
untuk fungsionalitas ruang kerja. Sebelumnya, pengelola paket hanya dapat digunakan dalam proyek multi-paket dengan perangkat lunak pihak ketiga seperti Lerna. Penambahan baru pada Yarn
ini juga membuka jalan bagi manajer paket lain untuk mengimplementasikan fungsi tersebut.
Jika Anda tertarik, Anda bisa merujuk ke cara menggunakan fungsi ruang kerja Yarn Classic dengan dan tanpa Lerna. Namun artikel ini hanya akan memperkenalkan beberapa perintah yang diperlukan untuk membantu Anda mengelola dependensi dalam pengaturan ruang kerja Yarn Classic
.
# Instal semua dependensi $yarn untuk semua ruang kerja # Tampilkan info ruang kerja pohon ketergantungan $benang # Jalankan paket lain untuk memulai $yarn workspace awesome - paket mulai # Tambahkan Webpack ke paket $benang ruang kerja yang luar biasa - penambahan paket - D webpack # tambahkan React untuk semua paket $ benang tambahkan reaksi -W
Yarn Berry
telah menampilkan ruang kerja sejak awal, karena implementasinya dibangun berdasarkan konsep Yarn Classic
. Dalam komentar Reddit, pengembang utama Yarn Berry memberikan gambaran singkat tentang fitur-fitur berorientasi ruang kerja, termasuk:
Yarn Berry
menggunakan sejumlah protokol yang dapat digunakan di bidang dependencies
atau devDependencies
pada file package.json
. Diantaranya adalah protokol workspace
.
Berbeda dengan ruang kerja Yarn Classic
, Yarn Berry
dengan jelas mendefinisikan bahwa ketergantungan harus menjadi salah satu paket dalam monorepo
ini. Jika tidak, jika versinya tidak cocok, Yarn Berry
mungkin mencoba mendapatkan versinya dari registri jarak jauh.
{ // ... "ketergantungan": { "@doppelmutzi/hooks": "ruang kerja:*", "http-server": "14.0.0", // ... } }
Melalui protokol workspace
, pnpm
telah berkontribusi pada proyek monorepo
yang mirip dengan Yarn Berry
. Banyak perintah pnpm
menerima opsi --recursive (-r)
atau --filter yang sangat berguna dalam konteks monorepo
. Perintah pemfilteran aslinya juga merupakan pelengkap yang bagus untuk Lerna
.
# pangkas semua ruang kerja pnpm -r exec -- rm -rf node_modules && rm pnpm-lock.yaml # jalankan semua pengujian untuk semua ruang kerja dengan cakupan @doppelmutzi uji jalankan rekursif pnpm --filter @doppelmutzi/`
Kinerja adalah bagian penting dari keputusan seleksi. Bagian ini menyajikan tolok ukur berdasarkan proyek skala kecil dan menengah. Berikut adalah beberapa catatan tentang contoh proyek:
Saya mengukur setiap varian manajer paket kami menggunakan tiga kasus penggunaan (UC). Untuk evaluasi dan penjelasan detailnya, silakan lihat hasil Proyek 1 (P1) dan Proyek 2 (P2).
node_modules
atau .pnp.cjs
node_modules
atau .pnp.cjs
node_modules
atau .pnp.cjs
saya menggunakan alat gnomon untuk mengukur waktu yang dibutuhkan oleh instalasi ( yarn
| gnomon
). Selain itu saya mengukur ukuran file yang dihasilkan $ du -sh node_modules
.
Hasil kinerja untuk Proyek 1 | |||||||
---|---|---|---|---|---|---|---|
Metode | npm v8.1.2 | Yarn Classic v1.23.0 | pnpm v6.24.4 | Yarn Berry PnP loose v3.1.1 | Yarn Berry PnP strict v3.1.1 | Yarn Berry node_modules v3.1.1 | Yarn Berry pnpm v3.1.1 |
UC 1 | 86,63s | 108,89s | 43,58s | 31,77s | 30,13 detik | 56,64 | detik 60,91 detik |
UC 2 | 41,54 detik | 65,49 | detik 26,43 | detik | 12,46 detik 12,66 detik46,36 | detik40,74 | detik |
UC 3 | 23,59 detik | 40,35 | detik20,32 | detik1,61 | detik 1,36 | detik28,72 | detik 31,8 |
File 9s dan ukuran | package-lock.json: 1,3M node_modules : 467M | node_modules: 397M Yarn.lock: 504K | pnpm-lock.yaml: 412K node_modules: 319M | Yarn.lock: 540K cache: 68M unplugged: 29M .pnp.cjs: 1,6M | Yarn.lock: 540K cache: 68M Unplugged: 29M . pnp.cjs: 1,5 juta | node_modules: 395 juta benang.lock: 540 ribu cache: 68 juta | node_modules: 374 juta benang.lock: 540 ribu cache: 68 juta |
hasil kinerja untuk Proyek 2 | |||||||
---|---|---|---|---|---|---|---|
Metode | npm v8.1.2 | Yarn Classic v1.23.0 | pnpm v6.24.4 | Yarn Berry PnP loose v3.1.1 | Yarn Berry PnP strict v3.1.1 | Yarn Berry node_modules v3.1.1 | Yarn Berry pnpm v3.1.1 |
UC 1 | 34.91s | 43.26s | 15.6s | 13.92s | 6.44s | 23.62s | 20.09s |
UC 2 | 7.92s | 33.65s | 8.86s | 7.09s | 5.63s | 15.12s | 14.93s |
UC 3 | 5.09s | 15.64s | 4.73s | 0.93s | 0.79s | 8.18s | 6.02s |
File dan ukuran | kunci paket .json: 684 ribu node_modules: 151M | benang.lock: 268K node_modules: 159M | pnpm-lock.yaml: 212K node_modules: 141M | .pnp.cjs: 1.1M .pnp.loader.mjs: 8.0K benang.lock: 292K .yarn: 38M | .pnp.cjs: 1.0 M .pnp.loader.mjs: 8.0K benang.lock: 292K .yarn: 38M | benang.lock: 292K node_modules: 164M cache: 34M | benang.lock: 292K node_modules: 156M cache: 34M |
npm
agak terlalu lunak dalam menangani paket yang buruk dan mengalami beberapa kerentanan keamanan yang secara langsung memengaruhi banyak proyek. Misalnya, di versi 5.7.0, saat Anda menjalankan perintah sudo npm
di sistem operasi Linux, Anda dapat mengubah kepemilikan file sistem, sehingga sistem operasi tidak dapat digunakan.
Insiden lain terjadi pada tahun 2018 yang melibatkan pencurian Bitcoin. Paket Node.js EventStream menambahkan ketergantungan berbahaya dalam versi 3.3.6. Paket berbahaya ini berisi metode kriptografi yang mencoba mencuri Bitcoin dari mesin pengembang.
Untuk membantu mengatasi masalah ini, versi npm
baru menggunakan algoritma kriptografi untuk memeriksa integritas paket yang Anda instal. SHA-512.
Yarn Classic
dan Yarn Berry
menggunakan checksum untuk memverifikasi integritas setiap paket dari awal. Yarn
juga mencoba mencegah Anda mengambil paket berbahaya yang tidak dideklarasikan di package.json
: jika ditemukan ketidakcocokan, instalasi dibatalkan.
Yarn Berry
dalam mode PnP tidak memiliki masalah keamanan seperti metode node_modules
tradisional. Dibandingkan dengan Yarn Classic
, Yarn Berry
meningkatkan keamanan eksekusi perintah. Anda hanya dapat mengeksekusi paket yang telah dideklarasikan di package.json
. Fitur keamanan ini mirip dengan pnpm
yang saya jelaskan di bawah.
pnpm
masih menggunakan checksum untuk memverifikasi integritas setiap paket yang diinstal sebelum mengeksekusi kodenya.
Seperti yang kami sebutkan di atas, npm
dan Yarn Classic
memiliki masalah keamanan karena promosi. pnpm
menghindari situasi ini karena model pengelolaannya tidak menggunakan elevasi, melainkan menghasilkan folder node_modules
yang disarangkan, sehingga menghilangkan risiko akses ketergantungan ilegal. Artinya dependensi dideklarasikan di .package.json
.
Seperti yang telah kita diskusikan, hal ini sangat penting dalam pengaturan monorepo
, karena peningkatan algoritme terkadang dapat menyebabkan ketergantungan nondeterminisme.
npm | Yarn Classic | Yarn Berry | pnpm |
Svelte | React | Jest (dengan node_modules) | Vue 3 |
Preact | Angular | Storybook (dengan node_modules) | Browserlist |
Express.js | Ember | Babel (dengan node_modules) | Prisma |
Meteor | Next.js | Redux Toolkit (dengan node_modules) | SvelteKit |
Apollo Server | Gatsby | ||
Selanjutnya | |||
Buat Aplikasi Bereaksi | |||
webpack-cli | |||
Emosi |
Memang ada perbedaan besar dalam prinsip-prinsip pengelola paket yang berbeda.
pnpm
awalnya terlihat pnpm
npm
karena penggunaan CLI mereka serupa tetapi mengelola dependensi sangat berbeda; Yarn Classic
masih populer, tetapi dianggap perangkat lunak dan dukungan warisan dapat dijatuhkan dalam waktu dekat. Yarn Berry PnP
adalah merek baru, tetapi potensinya untuk merevolusi dunia manajer paket sekali lagi belum terwujud.
Selama bertahun -tahun, banyak pengguna bertanya siapa yang menggunakan manajer paket mana, dan keseluruhan orang tampaknya sangat tertarik pada kedewasaan dan adopsi Yarn Berry PnP
.
Tujuan artikel ini adalah untuk memberi Anda banyak perspektif untuk memutuskan manajer paket mana yang akan digunakan untuk diri Anda sendiri. Saya ingin menunjukkan bahwa saya tidak merekomendasikan manajer paket tertentu. Itu tergantung pada bagaimana Anda menimbang persyaratan yang berbeda - sehingga Anda masih dapat memilih apa pun yang Anda suka!
Alamat asli bahasa Inggris: https://blog.logrocket.com/javascript-package-managers-compared/