0Pricing
JavaScript Academy · レッスン

postMessage でメッセージを送る

メインスレッドと Worker の間で通信します。

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

メッセージによる通信

メインスレッドと Worker は別々のメモリを持つため、メッセージを渡して通信します。postMessage メソッドでデータを送信し、message イベントで受信します。

Worker への送信

メインスレッドから worker.postMessage(data) を呼び出します。データには、数値、文字列、オブジェクト、配列など、ほとんどあらゆる値を指定できます。

const worker = new Worker('worker.js');
worker.postMessage({ task: 'sum', numbers: [1, 2, 3, 4] });

ワーカーで受信する

ワーカー内でmessageイベントを処理します。送信された値はevent.dataに格納されています。

// worker.js
self.onmessage = (event) => {
  const { task, numbers } = event.data;
  console.log('worker received task:', task);
};

返信を送信する

ワーカーは結果を計算し、独自のpostMessageを使って送り返します(selfまたは暗黙のグローバルを使用します)。

// worker.js
self.onmessage = (event) => {
  const { numbers } = event.data;
  const total = numbers.reduce((a, b) => a + b, 0);
  self.postMessage(total); // send result back
};

返信を受信する

メインスレッドに戻ったら、結果を取得するためにワーカーオブジェクトのmessageをリッスンします。

worker.onmessage = (event) => {
  console.log('result from worker:', event.data);
};

addEventListener形式

onmessageプロパティの代わりにaddEventListener('message', ...)を使用できます。これにより、複数のリスナーを登録できます。

worker.addEventListener('message', (event) => {
  console.log('got:', event.data);
});

構造化複製

メッセージは共有されるのではなく、構造化複製アルゴリズムを使ってコピーされます。オブジェクト、配列、Maps、Sets、Dates、型付き配列には対応していますが、関数、DOMノード、クラスメソッドには対応していません。

// OK to send: numbers, strings, plain objects, arrays,
// Map, Set, Date, ArrayBuffer, typed arrays.
// NOT cloneable: functions, DOM nodes, Error stacks lost.

メッセージプロトコル

複数の操作を扱う場合は、ワーカーが実行内容を判断できるようにtypeフィールドを送信します。これにより、1つのワーカーを柔軟に利用できます。

// main:
worker.postMessage({ type: 'multiply', a: 6, b: 7 });

// worker.js:
self.onmessage = (e) => {
  if (e.data.type === 'multiply') {
    self.postMessage(e.data.a * e.data.b);
  }
};

リクエストを対応付ける

多数のメッセージを送信する場合は、返信とリクエストを対応付けられるようにidを付けます。ワーカーはそのidを返信に含めて返します。

// main: worker.postMessage({ id: 42, value: 'x' });
// worker: self.postMessage({ id: e.data.id, done: true });
// main can now match reply id 42 to its request.

双方向通信

メッセージングは双方向かつ非同期です。ページはタスクを送り続けられ、ワーカーは部分的な結果をストリームで返せます。これらはすべてUIをブロックせずに行われます。

// Worker can report progress repeatedly:
// self.postMessage({ type: 'progress', percent: 50 });
// self.postMessage({ type: 'done', result: data });

リスナーをクリーンアップする

ワーカーが不要になったら、メモリリークを避けるためにリスナーを削除してワーカーを終了します。ワーカーを繰り返し作成するシングルページアプリでは特に重要です。

worker.onmessage = null;
worker.terminate();

確認問題

ワーカーのメッセージングについての理解度を確認しましょう。

まとめ

ワーカーのメッセージングについて学びました。

  • postMessage(data)で送信し、messageイベントで受信します。
  • データはevent.dataに格納されます。
  • 両方の側から送信できるため、双方向通信になります。
  • データは共有されず、構造化複製によってコピーされます。
  • 複数のタスクにはtype/idプロトコルを使用します。

次は、コピーなしでデータを扱う転送可能オブジェクトについて学びます。

よくある質問

「postMessage でメッセージを送る」レッスンは無料ですか?

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

「postMessage でメッセージを送る」で何を学びますか?

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

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

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

「postMessage でメッセージを送る」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. Web Worker を作成する
  2. postMessage でメッセージを送る
  3. Transferable オブジェクト
  4. 活用例と制限事項
← JavaScript Academyに戻る