Hacker News

JavaScript-erako korronteen API hobe bat posible da

Iruzkinak

11 min read Via blog.cloudflare.com

Mewayz Team

Editorial Team

Hacker News

JavaScript-en Streams APIak arazo bat du, eta garatzaileek azkenean horretaz hitz egiten ari dira

Inoiz saiatu bazara Streams APIa JavaScript-en erabiltzen testu-liburuen adibideaz gaindiko ezertarako, marruskadura sentitu duzu. Datu sekuentzialak kudeatzeko abstrakzio dotore eta konposagarria izan beharko lukeena (fitxategiak irakurtzea, HTTP erantzunak prozesatzea, datu-multzoak denbora errealean eraldatzea) sarritan hitzezko boilerplate bihurtzen da, atzerapresioaren semantika nahasian eta Javascript modernoa baino gehiago enpresa Java bezalakoa den API-azalera bihurtzen da. Streaming primitibo hobea eraikitzearen inguruko elkarrizketa urteak daramatza TC39 proposamenetan, esparruko eztabaidetan eta kode irekiko proiektuetan. 2026an, punta-puntara iristen ari da. Kontua ez da korronteen API hobe bat posible den ala ez; "hobea" benetan nolakoa den da, eta zerk eragozten gaitu.

Uneko korronteen APIa laburtzen den lekuan

Node.js eta Deno bezalako arakatzaile eta exekuzio-denboretan ReadableStream, WritableStream eta TransformStream bultzatzen dituen WHATWG Streams Standard, benetako ingeniaritza lorpena izan zen. Atzerapresioa, baliogabetzea eta iterazio asinkronikoa ekarri zituen web-natiboko datuen kudeaketara. Baina praktikan, APIak gehiegi eskatzen dio garatzaileari eragiketa arruntak egiteko. Transformazio-korronte soil bat sortzeko TransformStream bat transform metodo batekin instantziatzea, kontrolagailuak kudeatzea eta garbiketa-semantika kontu handiz kudeatzea eskatzen du - dena zatitan map() baten truke.

Konparatu hau garatzaileek arrayekin lan egiten duten moduarekin. Array.prototype.map(), filter() eta reduce() konposagarriak, irakurgarriak dira eta ia zero zeremonia behar dute. Streams API-k ez du konposagarritasun ergonomiko horietako bat eskaintzen. .pipeThrough() bidez korronteak elkarrekin sartzeak funtzionatzen du, baina eraldatze faseak beraiek eraikitzea da garatzaileek orduak eta pazientzia galtzen dutenean. Akatsak kanalizatutako kateetan zehar kudeatzea beste mingarri bat da: erroreak ez dira intuitiboki hedatzen, eta hautsitako kanalizazio bat arazteak maiz esan nahi du aldi baterako erregistro-eraldaketak txertatzea, datuak non botatzen edo hondatzen diren jakiteko.

Node.js elefantea ere badago gelan. Nodo-k bere ondare-korrontearen inplementazioa du (stream.Readable, stream.Writable), WHATWG estandarra ia hamarkada bat baino lehenagokoa dena. Bi sistemak elkarreragingarriak dira egokitzaileen utilitateen bidez soilik, eta npm pakete askok API zaharragoak erabiltzen dituzte oraindik. Ingurune guztietan lan egiten duten garatzaileek —zerbitzariaren aldetik errendatzea, ertz-funtzioak, arakatzailean oinarritutako prozesamendua— bi abstrakzio bateraezin bateragarriak egitera behartuta daude kontzeptu berdinerako.

Zein izan liteke Better Streams API bat

Hainbat proposamen eta komunitateko esperimentuek garatzaileentzako etorkizuna errespetatzen dute. Oinarrizko ideiak printzipio batzuetan bat egiten jarraitzen dute: konposizio funtzionala, iteratzaile asinkronizatuaren lerrokadura eta boilerplate murriztua. Imajinatu erreproduzitzeko datuen kanalizazioak matrize-eraldaketak idazten dituzun bezain modu naturalean idazteko gai zarela — .map(), .filter() eta .take() zuzenean irakurgarri den korronte batean kateatuz, tarteko TransformStream objektuak eraiki beharrik gabe.

Hau ez da hipotetikoa. Iteratzaileen Laguntzaileak proposamenak (orain TC39ko 4. fasean) dagoeneko .map(), .filter(), .take(), .drop() eta .flatMap() sinkronizatzaileetara ekartzen ditu. Eredu hau iteratzaile asinkronikoetara hedatzea —eta hedapenez, [Symbol.asyncIterator] agerian uzten duten korronte irakurgarrietara — hurrengo urrats naturala da. Exekuzio-denbora eta liburutegi batzuk dagoeneko hasi dira ikuspegi honekin esperimentatzen, garatzaileei honelako kodea idazten utziz:

Streaming-abstrakziorik indartsuena desagertzen dena da. Garatzaileek datuen eraldaketak funtzio soilen kate gisa adieraz ditzaketenean —kontrolagailuez, ilara-estrategiez edo eskuzko atzera-presioaz arduratu gabe—, azkarrago eraikitzen dute, akats gutxiago bidaltzen dituzte eta benetan gozatzen dute streaming datuekin lan egiten.

Helburua ez da behe-mailako Streams APIa guztiz ordezkatzea. Beti egongo dira erabilera kasuak (protokolo pertsonalizatuak, memoriaren kontrola, kodek bitar inplementazioak) non kontrolagailu zuzeneko sarbidea ezinbestekoa den. Baina datu sekuentzialak irakurtzea, eraldatzea eta idaztea dakarten erabilera kasuen % 90rako, abstrakzio-geruzak zereginaren sinpletasunarekin bat etorri beharko luke.

Beste ekosistemetako ikasgaiak

JavaScript ez da streaming ergonomiarekin borrokatzen den lehen hizkuntza. Rust-en Iterator eta Stream ezaugarriek kosturik gabeko abstrakzio konposagarria eskaintzen dute, garatzaileei eragiketak kateatzeko aukera ematen diena tarteko bildumak esleitu gabe. Elixir-en Stream moduluak enumerazio alferra eskaintzen du, sintaxi garbi eta errespetatzen duena. Nahiz eta Javak, askotan hitzezkotasunagatik kritikatua, java.util.stream.Stream Java 8-n sartu zuen JavaScript garatzaileek ezagutu eta inbidiatuko zuten API arin batekin.

Ekosistema hauek partekatzen dutena kasu arrunta hutsala bihurtzeko konpromisoa da. Fitxategi bat irakurtzeak, lerroak iragazteak eta emaitzak idazteak kode konposagarriaren 3-5 lerro behar ditu. JavaScript-en egungo Streams APIan, eragiketa bera erraz heda daiteke 20-30 lerroetara korronteen eraikuntza, erroreen kudeaketa eta desmuntaketa egokia kontuan hartzen dituzunean. Hutsunea ez da gaitasunari buruzkoa, ergonomiari buruzkoa baizik.

Python-en ikuspegia ere didaktikoa da. Sorgailu-funtzioek yield duten datu sekuentzialak nagitasunez ekoizteko eta kontsumitzeko modu naturala eskaintzen dute. JavaScript-ek sorgailu-funtzioak ere baditu, baina horiek Streams APIra konektatzeko, ReadableStream konstruktoreetan bildu behar dira tiran oinarritutako kontrolagailuekin. Sorgailuen eta korronteen arteko integrazio estuago batek (sorgailuaren funtzioa zuzenean irakurgarri bihur daitekeen korronte bat) kategoria oso bat ezabatuko luke.

Mundu errealeko eragina aplikazioen garapenean

Hau ez da kezka akademikoa. Datuak erreproduzitzea web-aplikazio modernoen oinarrian dago. Zerbitzariak bidalitako gertaerak, HTTP erantzun zatituak, denbora errealeko analisi-panelak, fitxategiak kargatzeko prozesatzea, AI ereduaren irteerako streaming - hauek eguneroko ezaugarriak dira, ez muga-kasuak. Streaming primitiboa erabiltzea zaila denean, garatzaileek guztiz saihesten dute (guztia memorian gordetzea, eskalatzen ez dena) edo produkzio-intzidentziaren iturri bihurtzen diren kanalizazio hauskor eta mantentzen zailak eraikitzen dituzte.

