Hacker News

Za JavaScript je možen boljši API za pretoke

Komentarji

14 min read Via blog.cloudflare.com

Mewayz Team

Editorial Team

Hacker News

JavaScriptov Streams API ima težavo – in razvijalci končno spregovorijo o tem

Če ste kdaj poskušali uporabiti Streams API v JavaScriptu za kaj drugega kot primer iz učbenika, ste občutili trenje. Kar bi moralo biti elegantna, sestavljiva abstrakcija za obdelavo zaporednih podatkov – branje datotek, obdelava odzivov HTTP, preoblikovanje naborov podatkov v realnem času – se pogosto sprevrže v besedni predlog, zmedeno semantiko povratnega pritiska in površino API-ja, ki je bolj podobna podjetniški Javi kot sodobnemu JavaScriptu. Pogovor o izdelavi boljšega pretočnega primitiva že leta vre v predlogih TC39, okvirnih razpravah in odprtokodnih projektih. Leta 2026 bo dosegel prelomno točko. Vprašanje ni, ali je možen boljši API za pretakanje – vprašanje je, kako "boljši" dejansko izgleda in kaj nas zadržuje.

Kje API za trenutne tokove ne uspe

WHATWG Streams Standard, ki poganja ReadableStream, WritableStream in TransformStream v brskalnikih in izvajalnih okoljih, kot sta Node.js in Deno, je bil pravi inženirski dosežek. Prinesel je protipritisk, preklic in asinhrono ponovitev v ravnanje s spletnimi podatki. Toda v praksi API zahteva preveč od razvijalca za običajne operacije. Ustvarjanje enostavnega pretvorbenega toka zahteva instanciranje TransformStream z metodo transform, upravljanje krmilnikov in skrbno ravnanje s semantiko izpiranja – vse za to, kar pomeni map() nad kosi.

Primerjajte to s tem, kako razvijalci delajo z nizi. Array.prototype.map(), filter() in reduce() so sestavljivi, berljivi in ​​zahtevajo skoraj nič slovesnosti. Streams API ne ponuja nobene od te ergonomske sestavljivosti takoj po izdelavi. Združevanje tokov prek .pipeThrough() deluje, vendar razvijalci izgubljajo ure in potrpljenje pri gradnji samih stopenj transformacije. Obravnavanje napak med cevovodnimi verigami je še ena težava – napake se ne širijo intuitivno in odpravljanje napak v pokvarjenem cevovodu pogosto pomeni vstavljanje začasnih preoblikovanj beleženja samo zato, da ugotovimo, kje so podatki padli ali poškodovani.

V sobi je tudi slon Node.js. Node ima svojo podedovano implementacijo toka (stream.Readable, stream.Writable), ki je pred standardom WHATWG skoraj desetletje. Oba sistema sta interoperabilna samo prek pripomočkov adapterja in številni paketi npm še vedno uporabljajo starejši API. Razvijalci, ki delajo v različnih okoljih – upodabljanje na strani strežnika, robne funkcije, obdelava v brskalniku – so prisiljeni žonglirati z dvema nezdružljivima abstrakcijama za isti koncept.

Kako bi lahko izgledal API za boljše pretoke

Več predlogov in poskusov skupnosti kaže na bolj prijazno prihodnost razvijalcem. Osnovne zamisli se še naprej združujejo na nekaj načelih: funkcionalna sestava, asinhrona poravnava iteratorja in zmanjšana predpostavka. Predstavljajte si, da lahko pišete pretočne podatkovne cevovode tako naravno, kot pišete transformacije matrike – veriženje .map(), .filter() in .take() neposredno na berljiv tok, ne da bi morali konstruirati vmesne objekte TransformStream.

To ni hipotetično. Predlog Iterator Helpers (zdaj na stopnji 4 v TC39) že prinaša .map(), .filter(), .take(), .drop() in .flatMap() v sinhrone iteratorje. Razširitev tega vzorca na asinhrone iteratorje — in z razširitvijo na berljive tokove, ki izpostavljajo [Symbol.asyncIterator] — je naraven naslednji korak. Nekateri izvajalniki in knjižnice so že začeli eksperimentirati s tem pristopom in razvijalcem omogočajo pisanje kode, kot je:

Najmočnejša abstrakcija pretakanja je tista, ki izgine. Ko lahko razvijalci transformacije podatkov izrazijo kot verigo preprostih funkcij – brez skrbi za krmilnike, strategije čakalnih vrst ali ročni povratni pritisk – gradijo hitreje, pošiljajo manj hroščev in dejansko uživajo v delu s pretočnimi podatki.

Cilj ni v celoti nadomestiti nizkonivojski Streams API. Vedno bodo obstajali primeri uporabe – protokoli po meri, natančen nadzor pomnilnika, implementacije binarnih kodekov – kjer je neposreden dostop krmilnika bistven. Toda za 90 % primerov uporabe, ki vključujejo branje, pretvorbo in pisanje zaporednih podatkov, mora abstraktna plast ustrezati preprostosti naloge.

