Package Managers w Node.js
npm, pnpm (content-addressable), yarn Berry (PnP), Bun — szybkość instalacji, workspaces, package.json i Node.js versioning.
6 package managers — porównanie
npm, pnpm, yarn v1, yarn Berry, Bun i Deno — szybkość instalacji, przechowywanie pakietów i obsługa workspaces.
| Manager | Szybkość | Store | Workspaces | Kiedy |
|---|---|---|---|---|
| npm | Baseline | node_modules per project | npm 7+ | Default, zero-config, solo |
| pnpm | 2x szybszy | Content-addressable store (~/.pnpm-store) | Tak (najlepsze) | Monorepo, disk efficiency, strictness |
| yarn v1 | Podobny do npm | node_modules per project | Tak (v1) | Legacy projects, yarn classic |
| yarn Berry (v4) | Fast (PnP) | PnP cache (brak node_modules) | Tak (zero-installs) | Zero-install, strict monorepo |
| Bun | 10-100x szybszy | Global cache (Bun store) | Tak | Speed-critical, Bun runtime |
| Deno (npm compat) | Fast | DENO_DIR cache | Ograniczone | Deno projekty, npm compat mode |
Często zadawane pytania
Co to jest pnpm i dlaczego jest szybszy od npm i yarn?
pnpm (performant npm, Zoltan Kochan, 2017): content-addressable store. Hard links zamiast kopii. Strict node_modules (non-flat). Dlaczego szybszy: npm/yarn: każdy project kopiuje paczkę do node_modules. 1000 projektów z React = 1000 kopii React. pnpm: jeden store (~/.pnpm-store). Hard links w node_modules. Mniej disk I/O. Content-addressable: hash(package@version) = ścieżka w store. Raz pobrane = zawsze dostępne. Strict node_modules: flat node_modules (npm) pozwala na phantom dependencies. pnpm: tylko zdeklarowane deps dostępne. Lepsze dla bezpieczeństwa. Phantom dependency problem: import 'moment' w A, ale A nie deklaruje moment w package.json — działa w npm (bo flat), nie działa w pnpm. pnpm workspaces: monorepo support. pnpm-workspace.yaml. packages: ['packages/*', 'apps/*']. Catalog feature (pnpm 9+): catalog: {react: '18.3.1'}. Shared version w wszystkich packages. workspace: protokół: pnpm add @myorg/shared@workspace:*. Filter: pnpm --filter @myorg/web build. --filter ... (wszystkie + zależności). Benchmarks: pnpm ~2x szybszy niż npm dla cold install. ~30% szybszy niż yarn. Warm install: pnpm wygrywa dzięki store. Migracja: npm install -g pnpm. pnpm import (z package-lock.json). .npmrc: shamefully-hoist=true (jeśli potrzebujesz flat). pnpm store: pnpm store path. pnpm store prune.
npm vs yarn — historia i różnice w 2024?
npm (Node Package Manager, 2010): wbudowany w Node.js. Domyślny. npm install, npm run, npm publish. package-lock.json (npm 5+). npm workspaces (npm 7+). npm scripts. Wersje: npm 9/10 (2024). npx — run bez instalacji. npm ci — clean install z lockfile. npm audit — security scan. npm pack — build tarball. npm registry: publiczny rejestr. Private: GitHub Packages, Verdaccio. yarn (Facebook, 2016): stworzony gdy npm był powolny i niestabilny. yarn.lock. Offline cache. Parallel installs. yarn v1 (classic): najpopularniejsza. Frozen lockfile: --frozen-lockfile. yarn v2/v3/v4 (Berry, 2020+): Plug'n'Play (PnP) zamiast node_modules. Zero-installs: lockfile + zip cache w repo. Nowatorski ale breaking. Kontrowersyjny w community. Wiele projektów pozostaje na v1. yarn Berry vs pnpm: Berry — PnP (no node_modules). pnpm — strict node_modules z hard links. Benchmark 2024: pnpm > yarn v1 > npm (cold install). npm vs pnpm dla solo dev: npm — zero config. pnpm — disk savings, strictness. Dla monorepo: pnpm workspaces (najlepsze DX). Dla enterprise: pnpm lub yarn berry. package.json engines field: 'engines': {'node': '>=20', 'pnpm': '>=9'}. volta: tool version manager. node, npm, yarn per project (.voltarc). fnm: szybka alternatywa dla nvm (Rust-based). nvm: node version manager. .nvmrc w projekcie. Automatyczne przełączanie.
Bun package manager — najszybszy w 2024?
Bun: JavaScript runtime + package manager (Jarred Sumner, 2021). bun install — najszybszy package manager. Zig + JavaScriptCore. bun install: 10-100x szybszy od npm. No node_modules copying (podobnie pnpm ale inaczej). Binary lockfile (bun.lockb) — szybszy parse. Kompatybilny z npm registry. Backward compatible z package.json. Bun workspace: podobne do pnpm workspaces. workspace:* protocol. bunfig.toml konfiguracja. bun add / bun remove / bun update. bun link / bun pm. Bun jako runtime: bun run script.ts — bez transpilacji. bun dev server. Bun test: wbudowany test runner (jak Jest). Bun build: bundler. Bun vs pnpm vs npm: install speed: Bun >> pnpm > yarn > npm. Kompatybilność: npm/pnpm lepsza dla Node.js ecosystem. Bun runtime: nie zawsze Node.js compatible. Disk usage: Bun i pnpm podobne (store-based). Bun dla Next.js: Next.js oficjalnie wspiera Bun (install only). bun install zamiast npm install. bun run dev — używa Node.js pod spodem. package manager adoption 2024: npm — 60% (domyślny). pnpm — 20% (monorepo, strict). yarn — 15% (legacy). Bun — 5% (rosnący). lock-only mode: npm ci (CI). pnpm install --frozen-lockfile. yarn install --frozen-lockfile. bun install --frozen-lockfile. Zawsze frozen lockfile w CI.
package.json — zaawansowane opcje, scripts i workspaces?
package.json kluczowe pola: name, version, description, main, module, exports, types. exports field (conditional exports): './': {import: './dist/index.mjs', require: './dist/index.cjs', types: './dist/index.d.ts'}. Dla package authors — dual ESM/CJS. scripts: pre/post hooks: pretest, postbuild. npm run build -> prebuild + build + postbuild. Lifecycle hooks: prepare (po install), prepublishOnly, prepack. cross-env: cross-platform env vars w scripts. 'build': 'cross-env NODE_ENV=production webpack'. concurrently: run multiple scripts. 'dev': 'concurrently npm:dev:*'. npm-run-all: run-p (parallel), run-s (sequential). Workspaces configuration: 'workspaces': ['packages/*', 'apps/*']. root install: npm install -> installs all workspaces. root scripts -> hoisted node_modules. Versioning: semantic versioning. ~1.2.3 (patch only). ^1.2.3 (minor + patch). 1.2.3 (exact). * (latest — niebezpieczne). Resolutions / overrides: npm overrides: {'lodash': '4.17.21'}. yarn resolutions: starsze. Wymuszaj bezpieczną wersję dependency. peerDependencies: dla plugin authors. Nie instalowane automatycznie. engines field: wymagania Node.js version. packageManager field: 'pnpm@9.0.0'. Corepack: automatyczne zarządzanie package managerem. node --experimental-corepack. private: true — zapobiegaj przypadkowemu publish. files field: które pliki trafiają do npm. bundleDependencies / optionalDependencies. sideEffects: false — tree-shaking hint.
Zarządzanie wersjami Node.js — nvm, fnm, Volta i .nvmrc?
Problem: różne projekty wymagają różnych wersji Node.js. Node.js LTS: Long Term Support. Current + Maintenance. 2024: Node.js 20 LTS (Iron), Node.js 22 LTS (Jod). nvm (Node Version Manager): najpopularniejszy. nvm install 20. nvm use 20. nvm alias default 20. .nvmrc: plik w projekcie. Zawiera: 20.11.1 lub lts/iron. nvm use (bez argumentu) -> czyta .nvmrc. auto-switching: .bashrc/.zshrc + eval nvm use. Wolny startup (~200ms). fnm (Fast Node Manager, Rust): drop-in replacement. fnm install 20. fnm use 20. Automatyczne: eval $(fnm env --use-on-cd). Znacznie szybszy niż nvm. .node-version lub .nvmrc. Volta: tool manager dla Node + npm + yarn. pin: volta pin node@20. Projekt-specific. Automatyczne switching bez eval. package.json 'volta': {'node': '20.11.1', 'pnpm': '9.0.0'}. volta install node@20. Asdf: universal version manager. Obsługuje Node, Python, Ruby, Go, Rust. .tool-versions plik. Plugin-based. nvs (Windows-friendly): cross-platform nvm. Dobry dla Windows devs. Docker: node:20-alpine. Izolacja per container. CI/CD: .nvmrc -> actions/setup-node@v4. 'node-version-file: .nvmrc'. Node.js 22 (2024): require(esm) — importuj ESM z CJS. --experimental-require-module. WebSocket (native, bez ws npm). test runner ulepszony. Permission Model stabilny. fetch stable. WHATWG URLPattern. Single Executable Applications (SEA): package Node.js app to binary.
Powiązane artykuły
Skontaktuj się z nami
Porozmawiajmy o Twoim projekcie. Bezpłatna wycena w ciągu 24 godzin.
Wyślij zapytanie
Telefon
+48 790 814 814
Pon-Pt: 9:00 - 18:00
adam@fotz.pl
Odpowiadamy w ciągu 24h
Adres
Plac Wolności 16
61-739 Poznań
Godziny pracy
Wolisz porozmawiać?
Zadzwoń teraz i porozmawiaj z naszym specjalistą o Twoim projekcie.
Zadzwoń teraz