0Pricing
JavaScript Academy · レッスン

Transform Streams

パイプラインを流れるデータを変換します。

「Transform Streams」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全4レッスンが含まれています。

TransformStream とは

TransformStream は、読み取り側と書き込み側の間に位置します。書き込まれたチャンクを変換して出力する、データをその場でマッピング、フィルタリング、再構成するパイプの段階です。

構造

2つの端があります。writable はデータを入力する側、readable は変換後のデータが出力される側です。

const ts = new TransformStream();
console.log(ts.writable, ts.readable);

transform メソッド

transform(chunk, controller) 関数で動作を定義します。出力を生成するには controller.enqueue() を呼び出します。

const upper = new TransformStream({
  transform(chunk, controller) {
    controller.enqueue(chunk.toUpperCase());
  }
});

1つの入力から複数の出力

変換処理は、1つの入力に対して0個、1個、または複数のチャンクを出力できます。データの分割や展開に最適です。

const splitter = new TransformStream({
  transform(line, controller) {
    for (const word of line.split(" ")) controller.enqueue(word);
  }
});

TransformStream でフィルタリングする

除外したいチャンクを enqueue しなければよいだけです。

const onlyEven = new TransformStream({
  transform(n, controller) {
    if (n % 2 === 0) controller.enqueue(n);
  }
});

flush メソッド

flush(controller) は入力が終了したときに1回実行されます。バッファーに残ったデータや最後のチャンクを出力するのに適しています。

const ts = new TransformStream({
  transform(c, ctrl) { ctrl.enqueue(c); },
  flush(ctrl) { ctrl.enqueue("[END]"); }
});

チャンクをまたいでバッファーする

クロージャー内で状態を保持すると、分割されたチャンクを結合できます。たとえば、任意のバイト境界から完全な行を組み立てられます。

let buffer = "";
new TransformStream({
  transform(chunk, ctrl) {
    buffer += chunk;
    const parts = buffer.split("\n");
    buffer = parts.pop();
    for (const line of parts) ctrl.enqueue(line);
  },
  flush(ctrl) { if (buffer) ctrl.enqueue(buffer); }
});

組み込みの変換ストリーム

プラットフォームには TextDecoderStream、TextEncoderStream、CompressionStream と DecompressionStream が用意されており、すぐに使える変換処理を提供します。

const gzip = new CompressionStream("gzip");
const compressed = inputStream.pipeThrough(gzip);

pipeThrough で接続する

readable.pipeThrough(transform) はソースを変換処理に接続し、変換処理の readable 出力を返します。そのまま次の段階へ渡せます。

const out = sourceStream
  .pipeThrough(new TextDecoderStream())
  .pipeThrough(upper);

非同期変換

transform は非同期にできます。その中で await を使い、チャンクごとに API を呼び出したり非同期処理を実行したりできます。ストリームは Promise の完了を待ちます。

new TransformStream({
  async transform(chunk, ctrl) {
    const result = await process(chunk);
    ctrl.enqueue(result);
  }
});

エラーの伝播

transform 内で例外を投げるとストリームはエラーになり、下流のコンシューマーにエラーが伝わってパイプラインが停止します。

new TransformStream({
  transform(chunk, ctrl) {
    if (!valid(chunk)) throw new Error("bad chunk");
    ctrl.enqueue(chunk);
  }
});

クイックチェック

TransformStreamをテストします。

復習:TransformStream

transformとflushを使って変換を作成し、チャンクのマッピング、フィルタリング、展開を行い、チャンクの境界をまたいでバッファリングし、CompressionStreamなどの組み込み機能を使い、pipeThroughでステージを接続しました。次は、バックプレッシャーとパイピングです。

よくある質問

「Transform Streams」レッスンは無料ですか?

はい。「Transform Streams」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全4レッスンが含まれています。

「Transform Streams」で何を学びますか?

パイプラインを流れるデータを変換します。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Transform Streams」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Readable Streams
  2. fetch レスポンスのストリーミング
  3. Transform Streams
  4. バックプレッシャーとパイプ処理
← JavaScript Academyに戻る