Kontuan izan zer gertatzen den eskalan. Mewayz bezalako plataforma batek, 207 negozio-modulu integratuetan datuak prozesatzen dituena —CRM kanalizaziotik eta fakturaziotik hasita nominak kalkulatzeko eta flotaren jarraipena— datu sekuentzialen bolumen izugarriak kudeatzen ditu barnean. Esportazio-eragiketak, txostenak sortzea, webhook gertaeren prozesatzea eta denbora errealeko panelen eguneratzeak erreprodukzio eraginkorretik etekina ateratzen du. Azpiko hizkuntza primitiboek streaminga zailtzen dutenean, kostua modulu guztietan eta datu-fluxu guztietan biderkatzen da. Plataformako ingeniariek hizkuntzaren abstrakzioen gainean barneko streaming-abstrakzioak eraikitzen amaitzen dituzte, beharrezkoa izan behar ez den konplexutasuna gehituz.

💡 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 →
  • Fitxategien prozesamendua: 100.000 errenkada baino gehiago dituzten CSV fitxategiak kargatzeko eta analizatzeko, igortzea eskatzen du memoria agortzeko, baina egungo APIak oinarrizko errenkadaz errenkadako eraldaketa zehatza bihurtzen du
  • Denbora errealeko aginte-panelak: analisi-datuak zerbitzaritik bezerora SSE edo WebSocket bidez igortzeak gaur egun adierazteko mingarriak diren eraldatze konposagarrietatik (agregazioa, iragazkia, mugatzea) onuragarria da
  • AI erantzunen transmisioa: LLM-k bultzatutako eginbideak negozio-tresnetan estandar bihurtzen diren heinean, tokenz token erantzunak IU-ra igortzea oinarrizko itxaropena da, eta kateatu daitezkeen korronte-eraldaketak erabiltzeko kasu ezin hobea
  • Lotekako eragiketak: milaka langileren nominak prozesatzea, faktura ugari sortzea edo CRM erregistroak kanpoko sistemekin sinkronizatzeak datuen streaming bidez dakar baliozkotze, eraldaketa eta irteera faseen bidez
  • Webhook kanalizazioak: hirugarrenen integrazioetatik datozen webhook-en sarrerako gertaerak irenstea, balioztatzea, bideratzea eta prozesatzea berez streaming-lanaren karga da

Benetan proposatzen dena

JavaScript ekosistema fronte anitzetan mugitzen ari da. TC39 Iteratzaileen Laguntzaileak proposamena dagoeneko iritsi da, konposizio funtzionala itertzaile sinkronoetara eramanez. Luzapen naturalak - Async Iterator Helpers - .map(), .filter(), .reduce(), .take() eta .flatMap() metodo berdinak ekarriko lituzke jada irakur daitezkeen iteradoren bidez inplementatzen dituzten iterador asinkronizatuak. [Symbol.asyncIterator]. Horrek bakarrik ikaragarri hobetuko luke garatzaileen esperientzia igorpen-eredu ohikoenetarako.

TC39tik haratago, exekuzio-mailako berrikuntzak ere muga gainditzen ari dira. Denok korronte-erabilgarritasun ergonomikoekin esperimentatu du. Web Streams Toolboxek eta antzeko komunitateko liburutegiek APIaren zati zehatzak biltzen dituzten laguntzaile funtzioak eskaintzen dituzte. Eta gero eta indar handiagoa dago jatorrizko liburutegi estandarraren baten ideiaren atzean: gaur egun garatzaileek npm-tik ateratzen duten linea zatitzea, JSON analizatzea, CSV prozesatzea eta konpresioa, hala nola, streaming-eragiketa arruntetarako erabilgarritasun optimizatuen multzoa.

Argudio sinesgarri bat ere badago erroreen semantika hobearako. Gaur egungo APIan, kanalizatutako kate bateko akats batek korronteak egoera anbiguoetan utz ditzake, partzialki kontsumituta, irakurleetan blokeoak zintzilik dituztela. Berrikusitako API batek Rust-en Emaitza motaren antzeko erroreen hedapen egituratua har dezake edo akatsak balio gisa kanalean zehar igarotzen diren konbentzio bat har dezake, beherako faseek haiek kudeatu edo berreskuratu ahal izateko kate osoa hautsi gabe. Hau eraldatzailea izango litzateke ekoizpenaren fidagarritasunerako.

Zergatik du garrantzia honek inoiz baino gehiago 2026an

Hiru joera konbergenteek JavaScript-en historiako edozein unetan baino premiazkoagoa egiten dute streaming APIaren ergonomia. Lehenik eta behin, edge computing - Cloudflare Workers, Vercel Edge Functions, Deno Deploy - memoria eta PUZaren muga zorrotzen pean funtzionatzen du, non erantzun edo datu-multzo osoak bufferatzea bideragarria ez den. Streaming-a da aukera bakarra, eta ingurune horietara zabaltzen ari diren garatzaileek haien aurka borrokatzen ez duen API bat behar dute.

Bigarrenik, AI integrazioak erabiltzaileei begirako erreprodukzioa eginbide bihurtu du. AI laguntzaile batek erantzun bat sortzen duenean, erabiltzaileek tokenak denbora errealean agertzea espero dute, ez erantzun osoa buffer arte itxaron. SaaS plataforma bakoitzak - Mewayz bezalako negozio-sistema eragileetatik hasi eta AI tresna autonomoetara - bezeroen aldetik korronte-kontsumo sendoa behar du orain. Gaur egungo APIak horretarako funtzionatzen du, baina garatzaileen esperientzia erreproduzitutako AI irteerak analizatzeko, eraldatzeko eta errendatzeko esperientzia nabarmen hobea izan liteke korronte konposagarrien operadoreekin.

Hirugarrenik, pila osoa JavaScript mugimenduak esan nahi du garatzaileek sarearen mugaren bi aldeetako korronteak kudeatzen ari direla. Ingeniari bakar batek datu-basearen kontsulten emaitzak prozesatzen dituen zerbitzariko korronte bat idatz dezake, eraldaketa baten bidez bideratzen dituena, HTTP erantzun zatikatu gisa bidaltzen dituena eta, ondoren, korronte hori bezeroan kontsumitzen duen UI progresibo bat errendatzeko. Streaming APIa deserosoa denean, marruskadura hori pilaren geruza guztietan sentitzen da.

Aurrera: Garatzaileek gaur egin dezaketena

Hizkuntzak eboluzionatzen duen bitartean, garatzaileak ez dira zain geratzen. Hainbat estrategia praktikok egungo proiektuetan streaming esperientzia hobetu dezakete. Sorgailu asinkronikoak egile-eredu nagusi gisa erabiltzeak — eta exekuzio-denborak onartzen duen ReadableStream.from()-n bilduta — eskuzko kontrolagailuen kudeaketa baino askoz sintaxi garbiagoa eskaintzen du. it-pipe eta streaming-iterables bezalako liburutegiek gaur egun iteratzaile asinkronikoei katetze funtzionala ekartzen dieten laguntzaile konposagarriak eskaintzen dituzte.

Datuetan intentsiboko aplikazioak eraikitzen dituzten taldeentzat, barneko streaming erabilgarritasun geruza fin batean inbertitzeak dibidenduak ematen ditu. Ongi diseinatutako streamMap(), streamFilter() eta streamBatch() funtzio multzoak —bakoitzak iterable asinkronizatu bat hartu eta iterable asinkronizatu bat itzultzen du— API estandarrak falta duen konposagarritasuna eskaintzen du, streaming-esparru oso baten pisurik gabe. Hau da startup-prototipoetatik milioika eragiketa kudeatzen dituzten plataformetara eskalatzen den eredua.

  1. Hartu sorgailu asinkronikoak erreprodukzio-datuak ekoizteko eredu lehenetsi gisa - garbiagoak, probagarriagoak eta konposagarriagoak dira ReadableStream eskuzko eraikuntza baino.
  2. Erabili ReadableStream.from() iterables asinkronizatuak web korronteen mundura zubitzeko ReadableStream instantzia espero duten APIekin elkarreragina behar duzunean
  3. Eraiki edo hartu erabilgarritasun-funtzio meheak ohiko eragiketetarako (mapa, iragazkia, batch, throttle) iterable asinkronizatuen gainean TransformStream objektuak eraiki beharrean
  4. Defenditu TC39 eta exekuzio garaiko eztabaidetan — iteratzaile asinkronizatuen laguntzaileen proposamenak garatzaileen ahotsak behar ditu lehentasunak bultzatzeko
  5. Idatzi probak iterable asinkronikoen aurka, ez zuzenean erreproduzitzen; horrek zure igorpenaren logika eramangarri eta balioztatzeko errazagoa egiten du

JavaScript Streams APIa ezinbesteko oinarria zen. Baina oinarriak eraiki behar dira, eta hurrengo abstrakzio-geruza - streaming-a arrayekin lan egitea bezain natural bihurtzen duena - atzeratuta dago. Piezak tokian daude: iteragailu asinkronikoak, sorgailu funtzioak eta iteratzaileen laguntzaileen eredua. Orain behar dena garatzaileek datu sekuentzialei buruz benetan pentsatzen dutenarekin bat datorren estandar batean biltzeko borondate kolektiboa da. Emaitza ez da API hobea izango; streaming-a eredu lehenetsi gisa desblokeatuko du azken baliabide gisa, eta aplikazioak azkarragoak, memoria eraginkorragoak eta eraikitzeko atseginagoak izango dira.

Ohiko galderak

Zer dago gaizki uneko JavaScript Streams APIarekin?

Gaur egungo Streams API-ak gehiegizko egoera jasaten du, atzera-presioaren semantika nahasia eta adopzioa gomendatzen duen APIaren gainazal konplexuegia. Fitxategi bat irakurtzea edo HTTP erantzuna prozesatzea bezalako zeregin sinpleek behar baino askoz kode gehiago behar dute. Garatzaileek sarritan erabiltzen dute hirugarrenen liburutegietara edo eredu zaharragoetara, hala nola dei-itzulerak eta gertaeren igorleak, estandarra erabat baztertuz, ergonomia Java enpresa-Java-tik hurbilago sentitzen delako JavaScript modernoa baino.

Nola hobetuko luke Streams API hobe batek web-garapena?

Sintaxi garbiagoa duen Streams API birdiseinatu batek, iterazio asinkronikoen euskarria integratua eta konposizio-metodo intuitiboekin denbora errealeko datuen prozesamendua izugarri erraztuko luke. Garatzaileek era naturalean kateatu ditzakete eraldaketak, atzera-presioa modu gardenean kudeatu eta streaming kanalizazioak kodearen zati batean idatzi ditzakete. Honen bidez, errendatze progresiboa, datu zuzeneko jarioak eta fitxategi handiak prozesatzea eskuragarri izango lirateke JavaScript garatzaile guztientzat, ez bakarrik maila baxuko primitiboekin borrokatzeko prest daudenentzat.

Enpresa-plataforma modernoek modu eraginkorrean kudeatu al ditzakete denbora errealeko datuen igorpena?

Bai — Mewayz bezalako plataformek, 207 moduluko negozio-sistema eragilea, 19 $ hilean hasten den, dagoeneko datu-bide eraginkorrak erabiltzen dituzte atzealdean analitiketarako, automatizazio-fluxuetarako eta zuzeneko txostenetarako. JavaScript-en streaming estandarrak hobetzen diren heinean, web-pilean eraikitako tresnek denbora errealeko esperientzia are azkarragoak emango dituzte, aginte-panelen berehalako eguneratzeetatik hasi eta negozio-modulu integratuetan fitxategiak prozesatzeko modurik gabea arte.

Zer alternatiba daude Streams APIa garatzen den bitartean?

Gaur egun, garatzaileek Node.js korronteak, RxJS programazio erreaktiborako edo for-wait-of begiztekin parekatuta dauden sorgailu asinkronikoak bezalako liburutegietan oinarritzen dira, datu sekuentzialak ergonomikoki kudeatzeko. Webarekin bateragarriak diren polyfills eta proposamen faseko laguntzaileek ere API estandarraren hutsuneak zubitzen dituzte. Gakoa zure erabilera-kasuarekin bat datozen abstrakzioak hautatzea da; horrek gertaerak asko dituzten aplikazioetarako eredu behagarriak edo iterazio asinkronizatu sinpleak esan nahi dituen datuen eraldatzeko zeregin zuzenetarako.