Lekcije iz drugih ekosistemov

JavaScript ni prvi jezik, ki se bori z ergonomijo pretakanja. Lastnosti Iterator in Stream podjetja Rust ponujata sestavljivo abstrakcijo brez stroškov, ki razvijalcem omogoča veriženje operacij brez dodeljevanja vmesnih zbirk. Elixirjev modul Stream zagotavlja leno oštevilčevanje s čisto sintakso, prijazno do cevi. Celo Java, ki je bila pogosto kritizirana zaradi dobesednosti, je predstavila java.util.stream.Stream v Javi 8 s tekočim API-jem, ki bi ga razvijalci JavaScripta prepoznali in mu zavidali.

Tim ekosistemom je skupna zavezanost, da postanejo običajni primeri trivialni. Branje datoteke, filtriranje vrstic in pisanje rezultatov zahteva 3-5 vrstic sestavljive kode. V trenutnem API-ju Streams JavaScript se lahko ista operacija zlahka razširi na 20-30 vrstic, če upoštevate konstrukcijo toka, obravnavanje napak in pravilno razstavljanje. Razlika ni v zmogljivosti, ampak v ergonomiji.

Pythonov pristop je tudi poučen. Generatorske funkcije s yield zagotavljajo naraven način za lenobno proizvodnjo in porabo zaporednih podatkov. JavaScript ima tudi funkcije generatorja, vendar jih je treba premostiti z API-jem Streams in jih oviti v konstruktorje ReadableStream s krmilniki, ki temeljijo na vlečenju. Tesnejša integracija med generatorji in tokovi – kjer bi lahko generatorska funkcija neposredno postala berljiv tok – bi odpravila celotno kategorijo predlogov.

Vpliv resničnega sveta na razvoj aplikacij

To ni akademska skrb. Pretakanje podatkov je v središču sodobnih spletnih aplikacij. Dogodki, poslani iz strežnika, razdeljeni odgovori HTTP, analitične nadzorne plošče v realnem času, obdelava nalaganja datotek, pretakanje izhodnih podatkov modela AI – to so vsakodnevne funkcije, ne robni primeri. Ko je primitivno pretočno pretakanje težko uporabljati, se ji razvijalci bodisi popolnoma izognejo (vse shranijo v pomnilnik, ki se ne spreminja) ali zgradijo krhke cevovode, ki jih je težko vzdrževati, ki postanejo vir produkcijskih incidentov.

Razmislite, kaj se zgodi v velikem obsegu. Platforma, kot je Mewayz, ki obdeluje podatke v 207 integriranih poslovnih modulih – od cevovodov CRM in izdajanja računov do izračunov plač in sledenja voznemu parku – interno obravnava ogromne količine zaporednih podatkov. Operacije izvoza, ustvarjanje poročil, obdelava dogodkov webhook in posodobitve nadzorne plošče v realnem času imajo koristi od učinkovitega pretakanja. Ko temeljni jezikovni primitivi otežijo pretakanje, se stroški pomnožijo v vsakem modulu in vsakem pretoku podatkov. Inženirji platforme na koncu zgradijo notranje abstrakcije pretakanja poleg abstrakcij jezika in dodajo kompleksnost, ki ne bi smela biti potrebna.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →
  • Obdelava datotek: Nalaganje in razčlenjevanje datotek CSV z več kot 100.000 vrsticami zahteva pretakanje, da se prepreči izčrpanost pomnilnika – vendar trenutni API naredi celo osnovno pretvorbo vrstice za vrstico podrobno
  • Nadzorne plošče v realnem času: Pretakanje analitičnih podatkov iz strežnika v odjemalca prek SSE ali WebSocket ima koristi od sestavljivih transformacij (združevanje, filtriranje, dušenje), ki jih je danes težko izraziti
  • Pretakanje odzivov AI: Ker funkcije, ki jih poganja LLM, postajajo standard v poslovnih orodjih, je pretakanje odzivov žeton za žetonom v uporabniški vmesnik osnovno pričakovanje – in popoln primer uporabe za verižne transformacije toka
  • Paketne operacije: Obdelava plačilnih list za tisoče zaposlenih, ustvarjanje množičnih računov ali sinhronizacija zapisov CRM z zunanjimi sistemi vključuje pretakanje podatkov skozi stopnje potrjevanja, transformacije in izpisa
  • Cevovodi spletnega trnka: zaužitje, preverjanje, usmerjanje in obdelava dohodnih dogodkov webhooka iz integracij tretjih oseb je sama po sebi delovna obremenitev pretakanja

Kaj je dejansko predlagano

Ekosistem JavaScript se premika na več frontah. Predlog TC39 Pomočniki iteratorjev je že pristal in prinaša funkcionalno sestavo sinhronim iteratorjem. Naravna razširitev — Async Iterator Helpers — bi prinesla iste metode .map(), .filter(), .reduce(), .take() in .flatMap() v asinhrone iteratorje, ki jih berljivi tokovi že izvajajo prek [Symbol.asyncIterator]. Samo to bi dramatično izboljšalo izkušnjo razvijalcev za najpogostejše vzorce pretakanja.

Poleg TC39 meje premikajo tudi inovacije na ravni izvajanja. Deno je eksperimentiral z bolj ergonomskimi pripomočki za pretakanje. Orodjarna za spletne tokove in podobne knjižnice skupnosti nudijo pomožne funkcije, ki ovijajo podrobne dele API-ja. Zamisel o standardni knjižnici, izvorni za tok – naboru vgrajenih, optimiziranih pripomočkov za običajne pretočne operacije, kot je razdelitev vrstic, razčlenjevanje JSON, obdelava CSV in stiskanje, ki jih razvijalci trenutno črpajo iz npm, je vse večji.

Obstaja tudi prepričljiv argument za boljšo semantiko napak. V današnjem API-ju lahko napaka v cevovodni verigi pusti tokove v dvoumnih stanjih – delno porabljene, z visečimi ključavnicami na čitalnikih. Revidirani API bi lahko sprejel strukturirano širjenje napak, podobno Rustovemu tipu Result, ali sprejel konvencijo, kjer napake tečejo skozi cevovod kot vrednosti, kar omogoča nadaljnjim stopnjam, da jih obravnavajo ali obnovijo, ne da bi prekinili celotno verigo. To bi bilo preobrazbo za zanesljivost proizvodnje.

Zakaj je to leta 2026 pomembno bolj kot kdaj koli prej

Zaradi treh trendov, ki se zbližujejo, je ergonomija API-ja za pretakanje zdaj bolj nujna kot kadar koli v zgodovini JavaScripta. Prvič, robno računalništvo – Cloudflare Workers, Vercel Edge Functions, Deno Deploy – deluje pod strogimi omejitvami pomnilnika in procesorja, kjer medpomnjenje celotnih odgovorov ali naborov podatkov preprosto ni izvedljivo. Pretakanje je edina možnost in razvijalci, ki uvajajo v ta okolja, potrebujejo API, ki jim ne nasprotuje.

Drugič, integracija umetne inteligence je pretakanje spremenila v funkcijo, namenjeno uporabnikom. Ko pomočnik AI ustvari odgovor, uporabniki pričakujejo, da se bodo žetoni pojavili v realnem času, ne pa čakati, da se celoten odgovor shrani v medpomnilnik. Vsaka platforma SaaS – od poslovnih operacijskih sistemov, kot je Mewayz, do samostojnih orodij AI – zdaj potrebuje robustno porabo toka na strani odjemalca. Trenutni API deluje za to, vendar bi lahko bila razvijalska izkušnja razčlenjevanja, preoblikovanja in upodabljanja pretočnega izhoda umetne inteligence bistveno boljša s sestavljivimi operaterji toka.

Tretjič, gibanje full-stack JavaScript pomeni, da razvijalci upravljajo tokove na obeh straneh omrežne meje. Posamezen inženir lahko napiše tok na strežniški strani, ki obdeluje rezultate poizvedb baze podatkov, jih prenese skozi transformacijo, jih pošlje kot razdeljen odziv HTTP in nato ta isti tok porabi na odjemalcu za upodabljanje progresivnega uporabniškega vmesnika. Ko je pretočni API neroden, se to trenje čuti na vsaki plasti sklada.

Naprej: kaj lahko razvijalci storijo danes

Medtem ko se jezik razvija, razvijalci ne čakajo. Več praktičnih strategij lahko izboljša izkušnjo pretakanja v trenutnih projektih. Uporaba asinhronskih generatorjev kot primarnega avtorskega vzorca — in njihovo zavijanje v ReadableStream.from(), kjer izvajalno okolje to podpira — zagotavlja veliko čistejšo sintakso kot ročno upravljanje krmilnika. Knjižnice, kot sta it-pipe in streaming-iterables, ponujajo pomočnike, ki jih je mogoče sestaviti in prinašajo funkcionalno veriženje današnjim asinhronim iteratorjem.

Ekipam, ki gradijo podatkovno intenzivne aplikacije, se naložba v tanek notranji sloj pripomočkov za pretakanje obrestuje. Dobro zasnovan nabor funkcij streamMap(), streamFilter() in streamBatch() – vsaka sprejme asinhrono iterabilo in vrne asinhrono iterabilo – zagotavlja sestavljivost, ki je manjka standardnemu API-ju, brez teže polnega pretočnega ogrodja. To je vzorec, ki sega od zagonskih prototipov do platform, ki upravljajo milijone operacij.

  1. Sprejmite asinhronske generatorje kot privzeti vzorec za ustvarjanje pretočnih podatkov – so čistejši, bolj preizkušeni in jih je lažje sestaviti kot ročna konstrukcija ReadableStream
  2. Uporabite ReadableStream.from() za premostitev asinhronih iterabil v svet spletnih tokov, ko potrebujete interop z API-ji, ki pričakujejo primerke ReadableStream
  3. Izdelajte ali prevzamete tanke pomožne funkcije za običajne operacije (preslikava, filter, šarža, dušilka) prek asinhronih iterablev namesto konstruiranja objektov TransformStream
  4. Zagovornik v TC39 in razpravah med izvajanjem – predlog pomočnikov asinkroniznega iteratorja potrebuje glasove razvijalcev, ki spodbujajo prednostno razvrščanje
  5. Pišite teste za asinhrone iterable, ne za neposredne tokove – to naredi vašo logiko pretakanja prenosljivo in lažjo za preverjanje

API JavaScript Streams je bil nujen temelj. Toda temelji naj bi bili nadgrajeni in naslednja plast abstrakcije – tista, ki naredi pretakanje tako naravno kot delo z nizi – je zamujena. Kosi so na svojem mestu: asinhroni iteratorji, generatorske funkcije in vzorec pomočnikov iteratorjev. Zdaj je potrebna skupna volja, da jih sestavimo v standard, ki ustreza temu, kako razvijalci dejansko razmišljajo o zaporednih podatkih. Rezultat ne bo le boljši API – odklenil bo pretakanje kot privzeti vzorec in ne v skrajni sili, zaradi česar bodo aplikacije hitrejše, bolj učinkovite pri uporabi pomnilnika in prijetnejše za izdelavo.

Pogosto zastavljena vprašanja

Kaj je narobe s trenutnim API-jem JavaScript Streams?

Trenutni Streams API trpi zaradi pretirane šablone, zmedene semantike povratnega pritiska in preveč zapletene površine API-ja, ki odvrača od sprejetja. Preprosta opravila, kot je branje datoteke ali obdelava odziva HTTP, zahtevajo veliko več kode, kot je potrebno. Razvijalci se pogosto zatečejo k knjižnicam tretjih oseb ali starejšim vzorcem, kot so povratni klici in oddajniki dogodkov, pri čemer v celoti zaobidejo standard, ker se zdi, da je ergonomija bližja podjetniški Javi kot sodobnemu JavaScriptu.

Kako bi boljši Streams API izboljšal spletni razvoj?

Preoblikovan Streams API s čistejšo sintakso, vgrajeno podporo za asinhrono iteracijo in intuitivnimi metodami sestavljanja bi dramatično poenostavil obdelavo podatkov v realnem času. Razvijalci bi lahko naravno verižili transformacije, pregledno obravnavali povratni pritisk in pisali pretočne cevovode v delčku kode. To bi naredilo progresivno upodabljanje, vire podatkov v živo in obdelavo velikih datotek dostopne vsakemu razvijalcu JavaScripta, ne le tistim, ki bi se želeli boriti s primitivi nizke ravni.

Ali lahko sodobne poslovne platforme učinkovito obravnavajo pretakanje podatkov v realnem času?

Da – platforme, kot je Mewayz, poslovni OS z 207 moduli, ki se začne pri 19 USD/mesec, že izkoriščajo učinkovite podatkovne kanale v zakulisju za analitiko, avtomatizacijo delovnih tokov in poročanje v živo. Ko se standardi pretakanja v JavaScriptu izboljšujejo, bodo orodja, zgrajena na spletnem skladu, zagotavljala še hitrejše izkušnje v realnem času, od takojšnjih posodobitev nadzorne plošče do brezhibne obdelave datotek v integriranih poslovnih modulih.

Katere alternative obstajajo, medtem ko se Streams API razvija?

Razvijalci se trenutno zanašajo na knjižnice, kot so tokovi Node.js, RxJS za reaktivno programiranje ali asinhronske generatorje v kombinaciji z zankami for-await-of za bolj ergonomsko obdelavo zaporednih podatkov. S spletom združljivi polifili in pomočniki na stopnji predlogov tudi premostijo vrzeli v standardnem API-ju. Ključno je izbrati abstrakcije, ki se ujemajo z vašim primerom uporabe – ne glede na to, ali to pomeni vzorce, ki jih je mogoče opazovati za aplikacije, ki so obremenjene z dogodki, ali preprosto asinhrono ponovitev za enostavne naloge pretvorbe podatkov.

.

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Related Guide

POS & Payments Guide →

Accept payments anywhere: POS terminals, online checkout, multi-currency, and real-time inventory sync.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime