以下のGIFのように、ウェブサイトの読み込みに時間がかかりすぎるという状況はありませんか?
? サービス ワーカーについて聞いたことがありますか?
この投稿では、Service Worker とは何なのか、Service Worker がどのように機能するのか、⚙️、そして Web アプリケーションのパフォーマンスを向上させるために Service Worker をどのように使用したかについて詳しく説明します。
Service Worker とは何ですか? ?
Service Worker は、Web ページとは別に実行されるバックグラウンド スクリプトであり、次のことができます。
Service Worker の主な特徴:
Service Worker スクリプトの簡単な例を次に示します:
if ('serviceWorker' in navigator) { window.addEventListener('load', function() { navigator.serviceWorker.register('/service-worker.js').then(function(registration) { console.log('Service Worker registered with scope:', registration.scope); }).catch(function(error) { console.error('Service Worker registration failed:', error); }); }); }
?このスニペットでは、ページの読み込み時に Service Worker (service-worker.js) が登録されます。登録が成功すると、Service Worker のスコープが記録されます。それ以外の場合は、エラーがログに記録されます。
Unity WebGL ゲームを .NET Razor Web サイトに統合していました。ゲームは、ゲームのロードに不可欠な JavaScript ファイルとともに、大きな「.wasm」ファイルと「.data」ファイルで構成されていました。ただし、初めてページが読み込まれるときは 20 秒以上かかりました。 ?これは主に、「.wasm」ファイルと「.data」ファイルのサイズが原因でした。
ロード時間を短縮するために必要なすべてのゲーム アセットをキャッシュする「ServiceWorker.js」ファイルを作成しました。ファイルの内容は次のとおりです:
const cacheName = "$Project_name"; const contentToCache = [ "Build/Game.loader.js", "Build/Game.framework.js", "Build/Game.data", "Build/Game.wasm", "TemplateData/game_style.css" ]; self.addEventListener('install', function (e) { console.log('[Service Worker] Install'); e.waitUntil((async function () { try { const cache = await caches.open(cacheName); console.log('[Service Worker] Caching all: app shell and content'); for (const resource of contentToCache) { try { await cache.add(resource); } catch (error) { console.error(`[Service Worker] Failed to cache: ${resource}`, error); } } } catch (error) { console.error('[Service Worker] Failed to open cache', error); } })()); }); self.addEventListener('fetch', function (e) { e.respondWith((async function () { try { const response = await caches.match(e.request); console.log(`[Service Worker] Fetching resource: ${e.request.url}`); if (response) return response; const fetchResponse = await fetch(e.request); const cache = await caches.open(cacheName); console.log(`[Service Worker] Caching new resource: ${e.request.url}`); await cache.put(e.request, fetchResponse.clone()); return fetchResponse; } catch (error) { console.error(`[Service Worker] Error fetching resource: ${e.request.url}`, error); throw error; } })()); });
このコードは何をしますか?
この Service Worker スクリプトは次のアクションを実行します:
これらのアセットをキャッシュすることにより、読み込み時間が 20 秒から 3 秒未満に短縮されました。次回ユーザーがページにアクセスすると、アセットはすでにローカルに保存されているため、エクスペリエンスが大幅に高速化されます。
このアプローチはパフォーマンスの向上に驚くほど効果的ですが、古いキャッシュされたファイルという別の問題が発生しました。私たちは Unity ゲームを積極的に開発し、新しいバージョンをリリースしているため、新しいバージョンがデプロイされるたびにキャッシュされたファイルをクリアする必要がありました。
これを解決するために、新しいゲーム ビルドを公開するたびに自動的に 古い Service Worker の登録を解除し キャッシュをクリアするパイプライン スクリプトを作成しました。これにより、ユーザーはキャッシュされた古いバージョンに固執することなく、常に最新のアセットをロードできるようになります。
Web アプリケーションに Service Worker を実装すると、特に Unity WebGL ゲームのような大規模なアセットを扱う場合、パフォーマンスが大幅に向上します。ただし、古いファイルが提供されないようにキャッシュを慎重に処理することが重要です。
ロード時間を最適化する際に同じような経験をしたことがありますか? Service Worker または他のテクニックを使用しましたか?以下のコメント欄であなたの考えや洞察を共有してください! ?
今日は何か新しいことを学べたでしょうか。 ✌️
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3