ホームページ > ウェブフロントエンド > jsチュートリアル > Web ワーカーとは何か、またフロントエンドのパフォーマンスを最適化するために Web ワーカーを活用する方法

Web ワーカーとは何か、またフロントエンドのパフォーマンスを最適化するために Web ワーカーを活用する方法

Susan Sarandon
リリース: 2025-01-05 02:00:40
オリジナル
291 人が閲覧しました

こんにちは、ヴァイナルがまた来ました! ?

私のブログへようこそ。かなり時間が経ってしまいましたが、今年取り組んできた 1 つのプロジェクト、つまりスマートな法的契約の草案、テスト、実験に使用されるテンプレート プレイグラウンドに取り組む中で、最新の発見と学んだことの一部を共有できることを嬉しく思います。そして書類。今日は、Web ワーカー について、その概要、仕組み、フロントエンド プロジェクトを強化するために Web ワーカーを使用する方法について詳しく説明します。

それでは、あなたがビールを飲むためにバーにいると想像してみましょう。バーテンダー (メインスレッド) は注文を受け、注文の準備をし、カウンターを一度に掃除しなければなりません。彼らが複雑な注文 (重い計算) を作成するのに忙しい場合、列に並んでいる他の人は待たなければなりません。イライラしますよね?ここで、バーテンダーにアシスタント (Web ワーカー) がいて、バーテンダーが注文を受けて注文することに集中している間、バックグラウンドでパイント グラスの洗浄と整理を担当していると想像してください。このチームワークにより、スムーズな業務が保証されます。

これはほんの概要です。この説明から API を想像するかもしれませんが (笑)、いいえ、違います。早速見ていきましょう。

Web ワーカーとは何ですか?

Web 開発における Web ワーカーはまさにそのアシスタントに似ています。これらはバックグラウンドで負荷の高いタスクを処理し、メインスレッドを解放してアプリの応答性とスムーズさを維持します。この記事では、Web ワーカーについて詳しく説明し、その主要な機能を調べ、Web ワーカーを操作する方法を説明し、3 つの現実世界のシナリオを使用してフロントエンド開発における Web ワーカーの力を実証します。また、ここでの主な使用例は React であるため、Vue などの他のフレームワークで Web ワーカーを使用するためのヒントも提供します。

3 種類の Web ワーカー

Web Workers の使用方法に入る前に、次の 3 つの主要なタイプを理解しましょう。

専用ワーカー: これらは 1 つのスクリプトに固有であり、最も一般的に使用されるワーカーです。これらは、バックグラウンド計算や 1 つのアプリ インスタンスの API 呼び出しの処理などのタスクに最適です。

例: 特定のユーザー セッションのデータを圧縮します。

共有ワーカー: これらは複数のスクリプトまたはブラウザー タブ間で共有できるため、タブ間でのデータの同期など、クロスタブ通信が必要なタスクに最適です。

例: 複数のブラウザ タブ間でユーザー セッション データの一貫性を維持します。

サービス ワーカー: 専用ワーカーや共有ワーカーとは異なり、これらはネットワーク リクエストをインターセプトし、アプリとネットワーク間のプロキシとして機能します。これらは通常、キャッシュとオフライン サポートに使用されます。

例: ユーザーがオフラインのときにキャッシュされたテンプレートを提供します。

これらのタイプの詳細については、MDN の Web Workers ドキュメントを参照してください。

What Are Web Workers and How to Leverage Them for Optimized Frontend Performance

どのワーカーを使用するかを知るには、タスクの範囲を考慮してください。

  • 分離された単一スクリプトのタスクには専用ワーカーを使用します。

  • 複数タブの通信には共有ワーカーを使用します。

  • キャッシュやオフライン機能などのネットワーク関連のタスクには Service Worker を使用します。

Web Workers の主な利点は、これらのタスクをメインスレッドからオフロードして、スムーズなユーザー エクスペリエンスを保証できることです。メインスレッドとワーカー間の通信は、postMessage API と onmessage API を使用するメッセージング システム経由で行われます。

Web ワーカーの主要な機能

  • onmessage: メインスレッドからワーカーに送信されたメッセージを処理します。
self.onmessage = (event) => {
  console.log('Message received from main thread:', event.data);
};
ログイン後にコピー
  • postMessage: ワーカーからメインスレッドにメッセージを送り返します。
self.postMessage('Task completed');
ログイン後にコピー
  • terminate: ワーカーの実行を停止します。
worker.terminate();
ログイン後にコピー
  • エラー処理: ワーカー内のエラーをキャッチします。
self.onerror = (error) => {
  console.error('Worker error:', error.message);
};
ログイン後にコピー

その他の便利な関数には、外部スクリプトをロードするための importScripts、ワーカーをシャットダウンするための self.close、時間指定された操作のための setTimeout/setInterval などがあります。詳細については、必要に応じてドキュメントを参照してください。

Web プレイグラウンド プロジェクトでの使用例の例

Web ワーカーがサンプルの Template Playground プロジェクトを大幅に強化できる 3 つの実践的なシナリオを次に示します。

ケース 1: テンプレート データの API 呼び出し

API からテンプレート データを取得すると、使用前に解析する必要がある巨大なデータセットが生成される場合があります。これを直接実行すると、UI スレッドがブロックされる可能性があります。

1.ワーカー ファイルを作成します: dataParser.worker.js.
を作成します。

// dataParser.worker.js
self.onmessage = (event) => {
  const { rawData } = event.data;
  const parsedData = rawData.map((template) => ({
    name: template.name,
    tag: template.tag,
  }));

  self.postMessage(parsedData);
};
ログイン後にコピー

2. React でワーカーを使用する:

import React, { useState } from 'react';

export default function templateDataParser({ rawData }) {
  const [parsedData, setParsedData] = useState([]);

  const parseData = () => {
    const worker = new Worker(new URL('./dataParser.worker.js', import.meta.url));
    worker.postMessage({ rawData });

    worker.onmessage = (event) => {
      setParsedData(event.data);
      worker.terminate();
    };
  };

  return (
    <div>
      <button onClick={parseData}>Template Parsed Data</button>
      <pre class="brush:php;toolbar:false">{JSON.stringify(parsedData, null, 2)}
); }
ログイン後にコピー

ケース 2: URL の圧縮と解凍

ユーザーがコンパクトな URL を介してテンプレートを共有できるようにするため、Web Workers は圧縮と解凍を効率的に処理できます。

1.ワーカー ファイルを作成します: urlCompressor.worker.js.
を作成します。

// urlCompressor.worker.js
import LZString from 'lz-string';

self.onmessage = (event) => {
  const { action, data } = event.data;
  let result;

  if (action === 'compress') {
    result = LZString.compressToEncodedURIComponent(data);
  } else if (action === 'decompress') {
    result = LZString.decompressFromEncodedURIComponent(data);
  }

  self.postMessage(result);
};

ログイン後にコピー

2. React でワーカーを使用する:

import React, { useState } from 'react';

export default function URLCompressor({ template }) {
  const [compressedURL, setCompressedURL] = useState('');

  const compressTemplate = () => {
    const worker = new Worker(new URL('./urlCompressor.worker.js', import.meta.url));
    worker.postMessage({ action: 'compress', data: template });

    worker.onmessage = (event) => {
      setCompressedURL(event.data);
      worker.terminate();
    };
  };

  return (
    <div>
      <button onClick={compressTemplate}>Compress Template</button>
      <pre class="brush:php;toolbar:false">{compressedURL}
); }
ログイン後にコピー

ケース 3: テンプレートのアニメーションの読み込みの処理

複数のテンプレートをロードしている間、Web ワーカーはメタデータまたは構成を非同期的に処理できます。

1.ワーカー ファイルを作成します: templateLoader.worker.js を作成します。

// templateLoader.worker.js
self.onmessage = (event) => {
  const { templates } = event.data;
  const loadedTemplates = templates.map((template) => {
    return { ...template, loadedAt: new Date() };
  });

  self.postMessage(loadedTemplates);
};
ログイン後にコピー

2. React でワーカーを使用する:

import React, { useState } from 'react';

export default function TemplateLoader({ templates }) {
  const [loadedTemplates, setLoadedTemplates] = useState([]);

  const loadTemplates = () => {
    const worker = new Worker(new URL('./templateLoader.worker.js', import.meta.url));
    worker.postMessage({ templates });

    worker.onmessage = (event) => {
      setLoadedTemplates(event.data);
      worker.terminate();
    };
  };

  return (
    <div>
      <button onClick={loadTemplates}>Load Templates</button>
      <pre class="brush:php;toolbar:false">{JSON.stringify(loadedTemplates, null, 2)}
); }
ログイン後にコピー

これらは、Web ワーカーがあなたの仕事を改善できる 3 つのシナリオです。ご自身のプロジェクトや実験で自由に試してみてください。

他のフレームワークで Web ワーカーを使用するためのヒント

Vue: ワーカーローダー プラグインを使用し、Vue コンポーネント内でワーカーを呼び出します。

Angular: ng generated web-worker コマンドを使用して、Angular の組み込み Web Worker サポートを利用します。

Svelte: vite-plugin-svelte ローダーを使用して、ワーカーをシームレスにインポートして使用します。

結論

ヴィオラ、もう最後まで来たね! ? Web ワーカーはアプリの秘密アシスタントのようなもので、メインスレッドが優れたユーザー エクスペリエンスを提供することに重点を置いている間、面倒な作業を静かに処理します。 URL 圧縮、API 呼び出し、データの前処理などのシナリオで Web ワーカーを使用すると、アプリの応答性が大幅に向上し、ユーザーのエクスペリエンスがよりスムーズになります。

それでは、待ってはいけません。今すぐ Web Workers の実験を開始して、Web アプリケーションの可能性を最大限に引き出してください。次回お会いしましょう! ?

参考文献

以上がWeb ワーカーとは何か、またフロントエンドのパフォーマンスを最適化するために Web ワーカーを活用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
前の記事:JavaScript でのパンブル 次の記事:Codewars - 初心者向けシリーズ #um の数字
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート