Webワーカーを使用してバックグラウンドでJavaScriptコードを実行する方法を学ぶ
前書き
JavaScriptはシングルスレッドです。同時に並行して実行できるものはありません。
並行プログラミングで発生する一連の問題について心配する必要がないため、これは素晴らしいことです。
この制限により、JavaScriptコードは最初から効率的であることが強制されます。そうしないと、ユーザーのエクスペリエンスが低下します。スレッドのブロックを回避するために、高価な操作は非同期にする必要があります。
JavaScriptアプリケーションのニーズが高まるにつれ、これはいくつかのシナリオで問題になり始めました。
Web Workersは、ブラウザー内での並列実行の可能性を紹介します。
それらにはかなりの数の制限があります。
- アクセスできませんDOM:WindowオブジェクトとDocumentオブジェクト
- メッセージングを使用してメインのJavaScriptプログラムと通信できます
- それらは同じオリジン(ドメイン、ポート、プロトコル)からロードする必要があります
- ファイルプロトコルを使用してページを提供する場合、これらは機能しません(
file://
)
メインスレッドにあるWindowではなく、WebWorkerのグローバルスコープはWorkerGlobalScope
オブジェクト。
Webワーカーのブラウザーサポート
かなり良い!
を使用してWebWorkersのサポートを確認できます
if (typeof Worker !== 'undefined') {
}
Webワーカーを作成する
Webワーカーを作成するには、Workerオブジェクトを初期化し、同じオリジンからJavaScriptファイルをロードします。
const worker = new Worker('worker.js')
Webワーカーとの通信
Webワーカーと通信する主な方法は2つあります。
- WebWorkerオブジェクトによって提供されるpostMessageAPI
- インクルードチャネルメッセージングAPI
WebWorkerオブジェクトでpostMessageを使用する
を使用してメッセージを送信できますpostMessage
にWorker
オブジェクト。
重要:メッセージは共有されるのではなく、転送されます。
main.js
const worker = new Worker('worker.js')
worker.postMessage('hello')
worker.js
onmessage = event => {
console.log(event.data)
}
onerror = event => {
console.error(event.message)
}
メッセージを送り返す
ワーカーは、それを作成した関数にメッセージを送り返すことができます。そのグローバルを使用してpostMessage()
関数:
worker.js
onmessage = event => {
console.log(event.data)
postMessage('hey')
}
onerror = event => {
console.error(event.message)
}
main.js
const worker = new Worker('worker.js')
worker.postMessage('hello')
worker.onmessage = event => {
console.log(event.data)
}
複数のイベントリスナー
複数のリスナーを設定する場合message
使用する代わりにイベントonmessage
イベントリスナーを作成します(に適用されますerror
イベントも):
worker.js
addEventListener('message', event => {
console.log(event.data)
postMessage('hey')
}, false)
addEventListener(‘message’, event => {
console.log(I'm curious and I'm listening too
)
}, false)
addEventListener(‘error’, event => {
console.log(event.message)
}, false)
main.js
const worker = new Worker('worker.js')
worker.postMessage('hello')
worker.addEventListener(‘message’, event => {
console.log(event.data)
}, false)
Channel MessagingAPIの使用
WebWorkersが提供する組み込みのpostMessageAPIを使用する代わりに、より汎用的な使用を選択できます。チャネルメッセージングAPI彼らとコミュニケーションをとる。
main.js
const worker = new Worker('worker.js')
const messageChannel = new MessageChannel()
messageChannel.port1.addEventListener('message', event => {
console.log(event.data)
})
worker.postMessage(data, [messageChannel.port2])
worker.js
addEventListener('message', event => {
console.log(event.data)
})
Web Workerは、にメッセージを投稿することでメッセージを送り返すことができます。messageChannel.port2
、 このような:
addEventListener('message', event => {
event.ports[0].postMessage(data)
})
Webワーカーのライフサイクル
Web Workersが起動され、メッセージをリッスンモードのままにしない場合はworker.onmessage
または、イベントリスナーを追加することで、コードが完了するとすぐにシャットダウンされます。
Webワーカーは、その使用を使用して停止できますterminate()
メインスレッドからのメソッド、およびグローバルメソッドを使用したワーカー自体の内部close()
:
main.js
const worker = new Worker('worker.js')
worker.postMessage('hello')
worker.terminate()
worker.js
worker.onmessage = event => {
console.log(event.data)
close()
}
worker.onerror = event => {
console.error(event.message)
}
Webワーカーでのライブラリのロード
WebワーカーはimportScripts()
グローバルスコープで定義されたグローバル関数:
importScripts('../utils/file.js', './something.js')
Webワーカーで利用可能なAPI
前に述べたように、DOMはWebワーカーから到達できないため、window
そしてdocument
オブジェクト。またparent
利用できません。
ただし、次のような他の多くのAPIを使用できます。
- インクルードXHR API
- インクルードフェッチAPI
- BroadcastChannel API
- インクルードFileReader API
- IndexedDB
- インクルード通知API
- 約束
- サービスワーカー
- インクルードチャネルメッセージングAPI
- インクルードキャッシュAPI
- インクルードコンソールAPI((
console.log()
と友達) - インクルードJavaScriptタイマー((
setTimeout
、setInterval
…) - CustomEvents API:
addEventListener()
そしてremoveEventListener()
- 現在のURL。これには、
location
読み取りモードのプロパティ - WebSocket
- WebGL
- SVGアニメーション
私の無料ダウンロードJavaScriptビギナーズハンドブック
その他のブラウザチュートリアル:
- HTML5で利用できるいくつかの便利なトリック
- CMSベースのWebサイトをオフラインで機能させる方法
- プログレッシブウェブアプリの完全ガイド
- Fetch API
- プッシュAPIガイド
- チャネルメッセージングAPI
- サービスワーカーのチュートリアル
- キャッシュAPIガイド
- 通知APIガイド
- IndexedDBに飛び込む
- セレクターAPI:querySelectorおよびquerySelectorAll
- 延期と非同期でJavaScriptを効率的にロードする
- ドキュメントオブジェクトモデル(DOM)
- Web Storage API:ローカルストレージとセッションストレージ
- HTTPCookieのしくみを学ぶ
- 履歴API
- WebP画像形式
- XMLHttpRequest(XHR)
- 詳細なSVGチュートリアル
- データURLとは
- Webプラットフォームを学ぶためのロードマップ
- CORS、クロスオリジンリソースシェアリング
- Webワーカー
- requestAnimationFrame()ガイド
- Doctypeとは何ですか
- DevToolsコンソールとコンソールAPIの操作
- 音声合成API
- プレーンJavaScriptでDOMreadyイベントを待つ方法
- DOM要素にクラスを追加する方法
- querySelectorAllからDOM要素をループする方法
- DOM要素からクラスを削除する方法
- DOM要素にクラスがあるかどうかを確認する方法
- DOMノード値を変更する方法
- querySelectorAllから返されたDOM要素のリストにクリックイベントを追加する方法
- WebRTC、リアルタイムWeb API
- JavaScriptで要素のスクロール位置を取得する方法
- DOM要素を置き換える方法
- 入力ファイルフィールドの画像のみを受け入れる方法
- なぜブラウザのプレビューバージョンを使用するのですか?
- Blobオブジェクト
- ファイルオブジェクト
- FileReaderオブジェクト
- FileListオブジェクト
- ArrayBuffer
- ArrayBufferView
- URLオブジェクト
- 型付き配列
- DataViewオブジェクト
- BroadcastChannel API
- Streams API
- FormDataオブジェクト
- ナビゲーターオブジェクト
- GeolocationAPIの使用方法
- getUserMedia()の使用方法
- ドラッグアンドドロップAPIの使用方法
- Webページのスクロールを操作する方法
- JavaScriptでのフォームの処理
- キーボードイベント
- マウスイベント
- タッチイベント
- DOM要素からすべての子を削除する方法
- バニラJavascriptを使用してHTML属性を作成する方法
- JavaScriptを使用してチェックボックスがチェックされているかどうかを確認するにはどうすればよいですか?
- JavaScriptを使用してクリップボードにコピーする方法
- JavaScriptを使用してボタンを無効にする方法
- ブラウザでページを編集可能にする方法
- URLSearchParamsを使用してJavaScriptでクエリ文字列値を取得する方法
- ページからすべてのCSSを一度に削除する方法
- insertAdjacentHTMLの使用方法
- Safari、終了する前に警告する
- JavaScriptを使用してDOMに画像を追加する方法
- フォームをリセットする方法
- GoogleFontsの使い方