Rumah > hujung hadapan web > tutorial css > Aliran web di mana -mana (dan ambil untuk node.js)

Aliran web di mana -mana (dan ambil untuk node.js)

Jennifer Aniston
Lepaskan: 2025-03-19 10:01:08
asal
871 orang telah melayarinya

Aliran web di mana -mana (dan ambil untuk node.js)

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).

Memahami aliran

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.

Aliran web: konsistensi silang platform

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));
Salin selepas log masuk

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 ...
}
Salin selepas log masuk

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.

Lelaran asynchronous

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 ();
Salin selepas log masuk

Ini berfungsi di Node.js, Deno, dan pelayar moden (walaupun sokongan aliran penyemak imbas masih berkembang).

Sumber aliran boleh dibaca tambahan

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 ();
Salin selepas log masuk

Node.js 17 memperkenalkan FileHandle.readableWebStream() dari fs/promises.open() :

 import {Open} dari 'node: fs/promises';

// ... (buka fail dan aliran proses) ...
Salin selepas log masuk

Aliran dan Janji Integrasi

Untuk tindakan penyempurnaan pasca aliran, janji berguna:

 SomereAdableStream
.pipeto (someWriBiBlesTream)
.THEN (() => Console.log ("Data Ditulis"))
.catch (error => console.error ("ralat", ralat));
Salin selepas log masuk

Atau menggunakan await :

 menunggu somereAdableStream.pipeto (someWriTableStream);
Salin selepas log masuk

Penciptaan Stream Transform tersuai

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}));
  }
});
Salin selepas log masuk

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 Stream Interoperability

Node.js menyediakan .fromWeb() dan .toWeb() kaedah (dalam node.js 17) untuk menukar antara aliran nod dan aliran web.

Kesimpulan

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan