ジェイク・アーチボルドの2016年の「ウェブストリームの年」の予測は、その時代をわずかに上回っていたかもしれません。ただし、2014年に最初に提案されたStreams Standardは現在、最新のブラウザー(Firefoxが追いつく)とNode.js(およびDeno)に一貫して実装されています。
ストリーミングは、それらをより小さな「チャンク」に分割し、それらを順次処理することにより、大規模なデータリソースを効率的に処理します。これにより、処理が開始される前に完全なダウンロードを待つことができなくなり、プログレッシブデータ処理が可能になります。
3つのメインストリームタイプが存在します:読み取り可能、書き込み可能、および変換ストリーム。読み取り可能なストリームは、データチャンクを提供します(ファイルやHTTP接続などのソースから)。変換ストリーム(オプション)これらのチャンクを変更します。最後に、書き込み可能なストリームは処理されたデータを受信します。
Node.jsには最初は独自のストリーム実装があり、しばしば複雑と見なされました。 StreamsのWhatWG Web標準は、Node.jsドキュメントで「Web Streams」と呼ばれる大幅な改善を提供します。元のnode.jsストリームは残っていますが、Web標準のAPIが共存し、クロスプラットフォームコードを促進し、開発を簡素化します。
Node.jsの元の著者によって作成されたDenoは、Webストリームを完全にサポートし、ブラウザAPIをミラーリングしています。 CloudFlare WorkersとDeno Deployは、この標準化されたアプローチも活用しています。
fetch()
および読み取り可能なストリーム読み取り可能なストリームを作成する最も一般的な方法はfetch()
を使用することです。 fetch()
通話のresponse.body
は読み取り可能なストリームです。
fetch( 'data.txt') .then(response => console.log(respons.body));
コンソールログは、いくつかの有用なストリーム方法を明らかにします。仕様が述べているように、読み取り可能なストリームは、 pipeTo()
を使用して書き込み可能なストリームに直接配管するか、 pipeThrough()
を使用して変換ストリームをパイプすることができます。
node.jsコアには組み込みのfetch
サポートがありません。 node-fetch
(人気ライブラリ)は、WhatWGストリームではなく、ノードストリームを返します。 Node.jsチームの新しいHTTP/1.1クライアントであるUndici
、 http.request
の最新の代替品を提供し、 response.body
がWebストリームを返すfetch
実装を提供します。 Undici
、node.jsで推奨されるHTTPリクエストハンドラーになる可能性があります。インストール( npm install undici
)が、ブラウザfetch
と同様に機能します。次の例は、変換ストリームを通してストリームをパイプします:
'undici'から{fetch}をインポートします。 'node:stream/web'から{textdecoderStream}をimpontします。 async関数fetchStream(){ const response = await fetch( 'https://example.com'); const stream = response.body; const textStream = stream.pipethrough(new TextDecoderStream()); // ... TextStreamのさらなる処理... }
response.body
は同期です。 await
必要はありません。ブラウザコードはほぼ同じで、 fetch
とTextDecoderStream
がグローバルに利用可能であるため、 import
ステートメントを省略します。デノにはネイティブのサポートもあります。
for-await-of
ループは非同期反復を提供し、ループの機能を非同期反復for-of
(約束のストリームや配列など)に拡張します。
async関数fetchandlogstream(){ const response = await fetch( 'https://example.com'); const stream = response.body; const textStream = stream.pipethrough(new TextDecoderStream()); 待っている(テキストストリームのconst chunk){ console.log(chunk); } } fetchandlogstream();
これは、node.js、deno、および最新のブラウザーで機能します(ただし、ブラウザストリームサポートはまだ開発されています)。
fetch()
は一般的ですが、他のメソッドは読み取り可能なストリームを作成します: Blob.stream()
およびFile.stream()
(node.js import { Blob } from 'buffer';
が必要です)。ブラウザで、<input type="file">
要素は簡単にファイルストリームを提供します:
const fileStream = document.querySelector( 'input')。ファイル[0] .stream();
node.js 17はfs/promises.open()
からFileHandle.readableWebStream()
を導入します。
'node:fs/promises'から{open}をインポートします。 // ...(ファイルとプロセスストリームを開く)...
ストリーム後の完了アクションの場合、約束は有用です:
somereadableStream .pipeto(somewritable -estream) .then(()=> console.log( "data writed"))) .catch(error => console.error( "error"、error));
またはawait
を使って:
somereadablestream.pipeto(somewritable -estream)を待っています。
TextDecoderStream
(およびTextEncoderStream
)を超えて、 TransformStream
を使用してカスタム変換ストリームを作成できます。コンストラクターは、オプションのstart
、 transform
、およびflush
メソッドを備えたオブジェクトを受け入れます。 transform
データ変換を実行します。
これは、単純化された目的のためです。本番目にTextDecoderStream
を使用してください)テキストデコーダー:
const decoder = new TextDecoder(); const decodeStream = new TransformStream({ 変換(Chunk、コントローラー){ controller.enqueue(decoder.decode(chunk、{stream:true})); } });
同様に、 ReadableStream
を使用してカスタム読み取り可能なストリームを作成し、 start
、 pull
、およびcancel
機能を提供できます。 start
関数は、 controller.enqueue
を使用してチャンクを追加します。
node.jsは、ノードストリームとWebストリーム間を変換するために、 .fromWeb()
および.toWeb()
メソッド(node.js 17)を提供します。
ブラウザとnode.js APIの収束は続き、ストリームはこの統合の重要な部分です。完全なフロントエンドストリームの採用はまだ進行中ですが(たとえば、 MediaStream
まだ読みやすいストリームではありません)、将来はより広範なストリームの利用を指します。効率的なI/Oおよびクロスプラットフォーム開発の可能性により、学習Webストリームは価値があります。
以上がどこでもウェブストリーム(およびnode.jsのフェッチ)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。