Ramalan Jake Archibald 2016 "Tahun Aliran Web" mungkin sedikit lebih awal daripada waktunya. Walau bagaimanapun, Standard Streams, yang pada mulanya dicadangkan pada tahun 2014, kini menjadi realiti, secara konsisten dilaksanakan di seluruh pelayar moden (dengan Firefox menangkap) dan Node.js (dan Deno).
Streaming dengan cekap mengendalikan sumber data yang besar dengan memecahkannya menjadi "ketulan" yang lebih kecil dan memprosesnya secara berurutan. Ini mengelakkan menunggu muat turun lengkap sebelum pemprosesan bermula, membolehkan pengendalian data progresif.
Tiga jenis aliran utama wujud: boleh dibaca, boleh ditulis, dan mengubah aliran. Aliran yang boleh dibaca menyediakan potongan data (dari sumber seperti fail atau sambungan HTTP). Transformasi Streams (Pilihan) Ubah suai ketulan ini. Akhirnya, aliran yang boleh ditulis menerima data yang diproses.
Node.js pada mulanya mempunyai pelaksanaan aliran sendiri, sering dianggap kompleks. WHATWG Web Standard for Streams menawarkan peningkatan yang ketara, kini disebut sebagai "aliran web" dalam dokumentasi Node.js. Walaupun aliran Node.js asal kekal, API standard Web wujud bersama, mempromosikan kod silang platform dan memudahkan pembangunan.
Deno, juga dicipta oleh pengarang asal Node.js, menyokong sepenuhnya aliran web, mencerminkan API pelayar. Pekerja Cloudflare dan Deno Deploy juga memanfaatkan pendekatan standard ini.
fetch()
dan aliran yang boleh dibaca Cara yang paling biasa untuk membuat aliran yang boleh dibaca adalah menggunakan fetch()
. response.body
fetch()
Ambil ('data.txt') .THEN (response => console.log (response.body));
Log konsol mendedahkan beberapa kaedah aliran berguna. Seperti yang dinyatakan oleh spesifikasi, aliran yang boleh dibaca boleh disalurkan secara langsung ke aliran yang boleh ditulis menggunakan pipeTo()
, atau disalurkan melalui aliran transformasi menggunakan pipeThrough()
.
Node.js Core tidak mempunyai sokongan terbina fetch
. node-fetch
(sebuah perpustakaan popular) mengembalikan aliran nod, bukan aliran apa. Undici
, pelanggan HTTP/1.1 yang lebih baru dari pasukan Node.js, menawarkan alternatif moden kepada http.request
, menyediakan pelaksanaan fetch
di mana response.body
mengembalikan aliran web. Undici
mungkin menjadi pengendali permintaan HTTP yang disyorkan di Node.js. Sebaik sahaja dipasang ( npm install undici
), ia berfungsi sama seperti fetch
pelayar. Contoh berikut paip aliran melalui aliran transform:
import {empet} dari 'undici'; import {textDecoderstream} dari 'node: stream/web'; fungsi async fetchStream () { Const Response = menunggu ambil ('https://example.com'); const stream = response.body; const textStream = stream.pipethrough (textDecodersTream baru ()); // ... pemprosesan selanjutnya TextStream ... }
response.body
adalah segerak; await
tidak diperlukan. Kod penyemak imbas hampir sama, menghilangkan penyata import
seperti fetch
dan TextDecoderStream
tersedia di seluruh dunia. Deno juga mempunyai sokongan asli.
Loop for-await-of
memberikan lelaran yang tidak segerak, memperluaskan fungsi for-of
untuk ke arah yang tidak segerak (seperti sungai dan tatasusunan janji).
fungsi async fetchandlogstream () { Const Response = menunggu ambil ('https://example.com'); const stream = response.body; const textStream = stream.pipethrough (textDecodersTream baru ()); untuk menanti (const sebahagian daripada teksstream) { Console.log (Chunk); } } fetchandlogstream ();
Ini berfungsi di Node.js, Deno, dan pelayar moden (walaupun sokongan aliran penyemak imbas masih berkembang).
Walaupun fetch()
adalah lazim, kaedah lain membuat aliran yang boleh dibaca: Blob.stream()
dan File.stream()
(yang memerlukan import { Blob } from 'buffer';
dalam node.js). Dalam pelayar, an<input type="file">
elemen dengan mudah menyediakan aliran fail:
const fileStream = document.QuerySelector ('input'). Files [0] .Stream ();
Node.js 17 memperkenalkan FileHandle.readableWebStream()
dari fs/promises.open()
:
import {Open} dari 'node: fs/promises'; // ... (buka fail dan aliran proses) ...
Untuk tindakan penyempurnaan pasca aliran, janji berguna:
SomereAdableStream .pipeto (someWriBiBlesTream) .THEN (() => Console.log ("Data Ditulis")) .catch (error => console.error ("ralat", ralat));
Atau menggunakan await
:
menunggu somereAdableStream.pipeto (someWriTableStream);
Di luar TextDecoderStream
(dan TextEncoderStream
), anda boleh membuat aliran transformasi tersuai menggunakan TransformStream
. Pembina menerima objek dengan kaedah start
, transform
, dan flush
pilihan. transform
melakukan transformasi data.
Berikut adalah mudah (untuk tujuan ilustrasi; gunakan TextDecoderStream
dalam pengeluaran) penyahkod teks:
const decoder = textDecoder baru (); const decodestream = New TransformStream ({ Transformasi (Chunk, Controller) { controller.enqueue (decoder.decode (chunk, {stream: true})); } });
Begitu juga, anda boleh membuat aliran boleh dibaca tersuai menggunakan ReadableStream
, menyediakan fungsi start
, pull
, dan cancel
. Fungsi start
menggunakan controller.enqueue
untuk menambah ketulan.
Node.js menyediakan .fromWeb()
dan .toWeb()
kaedah (dalam node.js 17) untuk menukar antara aliran nod dan aliran web.
Konvergensi penyemak imbas dan Node.js API berterusan, dengan aliran menjadi bahagian utama penyatuan ini. Walaupun penggunaan aliran depan penuh masih dijalankan (misalnya, MediaStream
bukanlah aliran yang boleh dibaca lagi), titik masa depan ke arah penggunaan aliran yang lebih luas. Potensi untuk pembangunan I/O dan pembangunan silang platform yang cekap menjadikan aliran web pembelajaran berbaloi.
Atas ialah kandungan terperinci Aliran web di mana -mana (dan ambil untuk node.js). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!