- npm poskytuje základnú správu závislostí, verzovanie a skriptovanie potrebné na štruktúrovanie projektov, ktoré sú zamerané na workerd runtime prostredia Cloudflare.
- workerd sa od Node.js líši zameraním sa na bezpečné, webové štandardizované API, ktoré vyžadujú vrstvy kompatibility pre moduly špecifické pre Node.
- Nový režim nodejs_compat_v2 kombinuje natívne implementácie C++, polyfilly unenv a mocky, čím výrazne zlepšuje podporu balíkov npm.
- Aliasovanie modulov a selektívne polyfilly vám umožňujú prispôsobiť správanie pre nekompatibilné závislosti a odomknúť viac ekosystému npm na Workers.
Kombinácia ekosystému npm s runtime prostredím workerd od Cloudflare Môže to znieť trochu tajomne, ale v podstate ide o to, aby kód a balíčky v štýle Node.js bežali hladko na webovo orientovanej platforme. Cloudflare Workers a Pages teraz ponúkajú vylepšenú vrstvu kompatibility s Node.js, ktorá vám umožňuje načítať oveľa viac npm balíčkov bez toho, aby ste sa museli potýkať s nízkoúrovňovými rozdielmi medzi runtime prostrediami.
Tento článok vysvetľuje, ako sa balíky npm prelínajú s workerdom a nové príznaky kompatibility., ktorý ukazuje, prečo niektoré balíky zlyhávali a čo sa mení s nodejs_compat_v2 režim. Uvidíte tiež, ako sa správanie npm (inštalácia, aktualizácie, skripty a typy závislostí) hodí do projektov zameraných na workerd, aby ste mohli s istotou štruktúrovať aplikácie a vyhnúť sa prekvapeniam.
Čo je npm a prečo je dôležité pre pracovníkov
npm zostáva de facto správcom balíkov pre Node.js, ktorý poháňa kód na strane servera aj obrovskú časť dnešných frontendových nástrojov. Začal ako jednoduchý správca závislostí, ale rýchlo sa vyvinul do univerzálneho registra a rozhrania príkazového riadka, s ktorým sa prakticky každý vývojár JavaScriptu denne stretáva.
Register npm obsahuje milióny balíkov, čo znamená, že pravdepodobne existuje knižnica pre takmer akýkoľvek problém: HTTP klienti, autentifikácia, ovládače databáz, nástroje na zostavovanie, testovacie frameworky a ďalšie. Pre workerd a Cloudflare Workers je tento ekosystém požehnaním aj výzvou: získate prístup k mnohým nástrojom, ale mnohé boli vytvorené s predpokladom runtime prostredia Node.js a nie webového štandardu.
npm je rovnako kľúčové pre frontendové pracovné postupy, kde sú balíkovače, transpilátory a lintre nainštalované ako závislosti počas vývoja. Či už vytvárate React SPA alebo Worker skript, ktorý beží na workerde, pravdepodobne budete na správu závislostí a skriptov používať npm (alebo Yarn/pnpm).
V jadre npm automatizuje inštaláciu, aktualizácie a sledovanie závislostí, pričom moduly zostávajú node_modules a požiadavky na zaznamenávanie v package.jsonPre workerov založených na workerde vyzerá vaše nastavenie npm povedome, ale runtime, ktoré spúšťa váš kód, je skôr engine workerd ako samotný Node.js.
Alternatívy ako Yarn a pnpm ponúkajú rôzne CLI a výkonnostné vlastnosti., ale pri zacielení na workerd je koncept rovnaký: správca balíkov rieši moduly, zatiaľ čo nástroje na zostavenie a príznaky kompatibility Cloudflare rozhodujú o tom, ako sa tieto moduly vykonávajú v runtime prostredí Worker.
Ako funguje inštalácia závislostí pomocou npm

Spustením štandardného príkazu npm install sa naplní váš node_modules čítaním zoznamov závislostí a stiahnutím každého uvedeného balíka spolu s jeho tranzitívnymi závislosťami, takže nemusíte manuálne naháňať vnorené požiadavky.
Na pridanie novej knižnice zvyčajne spustíte jeden inštalačný príkaza od verzie npm 5 sa automaticky pridáva do dependencies časť package.json pokiaľ toto správanie neprepíšete.
npm podporuje príznaky, ktoré klasifikujú, ako sa balík používa vo vašom projekte, čo je užitočné pri cielení na runtime prostredia ako workerd, kde môžete chcieť rôzne balíčky alebo procesy zostavovania:
--save-devpridá balík dodevDependencies, pričom ho označí ako potrebné iba počas vývoja alebo krokov zostavovania, ako sú napríklad spúšťače testov alebo zväzovače.--no-saveinštaluje sa bez úpravpackage.json, praktické pre rýchle experimenty alebo jednorazové príkazy.--save-optionalvloží balík dooptionalDependencies, takže zlyhania inštalácie neprerušia celý proces.--no-optionalzabraňuje inštalácii voliteľných závislostí, čím sa znižuje zaťaženie alebo sa vyhýba problematickým voliteľným balíkom na niektorých platformách.
Rozdiel medzi dependencies a devDependencies dôležité pri stavbe pre pracovníkov, pretože zvyčajne je potrebné zväzovať a dodávať iba závislosti za behu; závislosti pre vývojárov sa počas zostavovania odstraňujú, čím sa zmenšujú nasadenia.
Voliteľné závislosti vám poskytujú flexibilné riešenie zlyhaní, ale váš kód musí pred ich použitím overiť dostupnosť. Toto pomáha, keď by mal balík používať rôzne implementácie v Node.js oproti workerdu alebo sa vrátiť k pôvodnému modulu, keď nie je podporovaný.
Správa aktualizácií a verzií v npm projektoch
Príkaz update v npm aktualizuje balíčky podľa deklarovaných rozsahov semver., skenovanie nainštalovaných modulov a ich aktualizácia na najnovšie povolené verzie pre priame aj vnorené závislosti.
V prípade potreby môžete aktualizovať aj jeden balík, užitočné, ak knižnica vydá opravu chyby alebo vylepšenie, ktoré ovplyvňuje váš Worker alebo jeho kompatibilitu s behovými prostrediami mimo Node, ako napríklad workerd.
npm sa riadi sémantickým verzovaním, čo vám umožňuje presne kontrolovať hranice aktualizácií, čo je kritické, keď váš pracovník závisí od knižnice viazanej na konkrétnu hlavnú verziu alebo keď sa v upstreame zavádzajú zásadné zmeny.
Uzamykanie verzií a používanie lockfiles udržiava reprodukovateľné zostavenia, takže tímy a prostredia CI vytvárajú rovnaký graf závislostí medzi lokálnymi vývojovými, stagingovými a produkčnými pracovníkmi.
npm skripty a automatizácia v pracovných postupoch založených na workerde
scripts pole v package.json slúži ako spúšťač skriptov, čo vám umožňuje namapovať krátke názvy na dlhšie príkazy CLI a spustiť ich pomocou npm run <script-name>.
Moderné projekty používajú npm skripty na obalenie nástrojov na zostavovanie, testov a balíkova Worker projekty zamerané na workerd bežne týmto spôsobom sprístupňujú príkazy na zväzovanie, kontrolu typov a nasadzovanie.
Bežným vzorom je pripojenie zväzovača alebo spúšťača úloh prostredníctvom položky skriptu, čím sa zložité volanie rozhrania príkazového riadka premení na jednoduchý príkaz prístupný celému tímu.
Skriptovanie sa stáva výkonným v kombinácii s príznakmi kompatibility Node.js pre workerd, pretože skripty môžu ovládať, ktoré možnosti kompatibility sú aktívne a aké polyfilly alebo aliasy sa použijú pred zbalením finálneho Workera.
workerd vs. Node.js: pochopenie medzery za behu
workerd je open-source JavaScript a WebAssembly engine optimalizovaný pre edge execution, postavený na V8 – rovnakom nízkoúrovňovom engine, aký používajú Node.js a Chromium – ale navrhnutý s odlišnými prevádzkovými podmienkami a modelmi dôveryhodnosti.
Node.js bol vytvorený na spúšťanie JavaScriptu na hostiteľskom operačnom systéme a poskytuje výkonné systémové API. ako process, fs a nízkoúrovňové kryptografické nástroje, vďaka čomu je ideálny pre servery, rozhrania príkazového riadku a backendovú infraštruktúru s priamym prístupom k počítaču.
workerd je vyladený na spúšťanie nedôveryhodného kódu v multi-tenant edge procesoch, s dôrazom na izoláciu a webovo orientované API, ako napríklad fetch, streamy a väzby špecifické pre Cloudflare (KV, Durable Objects, interné RPC) namiesto prístupu k súborovému systému alebo procesom.
Na zlepšenie interoperability Cloudflare pomohol založiť WinterCG, ktorého cieľom je zosúladiť runtime prostredia JavaScriptu na strane servera a webovú platformu okolo spoločnej sady API, aby sa aplikácie správali podobne vo všetkých prostrediach.
Mnoho npm balíkov však predpokladá prostredie Node.js a importuje vstavané moduly. Ako events, fs, net, crypto or bufferBez vrstvy kompatibility môžu tieto importy zlyhať, pretože workerd automaticky neposkytuje moduly špecifické pre uzol.
Od polyfillov k vstavaným Node.js API v Workeroch
Cloudflare sa spočiatku spoliehal na polyfilly na prepojenie Node.js a workerdu., pomocou implementácií JavaScriptu na napodobňovanie rozhraní Node API. V roku 2021 získali Workers režim kompatibility založený na polyfilloch a Wrangler začal tieto polyfilly vkladať, keď node_compat = true bol zasadený wrangler.toml.
s node_compat = true, Wrangler pridal JS implementácie pre niekoľko základných modulov Node, využívajúc pluginy ako @esbuild-plugins/node-globals-polyfill a rollup-plugin-node-polyfills takže dovozy ako napr. import EventEmitter from 'events' mohol pracovať v robotníckej službe.
Polyfilly umožnili spustenie mnohých npm balíkov na Workeroch, ale mali obmedzenia., najmä pre moduly, ktoré vykonávajú náročnú binárnu alebo kryptomenovú prácu, kde sú natívne implementácie oveľa rýchlejšie a presnejšie ako čisté JS moduly.
Buffer je jasným príkladom funkcie, ktorú je ťažké efektívne napodobniť v používateľskom prostredí, keďže operácie ako kopírovanie a konverzie kódovania profitujú z optimalizovaných natívnych implementácií. To isté platí pre API ako Crypto a AsyncLocalStorage.
Pre zlepšenie výkonu a úplnosti začal Cloudflare vkladať niektoré rozhrania Node API do runtime prostredia. v roku 2023 prostredníctvom nodejs_compat príznak; tieto základné moduly sú implementované v jazyku C++ a zobrazujú sa Workerom pre lepšiu vernosť ako JS polyfilly.
Pri použití vstavaných modulov Node v Workers by ste ich mali importovať spolu s node: prefix, Napríklad import { Buffer } from 'node:buffer', čo signalizuje závislosť od modulu poskytovaného runtime prostredím, a nie od balíka registra.
Prečo mnoho npm balíkov stále zlyhalo so skorými verziami nodejs_compat
Čoskoro nodejs_compat stále spôsobovalo zlyhania, pretože mnoho knižníc používalo import bez predponynapr. import { EventEmitter } from 'events', ktoré balíkovač považoval za moduly súborového systému a nedokázal ich vyriešiť, keď neboli prítomné.
Pri importovaní ovládačov sa vyskytla bežná chyba, ako napríklad pg ktoré závisia od základných modulov bez predpony, čo spôsobilo, že kroky zostavovania hlásili, že modul nebol nájdený, aj keď ho Node považuje za vstavaný.
Vývojári čelili kompromisu medzi malou podporou natívneho API a pomalšou, neúplnou sadou polyfillov, plus chýbajúce globálne premenné ako process o ktorých mnohé knižnice predpokladali, že budú existovať na globálnom objekte.
Kvôli tomuto treniu bolo ťažké spoľahlivo používať komplexné npm balíky na workerde., najmä keď nepriame závislosti očakávali špecifické moduly alebo globálne premenné uzla, čo viedlo k zlyhaniam počas zostavovania predtým, ako sa Worker mohol spustiť.
Nový nodejs_compat_v2: lepšia podpora npm na workerde
nodejs_compat_v2 kombinuje natívne implementácie s polyfillmi na požiadanie, čím sa oveľa viac z ekosystému npm využije na Workeroch rozhodovaním o tom, kedy použiť moduly podporované C++, JS polyfilly alebo odľahčené stuby, ktoré umožňujú úspešný import.
Povoľte tento režim pridaním compatibility_flags = ["nodejs_compat_v2"] na wrangler.toml, čo mení spôsob, akým behové prostredie sprístupňuje rozhrania Node API, a spôsob, akým Wrangler zväzuje importy a závislosti v štýle Node.
Mnoho balíkov, ktoré sa predtým nedali importovať, sa teraz vo verzii 2 načíta správne., vrátane knižníc ako napr. body-parser, jsonwebtoken, got, passport, knex a ďalšie – zníženie chýb počas zostavovania v prospech lokalizovanej spätnej väzby za behu pre nepodporované operácie.
Vo verzii 2 môžete importovať napríklad takto import { Buffer } from 'buffer' a behové prostredie ich efektívne smeruje implementácie podporované jazykom C++; zároveň moduly ako net môže byť polyfillovaný spoločnosťou Wrangler pomocou unenv, čo umožňuje koexistenciu natívnych a polyfillovaných API bez konfliktov.
Wrangler teraz vkladá polyfilly iba do modulov uzlov, ktoré váš pracovník skutočne používa., čím sa udržiava nízka veľkosť balíčkov analýzou kódu a závislostí namiesto štandardného dodávania celej sady polyfillov.
polyfilly unenv a napodobeniny API rozhraní Node.js
Keď nie je k dispozícii natívna implementácia alebo zrelý polyfill, unenv poskytuje simulované moduly ktoré sprístupňujú rovnaké rozhrania, ale buď vykonávajú no-operácie, alebo vyvolávajú popisné chyby za behu, keď sa volajú nepodporované metódy.
Chyby ako napr [unenv] <method name> is not implemented yet! sú explicitnejšie a lokalizovanejšie, čo umožňuje, aby sa pracovník spustil a zlyhal iba na mieste volania, ktoré spúšťa nekompatibilitu, namiesto prerušenia v čase zostavovania.
Simulované moduly umožňujú import a používanie balíkov, ktoré čiastočne závisia od funkcií Node., pokiaľ sa vyhnete nepodporovaným častiam; bezpečné časti sa môžu spustiť, zatiaľ čo operácie závislé od súboru spúšťajú chyby iba v prípade ich vykonania.
Predtým akýkoľvek dovoz fs mohol by spôsobiť, že balík bude v programe Workers nepoužiteľný, ale s nodejs_compat_v2 a unenv napodobňuje, že závislosť môže byť zahrnutá a vyvolaná selektívne.
Tento prechod od spätnej väzby počas zostavovania k spätnej väzbe počas behu zjednodušuje ladenie, pretože môžete presne identifikovať, ktorá metóda a zásobník volaní spúšťajú nekompatibilitu, a potom ako riešenie reštrukturalizovať kód alebo poskytnúť cielené polyfilly alebo aliasy.
Aliasing modulov: prispôsobenie správania pre problematické závislosti
Aliasovanie modulov vám umožňuje presmerovať importy do vašich vlastných implementácií, nakonfigurovaný v wrangler.toml, takže problematická cesta k modulu sa namiesto predvoleného správania vyrieši na vlastný súbor.
Ak je knižnica závislá od fs.readFile ale nepotrebujete prístup k súborovému systému, alias "fs" na ./fs-polyfill a odhaliť zvyk readFile ktorý zaznamenáva, volá iné API alebo číta z KV.
Po aliasingu sa importy, ako napríklad import { readFile } from 'fs' previesť na váš modul a obísť predvolené hodnoty unenv, čím sa zabráni chybám „ešte nie je implementované“ a zároveň sa zachová nezmenený spotrebný balík.
Aliasing tiež pomáha, keď závislosť stiahne balíky špecifické pre uzol, ako napríklad node-fetch, ktoré sa môžu spoliehať na nepodporované moduly Node; môžete mapovať "node-fetch" do modulu, ktorý reexportuje globálne fetch.
Nástroje ako nolyfill zjednodušiť vzorce reexportu, čo vám umožňuje skrátiť nekompatibilné implementácie a zachovať funkčnosť závislých balíkov na workrd.
Aliasovanie modulov funguje ako flexibilná vrstva kompatibility nad nodejs_compat_v2, čo vám umožňuje prispôsobiť konkrétne balíky bez ich prepisovania alebo rozvetvenia.
Výkon, spolupráca v ekosystéme a zavádzanie
Kritické rozhrania Node.js API implementované natívne v C++ v rámci workerdu poskytujú lepší výkon a správnosť.a moduly ako Buffer, AsyncLocalStorage a Crypto využívať tieto natívne implementácie zabalené v JS moduloch, ktoré odrážajú správanie uzla.
Cloudflare prispieva k unenv, ktorý poskytuje inteligentné polyfilly a mocky na požiadanie, pretože je zameraný na viacero behových prostredí a bol prijatý projektmi ako Nuxt a Nitro; pridávanie iba nevyhnutných polyfillov udržiava aplikácie ľahké a podporuje konvergenciu ekosystémov.
Širším cieľom je prenositeľnosť kódu v štýle Node medzi rôznymi prostrediami runtime., takže vývojári môžu napísať raz a spustiť ho na Node.js, Workerde alebo iných prostrediach s minimálnym trením automatickým výberom polyfillov a natívnych funkcií na základe použitia.
Zlepšené správanie v nodejs_compat_v2 očakáva sa, že sa časom stane predvolenou podmienkou keď je dátum kompatibility vášho pracovníka dostatočne nedávny, aby viac pracovníkov transparentne profitovalo zo silnejšej kompatibility s npm bez dodatočnej konfigurácie.
Vývojárom sa odporúča vyskúšať vylepšenú kompatibilitu s Node.js a aktualizovať svoje wrangler.toml, hlásenie zostávajúcich nekompatibilitácií alebo chýb prostredníctvom kanálov spätnej väzby, aby sa medzery mohli odstrániť.
Kombinácia vyspelej správy závislostí v npm, bezpečného webovo orientovaného runtime prostredia workerd a vyvíjajúcej sa vrstvy kompatibility s Node.js vám poskytuje praktickú cestu k opätovnému použitiu obrovského množstva existujúceho JavaScriptového kódu a zároveň k využitiu výhod edge execution, izolácie a funkcií platformy Cloudflare. Vďaka inteligentným polyfillom, natívnym implementáciám, mockingu a aliasingu modulov, ktoré máte k dispozícii, sa stáva oveľa realistickejším priniesť sofistikované npm balíky do vašich Worker projektov bez neustáleho boja s runtime prostredím.