pnpm vs npm: przechowywanie, lockfile, workspace, mapa poleceń | We.Inc
Jak pnpm i npm przechowują pakiety, blokują wersje i obsługują monorepo, tłumacz poleceń npm na pnpm z wyszukiwarką oraz dokładne kroki bezpiecznego przeniesienia projektu.
npm kopiuje każdy pakiet do node_modules każdego projektu i spłaszcza strukturę. pnpm trzyma na dysku jeden magazyn adresowany treścią, tworzy z niego twarde dowiązania do plików i umieszcza na najwyższym poziomie node_modules tylko Twoje bezpośrednie zależności. To oszczędza miejsce na dysku i uniemożliwia kodowi importowanie pakietów, których nigdy nie zadeklarował. Większość poleceń ma bezpośrednie odpowiedniki.
Najważniejsze różnice
Temat
Gdzie znajdują się pliki pakietów
Kopia w każdym projekcie
Jeden wspólny magazyn, dowiązany twardymi linkami do projektów
Struktura node_modules
Płaska, wszystko wyniesione na górę
Tylko bezpośrednie zależności, reszta w node_modules/.pnpm
Lockfile
Gdzie deklaruje się workspace
Ścisła instalacja w CI
npm ci
pnpm install (w CI domyślny jest frozen lockfile)
Uruchomienie pakietu bez instalacji
pnpm dlx (również pnx, pnpx)
Oba narzędzia czytają ten sam package.json i instalują z tego samego rejestru, więc wybór dotyczy struktury katalogów, szybkości ponownych instalacji, narzędzi do monorepo i rygoru. Poniżej znajdziesz, jak każde z nich przechowuje pakiety, tłumacza poleceń, które już znasz, oraz kroki przeniesienia istniejącego projektu z npm na pnpm.
Wpisz polecenie npm w tłumaczu lub kliknij jeden z przykładów, aby zobaczyć odpowiednik w pnpm.
Przeczytaj sekcję o przechowywaniu, aby zrozumieć, dlaczego instalacje pnpm zajmują mniej miejsca na dysku i wyłapują niezadeklarowane importy.
Jeśli zdecydujesz się na zmianę, wykonaj kroki migracji i zacommituj nowy lockfile.
Wybierz jeden menedżer pakietów na repozytorium i usuń drugi lockfile, aby nikt nie instalował z nieaktualnego.
W CI pnpm install odmawia modyfikacji nieaktualnego lockfile, więc commituj pnpm-lock.yaml przy każdej zmianie package.json.
Jeśli pakiet psuje się pod pnpm, bo importuje coś, czego nigdy nie zadeklarował, zgłoś to jego autorom; ten import działał pod npm tylko przypadkiem.
pnpm uruchamia skrypty bez słowa run, więc pnpm dev działa, o ile nazwa skryptu nie koliduje z wbudowanym poleceniem pnpm.
Najczęściej zadawane pytania
Czy pnpm jest szybszy od npm?
pnpm często ponownie wykorzystuje pliki, które ma już w magazynie, co pomaga przy kolejnych instalacjach na tym samym komputerze. Szybkość zależy od stanu cache, sieci i wielkości projektu, więc zmierz czas obu na własnym projekcie zamiast polegać na opublikowanym benchmarku.
Czy mogę używać pnpm w projekcie z package-lock.json?
Tak. Uruchom pnpm import, aby utworzyć pnpm-lock.yaml z package-lock.json, npm-shrinkwrap.json lub yarn.lock, a potem usuń stary lockfile i node_modules i uruchom pnpm install.
Dlaczego po przejściu na pnpm moja aplikacja nie może znaleźć modułu?
Twój kod lub jakaś zależność importuje pakiet, którego nie ma w jej własnym package.json. Płaska struktura npm ukrywała ten błąd. Dodaj brakujący pakiet jako zależność tego, co go importuje.
Czy pnpm wymaga zainstalowanego Node.js?
Dokumentacja instalacji pnpm opisuje pnpm 12 jako natywny plik wykonywalny, który do własnego działania nie potrzebuje Node.js. Skrypty Twojego projektu oczywiście nadal potrzebują Node.js.
Którego powinien używać początkujący?
npm, bo jest dostarczany z Node.js i używa go prawie każdy tutorial. Przejdź na pnpm, gdy prowadzisz monorepo, masz wiele projektów na jednym komputerze lub chcesz bardziej rygorystycznej struktury node_modules.
Jak każde narzędzie przechowuje pakiety
npm zapisuje pełną kopię każdej zależności w node_modules projektu i tam, gdzie może, przenosi zagnieżdżone zależności na najwyższy poziom. Dziesięć projektów korzystających z tej samej biblioteki przechowuje dziesięć kopii.
pnpm pobiera każdy plik raz do globalnego magazynu adresowanego treścią. Projekty dostają twarde dowiązania do tych plików, więc drugi projekt z tymi samymi wersjami nie zajmuje prawie żadnego dodatkowego miejsca, a nowa wersja dodaje tylko zmienione pliki.
Wewnątrz projektu pnpm umieszcza w node_modules dowiązania symboliczne do Twoich bezpośrednich zależności, a całą resztę trzyma w node_modules/.pnpm. Pakiet ma dostęp tylko do tego, co zadeklarował.
Workspace i monorepo
Workspace w npm wymienia się w głównym package.json i uruchamia przez -w name lub --workspaces. pnpm wymienia je w pnpm-workspace.yaml i wybiera przez --filter, który rozumie też grafy zależności, na przykład pakiet razem ze wszystkim, od czego zależy.
Protokół workspace: w pnpm przypina zależność do lokalnego pakietu i nie pozwala na powrót do rejestru. Przy publikacji jest zamieniany na zwykły zakres wersji.
Przenieś projekt z npm na pnpm
Kroki migracji
pnpm import odczytuje lockfile npm, więc zachowujesz wersje, które już przetestowałeś. Uruchom testy przed commitem.
Każdy pasujący tu katalog staje się pakietem workspace. Umieść plik w katalogu głównym repozytorium.
Zależność od lokalnego pakietu
workspace:* zawsze wskazuje na lokalną kopię ui zamiast wersji z rejestru.
Tłumacz poleceń npm na pnpm
Wpisz polecenie npm
npm install -D vite
Odpowiednik w pnpm
Brak bezpośredniego odpowiednika. Większość innych poleceń npm ma w pnpm tę samą nazwę.