Hacker News

JavaScript үшін жақсырақ ағындар API мүмкіндігі бар

Пікірлер

2 min read Via blog.cloudflare.com

Mewayz Team

Editorial Team

Hacker News

JavaScript's Streams API-де мәселе бар - және әзірлеушілер бұл туралы ақырында сөйлесіп жатыр

Егер сіз оқулық үлгісінен басқа кез келген нәрсе үшін JavaScript-те Streams API қолданбасын қолданып көрген болсаңыз, үйкелісті сездіңіз. Кезекті деректерді өңдеуге арналған талғампаз, құрастырылатын абстракция қандай болуы керек — файлдарды оқу, HTTP жауаптарын өңдеу, деректер жиынын нақты уақытта түрлендіру — көбінесе толық түсінікті тақтаға айналады, кері қысымның семантикасын шатастырады және заманауи JavaScript-тен гөрі кәсіпорын Java-ға көбірек ұқсайтын API бетіне айналады. Жақсырақ ағындық примитив құру туралы әңгіме жылдар бойы TC39 ұсыныстарында, шеңберлік талқылауларда және ашық бастапқы жобаларда қызу жүріп келеді. 2026 жылы ол шарықтау шегіне жетеді. Мәселе жақсырақ ағындар API мүмкіндігін алуда емес — бұл шын мәнінде «жақсы» қандай көрінеді және бізге не кедергі болып отыр.

Ағымдағы Streams API қысқа болатын жерде

Node.js және Deno сияқты шолғыштар мен жұмыс уақыттарында ReadableStream, WritableStream және TransformStream мүмкіндіктерін беретін WHATWG Streams стандарты нағыз инженерлік жетістік болды. Ол кері қысымды, жоюды және интернеттегі деректерді өңдеуге асинхронды итерацияны әкелді. Бірақ іс жүзінде API жалпы әрекеттер үшін әзірлеушіден тым көп талап етеді. Қарапайым түрлендіру ағынын жасау үшін transform әдісімен TransformStream данасын жасау, контроллерлерді басқару және тазарту семантикасын мұқият өңдеу қажет — мұның бәрі бөліктер үстіндегі map() сомасына тең.

Мұны әзірлеушілердің массивтермен қалай жұмыс істейтінімен салыстырыңыз. Array.prototype.map(), filter() және reduce() құрастырылады, оқылады және нөлге жуық рәсімді қажет етеді. Streams API бұл эргономикалық үйлесімділіктің ешқайсысын қораптан тыс ұсынбайды. Құбыр ағындары .pipeThrough() арқылы бірге жұмыс істейді, бірақ трансформация кезеңдерін өздері құрастыру әзірлеушілер сағаттары мен шыдамдылығын жоғалтады. Құбырлы тізбектер арқылы қателерді өңдеу тағы бір ауыртпалық болып табылады — қателер интуитивті түрде таралмайды және бұзылған құбырды жөндеу көбінесе деректердің қай жерде жойылып жатқанын немесе бүлінгенін анықтау үшін уақытша журнал түрлендірулерін енгізуді білдіреді.

Бөлмеде Node.js пілі де бар. Түйіннің WHATWG стандартынан он жылға жуық бұрын болған өзінің бұрынғы ағынды іске асыруы (stream.Readable, stream.Writable) бар. Екі жүйе тек адаптер утилиталары арқылы өзара әрекеттеседі және көптеген npm пакеттері әлі де ескі API пайдаланады. Орталарда жұмыс істейтін әзірлеушілер — серверлік көрсету, шеткі функциялар, шолғышқа негізделген өңдеу — бір тұжырымдама үшін екі үйлесімсіз абстракцияны төбелесуге мәжбүр.

Жақсы Streams API қандай болуы мүмкін

Бірнеше ұсыныстар мен қауымдастық эксперименттері әзірлеушілерге қолайлырақ болашаққа нұсқайды. Негізгі идеялар бірнеше принциптерге сәйкес келеді: функционалдық құрам, синхронды итераторды туралау және қысқартылған қазандық. Аралық TransformStream нысандарын құруды қажет етпей-ақ, .map(), .filter() және .take() тізбегінде тікелей оқылатын ағында ағынды деректер құбырларын массив түрлендірулерін жазғандай табиғи түрде жазу мүмкіндігін елестетіңіз.

Бұл гипотетикалық емес. Итератор көмекшілері ұсынысы (қазір TC39 ішіндегі 4-кезеңде) қазірдің өзінде .map(), .filter(), .take(), .drop() және .flatdeMap. Бұл үлгіні асинхронды итераторларға және кеңейтім бойынша [Symbol.asyncIterator] ашатын оқылатын ағындарға кеңейту — келесі табиғи қадам. Кейбір орындалу уақыттары мен кітапханалар әзірлеушілерге келесідей код жазуға мүмкіндік беретін осы тәсілмен тәжірибе жасай бастады:

Ең күшті ағынды абстракция - бұл жоғалып кететін абстракция. Әзірлеушілер деректерді түрлендіруді қарапайым функциялар тізбегі ретінде көрсете алған кезде — контроллерлер, кезек стратегиялары немесе қолмен кері қысым туралы алаңдамай — олар тезірек құрастырады, қателерді азайтады және ағындық деректермен жұмыс істеуді ұнатады.

Мақсат төменгі деңгейлі Streams API интерфейсін толығымен ауыстыру емес. Әрқашан пайдалану жағдайлары болады — реттелетін хаттамалар, нақты жадты басқару, екілік кодектерді іске асыру — контроллерге тікелей қол жеткізу маңызды. Бірақ дәйекті деректерді оқу, түрлендіру және жазуды қамтитын 90% пайдалану жағдайлары үшін абстракция деңгейі тапсырманың қарапайымдылығына сәйкес келуі керек.

Басқа экожүйелерден алынған сабақтар

JavaScript ағындық эргономикамен күресетін бірінші тіл емес. Rust Итератор және Ағын белгілері құрастырушыларға аралық жинақтарды бөлмей-ақ операцияларды тізбектеуге мүмкіндік беретін жинақталатын, нөлдік шығынсыз абстракцияны ұсынады. Elixir Ағынмодуль таза, құбырға ыңғайлы синтаксиспен жалқау санауды қамтамасыз етеді. Тіпті көп сөзділігі үшін жиі сынға алынатын Java да Java 8 жүйесінде JavaScript әзірлеушілері танитын және қызғанатын еркін API бар java.util.stream.Stream-ді енгізді.

Бұл экожүйелердің ортақ ерекшелігі жалпы жағдайды тривиальды ету міндеттемесі болып табылады. Файлды оқу, жолдарды сүзу және нәтижелерді жазу құрастырылатын кодтың 3-5 жолын алады. JavaScript-тің ағымдағы Streams API жүйесінде ағынның құрылысын, қателерді өңдеуді және дұрыс жоюды есепке алғанда бірдей операция 20-30 жолға дейін оңай кеңейе алады. Алшақтық мүмкіндікке қатысты емес, ол эргономикаға қатысты.

Python әдісі де сабақ береді. yield бар генератор функциялары дәйекті деректерді жалқаулықпен жасаудың және тұтынудың табиғи жолын қамтамасыз етеді. JavaScript-те генератор функциялары да бар, бірақ оларды Streams API интерфейсімен байланыстыру үшін оларды тартуға негізделген контроллерлері бар ReadableStream конструкторларына орау қажет. Генераторлар мен ағындар арасындағы неғұрлым тығыз интеграция — генератор функциясы тікелей оқылатын ағынға айналуы мүмкін — қазандықтың бүкіл санатын жояды.

Қолданбаларды әзірлеуге нақты әлемнің әсері

Бұл академиялық мәселе емес. Деректер ағыны қазіргі веб-қосымшалардың негізі болып табылады. Серверден жіберілген оқиғалар, бөлшектелген HTTP жауаптары, нақты уақыттағы аналитикалық бақылау тақталары, файлдарды жүктеп салуды өңдеу, AI үлгісінің шығыс ағыны — бұл шеткі жағдайлар емес, күнделікті мүмкіндіктер. Ағынды қарапайымды пайдалану қиын болған кезде, әзірлеушілер оны толығымен болдырмайды (барлығын жадқа буферлейді, ол масштабталмайды) немесе өндірістік оқиғалардың көзіне айналатын нәзік, техникалық қызмет көрсету қиын құбыр желілерін салады.

Масштабта не болатынын қарастырыңыз. 207 біріктірілген бизнес модульдері бойынша деректерді өңдейтін Mewayz сияқты платформа - CRM құбырлары мен шот-фактурадан жалақыны есептеуге және флотты қадағалауға дейін - жүйелі деректердің үлкен көлемін іштей өңдейді. Экспорттау операциялары, есептерді жасау, веб-хук оқиғаларын өңдеу және нақты уақыттағы бақылау тақтасының жаңартулары тиімді ағынның пайдасын көреді. Негізгі тілдің примитивтері ағынды қиындатқанда, құны әрбір модуль және әрбір деректер ағыны бойынша көбейтіледі. Платформа инженерлері тілдің абстракцияларының үстіне ішкі ағынды абстракцияларды құрастырып, қажет болмайтын күрделілікті қосады.

💡 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 →
  • File processing: Uploading and parsing CSV files with 100K+ rows requires streaming to avoid memory exhaustion — but the current API makes even basic row-by-row transformation verbose
  • Нақты уақыттағы бақылау тақталары: SSE немесе WebSocket арқылы серверден клиентке аналитикалық деректерді ағынмен жіберу бүгінгі күні көрсету қиын болатын құрамдас түрлендірулердің (агрегация, сүзу, реттеу) артықшылықтарын береді
  • AI жауап ағыны: LLM қолдайтын мүмкіндіктер бизнес құралдарында стандартқа айналғандықтан, пайдаланушы интерфейсіне таңбалауыш бойынша жауаптарды ағынмен жіберу негізгі күту болып табылады — және тізбектелетін ағынды түрлендірулер үшін тамаша пайдалану жағдайы
  • Пакеттік операциялар: Мыңдаған қызметкерлердің жалақысын өңдеу, жаппай шот-фактураларды жасау немесе CRM жазбаларын сыртқы жүйелермен синхрондаудың барлығы тексеру, түрлендіру және шығару кезеңдері арқылы ағынды деректерді қамтиды
  • Webhook конвейерлері: Үшінші тарап интеграцияларынан кіріс веб-хук оқиғаларын қабылдау, тексеру, бағыттау және өңдеу - бұл ағындық жұмыс жүктемесі

Шын мәнінде не ұсынылып жатыр

JavaScript экожүйесі бірнеше бағытта қозғалады. TC39Итератор көмекшілеріұсынысы синхронды итераторларға функционалдық композицияны әкеліп қойған. Табиғи кеңейтім — Асинхронды итератордың көмекшілері — бірдей .map(), .filter(), .reduce(), .take() және .flatMap(), оны оқуға болатын әдістер арқылы жүзеге асыруға мүмкіндік береді. [Symbol.asyncIterator]. Осының өзі ең көп таралған ағындық үлгілер үшін әзірлеуші тәжірибесін күрт жақсартады.

TC39-дан басқа орындалу уақыты деңгейіндегі инновациялар да шекараны ығыстырып жатыр. Deno көбірек эргономикалық ағындық утилиталармен тәжірибе жасады. Web Streams Toolboxжәне ұқсас қауымдастық кітапханалары API-ның егжей-тегжейлі бөліктерін орайтын көмекші функцияларды қамтамасыз етеді. Сондай-ақ ағынды стандартты кітапхана идеясының артта қалған серпіні бар — әзірлеушілер қазір npm.

Сонымен қатаржақсырақ қате семантикасы үшін сенімді дәлел бар. Бүгінгі API-де құбырлы тізбектегі қате ағындарды анық емес күйде қалдыруы мүмкін - жартылай тұтынылған, оқырмандардағы құлыптар салбырап тұрады. Қайта қаралған API Rust компаниясының Нәтиже түріне ұқсас құрылымдық қате таратуды қабылдай алады немесе қателер мән ретінде құбыр арқылы өтетін конвенцияны қабылдай алады, бұл төменгі ағындық кезеңдерге бүкіл тізбекті үзбей өңдеуге немесе олардан қалпына келтіруге мүмкіндік береді. Бұл өндіріс сенімділігін өзгертеді.

Неге бұл 2026 жылы бұрынғыдан да маңызды

Үш конвергентті тенденция JavaScript тарихының кез келген нүктесіне қарағанда ағынды API эргономикасын тезірек етеді. Біріншіден, жиектерді есептеу — Cloudflare Workers, Vercel Edge функциялары, Deno Deploy — барлық жауаптарды немесе деректер жиынын буферлеу өміршең болмайтын қатаң жад пен CPU шектеулерімен жұмыс істейді. Трансляция - жалғыз опция және осы орталарға қолданатын әзірлеушілер олармен күреспейтін API қажет.

Екіншіден, AI интеграциясы ағынмен жіберуді пайдаланушыға арналған мүмкіндікке айналдырды. AI көмекшісі жауап жасағанда, пайдаланушылар буферге толық жауапты күтпей, нақты уақытта токендердің пайда болуын күтеді. Әрбір SaaS платформасы – Mewayz сияқты іскери операциялық жүйелерден бастап дербес AI құралдарына дейін – енді клиенттік ағынды тұтынуды қажет етеді. Ағымдағы API бұл үшін жұмыс істейді, бірақ ағынды AI шығысын талдау, түрлендіру және көрсету бойынша әзірлеушінің тәжірибесі құрастырылатын ағын операторларымен айтарлықтай жақсырақ болуы мүмкін.

Үшіншіден, толық стек JavaScript қозғалысы әзірлеушілер желі шекарасының екі жағындағы ағындарды өңдейтінін білдіреді. Жалғыз инженер дерекқор сұрауының нәтижелерін өңдейтін, оларды түрлендіру арқылы өткізетін, оларды бөлшектенген HTTP жауабы ретінде жіберетін, содан кейін прогрессивті UI көрсету үшін сол ағынды клиентте тұтынатын серверлік ағынды жаза алады. Ағынды API ыңғайсыз болғанда, бұл үйкеліс стектің әрбір қабатында сезіледі.

Алға жылжу: Әзірлеушілер бүгін не істей алады

Тіл дамып жатқанда, әзірлеушілер күтпейді. Бірнеше практикалық стратегиялар ағымдағы жобалардағы ағындық тәжірибені жақсарта алады. синхрондау генераторларын негізгі авторлық үлгі ретінде пайдалану — және оларды орындау уақыты оны қолдайтын ReadableStream.from() ішіне орау — контроллерді қолмен басқаруға қарағанда әлдеқайда таза синтаксисті қамтамасыз етеді. it-pipe және streaming-iterables сияқты кітапханалар бүгінгі күні синхронды итераторларға функционалды тізбекті әкелетін құрастырылатын көмекшілерді ұсынады.

Деректерді көп қажет ететін қолданбаларды құрастыратын командалар үшін жұқа ішкі ағындық қызметтік қабатқа инвестиция салу дивидендтер береді. Жақсы жобаланған streamMap(), streamFilter() және streamBatch() функциялар жиыны — әрқайсысы асинхронды қайталанатын және асинхронды қайталанатын қайтаратын — толық ағындық фреймворк салмағынсыз стандартты API жетіспейтін құрамдылықты қамтамасыз етеді. Бұл іске қосу прототиптерінен миллиондаған операцияларды басқаратын платформаларға дейін масштабталатын үлгі.

  1. Асинхронды генераторларды ағындық деректерді шығару үшін әдепкі үлгі ретінде қабылдаңыз — олар ReadableStream қолмен құрастырылғаннан гөрі таза, сыналатын және құрастырылуы мүмкін
  2. ReadableStream даналарын күтетін API интерфейстерімен өзара әрекеттесу қажет болғанда веб-ағындар әлеміне синхронды қайталанатындарды көпір ету үшін ReadableStream.from() пайдаланыңыз
  3. TransformStream нысандарын құрудың орнына асинхронды қайталанатындар арқылы жалпы операциялар (карта, сүзгі, топтама, дроссель) үшін жұқа қызметтік функцияларды жасаңыз немесе қабылдаңыз
  4. TC39 және орындалу уақытындағы талқылаулардағы адвокат — асинхронды итератор көмекшілерінің ұсынысы басымдықты анықтауға итермелейтін әзірлеуші дауыстарын қажет етеді
  5. Тікелей ағындарға емес, асинхронды қайталанатындарға қарсы сынақтарды жазыңыз — бұл ағындық логиканы портативті және тексеруді жеңілдетеді

JavaScript Streams API қажетті негіз болды. Бірақ іргетастардың негізін салу керек, ал абстракцияның келесі қабаты - ағынды массивтермен жұмыс істеу сияқты табиғи етеді - мерзімі өткен. Бөлшектер орнында: асинхронды итераторлар, генератор функциялары және итератор көмекшілерінің үлгісі. Қазір қажет нәрсе - әзірлеушілердің дәйекті деректер туралы қалай ойлайтынына сәйкес келетін стандартқа оларды жинауға ұжымдық ниет. Нәтиже тек жақсырақ API болмайды — ол қолданбаларды жылдамырақ, жадты тиімдірек және құрастыруды ұнамды етіп, соңғы шара емес, әдепкі үлгі ретінде ағынды құлпын ашады.

Жиі қойылатын сұрақтар

Ағымдағы JavaScript Streams API интерфейсінде не дұрыс емес?

Ағымдағы Streams API шамадан тыс қысымнан, кері қысым семантикасын шатастыратындықтан және қабылдауға кедергі келтіретін тым күрделі API бетінен зардап шегеді. Файлды оқу немесе HTTP жауабын өңдеу сияқты қарапайым тапсырмалар қажеттен әлдеқайда көп кодты қажет етеді. Әзірлеушілер жиі үшінші тарап кітапханаларына немесе кері қоңыраулар мен оқиға эмитенттері сияқты ескі үлгілерге жүгінеді, бұл стандартты толығымен айналып өтіп, эргономика заманауи JavaScript-ке қарағанда Java-ға жақынырақ көрінеді.

Жақсы Streams API веб-әзірлеуді қалай жақсартады?

Таза синтаксисі, кірістірілген асинхронды итерация қолдауы және интуитивті композиция әдістері бар қайта жобаланған Streams API нақты уақыттағы деректерді өңдеуді айтарлықтай жеңілдетеді. Әзірлеушілер трансформацияларды табиғи түрде тізбектей алады, кері қысымды мөлдір өңдей алады және кодтың бір бөлігінде ағынды құбырларды жаза алады. Бұл прогрессивті көрсетуді, тірі деректер арналарын және үлкен файлдарды өңдеуді төмен деңгейлі примитивтермен күрескісі келетіндерге ғана емес, әрбір JavaScript әзірлеушісіне қолжетімді етеді.

Қазіргі бизнес платформалар нақты уақыттағы деректер ағынын тиімді басқара ала ма?

Иә — Mewayz сияқты платформалар, 207 модульден тұратын бизнес операциялық жүйесі айына $19-дан басталады, қазірдің өзінде аналитика, автоматтандыру жұмыс процестері және тікелей есеп беру үшін сахна артында тиімді деректер құбырларын пайдаланады. JavaScript-те ағындық стандарттар жақсарған сайын, веб-стекке салынған құралдар бақылау тақтасының лезде жаңартуларынан бастап біріктірілген бизнес модульдері арқылы файлдарды үздіксіз өңдеуге дейін нақты уақыттағы тәжірибелерді бұдан да жылдамырақ қамтамасыз етеді.

Streams API дамып жатқанда қандай баламалар бар?

Қазіргі уақытта әзірлеушілер Node.js ағындары, реактивті бағдарламалау үшін RxJS немесе кезекті деректерді эргономикалық түрде өңдеу үшін күту циклдерімен жұптастырылған асинхронды генераторлар сияқты кітапханаларға сүйенеді. Веб-үйлесімді политолтырулар мен ұсыныс кезеңінің көмекшілері стандартты API интерфейсіндегі бос орындарды да өтейді. Ең бастысы - пайдалану жағдайыңызға сәйкес келетін абстракцияларды таңдау - бұл оқиғаларға ауыртпалық түсіретін қолданбалар үшін байқалатын үлгілерді немесе деректерді қарапайым түрлендіру тапсырмалары үшін қарапайым асинхронды итерацияны білдіре ме.

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