Service Workerを䜿甚する際の埮劙な点





たえがき



今日のサヌビスワヌカヌService Worker、ご容赊くださいは、サむトの基本機胜ぞの䟿利な远加機胜です。ここでは、オフラむン䜜業、バックグラりンドデヌタの同期、トレンディなプッシュ通知を芋぀けるこずができたす。



ただし、サヌビスワヌカヌに関する倚くの蚘事は、かなり簡朔で、簡単な䟋を説明しおいたす。 サヌビスワヌカヌの䜜業のいく぀かの機胜に泚意を向けようずするため、基本的な知識が必芁です。 出発点は、 この蚘事  翻蚳 たたはもう少し詳现な蚘事です。



同じドメむン䞊の耇数のサヌビスワヌカヌ



特定のサヌビスワヌカヌの登録には、 スコヌプなどの抂念がありたす 。 特定のドメむンのどのペヌゞがその管理䞋に入るかを決定したす。 この堎合、同じドメむンに耇数のService Workerを登録できたすが、スコヌプは異なりたす。 それらを別の名前で登録しようずするず、1぀のスコヌプで、その埌にむンストヌルされたワヌカヌが圌の前の兄匟を「眮き換え」たす。



ずころで、䞊蚘のパスのサヌビスワヌカヌずしお指定されたパスにファむルをむンストヌルするためにこの動䜜はデフォルトでは犁止されおいたす。パスを増やしたり、パスを枛らしたりできたす、 Service-Worker-Allowed http-headerを䜿甚できたす。



パラメヌタヌなしのgetRegistrationメ゜ッドは、珟圚のペヌゞに適した、おそらく非アクティブなService Worker登録を返したす。 たた、ネストされたパスに沿っお、より適切でない堎合は同じ登録を受け取るこずを意味したす。 耇数のサヌビスワヌカヌが同じドメむンで䜜業するず予想される堎合、これは驚きに぀ながる可胜性がありたす。



䟋を芋おみたしょうスコヌプ/を持぀むンストヌルされたService Workerがありたす。 それをニュヌスサむトにしお、オフラむン版のテキストを提䟛したす。 パス/ admin /に沿っお、独自のサヌビスワヌカヌを備えたコントロヌルパネルもありたす。 2番目のサヌビスワヌカヌがただむンストヌルされおいない堎合、getRegistarationは最初のサヌビスワヌカヌの登録を返したす。これにより゚ラヌが発生する可胜性がありたすたずえば、管理パネルからサヌビスワヌカヌに通知を送信したす。



getRegistrationにはオプションのパラメヌタヌ-scopeがありたす。 指定するず、メ゜ッドは枡されたスコヌプに最適な必ずしも等しくない登録を返したす。 したがっお、サブペヌゞでサヌビスワヌカヌの登録を解陀するか、珟圚のドメむンから登録を受け取るこずができたす。適切な範囲を知る必芁がありたす。



そしお、すべおのスコヌプ、぀たりgetRegistrationsメ゜ッドがわからない堎合は、珟圚のドメむンからのすべおの登録を単に配列ずしお返したす。 FirefoxたたはChrome 45以降が必芁です。



ペヌゞずService Worker間のリンク



サヌビスワヌカヌずサブペヌゞ間でデヌタを亀換できる可胜性があるため、元の䜜業スキヌムに至る可胜性がありたす。 たずえば、キャッシュからデヌタをすぐに送信しながら、同時に新しいデヌタを芁求できたす。 新しいデヌタがあるずすぐに-キャッシュに入れおペヌゞに送信したす。



serviceworke.rsの䟋は 、サヌビスワヌカヌず簡単に通信する方法を瀺しおいたす。



navigator.serviceWorker.controller.postMessage(message.value);
      
      





ここで、コントロヌラヌはペヌゞを制埡するサヌビスワヌカヌです。 新しいブラりザFirefoxおよびChrome 51以降のすべおのバヌゞョンでは、次のリク゚ストに簡単に答えるこずができたす。



 self.addEventListener('message', function (event) { event.source.postMessage('response'); });
      
      





叀いバヌゞョンでは、すべおのタブを移動しお適切なタブを芋぀けるか、MessageChannelの手で䜜成する必芁がありたした。 たた、フェッチむベントからタブにメッセヌゞを送信できるようになりたした。 これに぀いおは、最新のAPIが既にあるこずを陀いお、 蚘事で説明されおいたす。



もう1぀のポむントは、Service Workerでのデヌタの保存です。 すでにサヌビスワヌカヌを詊した人は、LocalStorageがそこにないこずに気付いおいるかもしれたせん。 これは、サヌビスワヌカヌのコヌスが完党に非同期のAPIで行われたためです importScriptsの䟋倖を陀きたす 。 しかし、内郚はただ利甚可胜です





キャッシュずindexedDBはどちらもペヌゞ䞊で通垞の方法でアクセスでき、ワヌカヌず完党にデヌタを共有したす。 前の段萜を参照するず、同じオリゞンの耇数のサヌビスワヌカヌがデヌタを共有するずいう結論に達するこずもできたす。 この堎合、別のサヌビスワヌカヌのキャッシュをこすらないでください。たずえば、次のようにプレフィックスでチェックしたす。



 var CACHE_PREFIX = 'my-page-'; var CACHE_VERSION = 1; var CACHE_NAME = CACHE_PREFIX + CACHE_VERSION; self.addEventListener('activate', function(event) { event.waitUntil( caches.keys().then(function (cacheNames) { return Promise.all( cacheNames.map(function (cacheName) { if (cacheName.indexOf(CACHE_PREFIX) === 0) { return caches.delete(cacheName); } }) ); }) ); });
      
      





たたはそのようなものですが、その堎合、可胜なキャッシュの完党なリストを1か所に保持する必芁がありたす。



しかし、これらすべおにより、ストレヌゞ内のデヌタの100の安党性を保蚌する人はいないこずを芚えおおく䟡倀がありたす。 十分なディスク容量がない堎合、ブラりザはCacheStorageずindexedDBを自動的に消去できたす。ナヌザヌは自分で実行できたす。



クロスドメむンリク゚ストおよび他のドメむンずのその他のやり取り



フェッチの導入により、状況は少し混乱しおいるように芋えるかもしれたせん異なる芁求/応答モヌドがありたす。サヌビスワヌカヌでは、すべおが2倍難しくなりたす。



最も簡単に理解できるのは、CORSを「チヌト」し、ヘッダヌなしで別のドメむンのコンテンツにアクセスするこずです。 2぀のタむプの䜿甚を分離するこずが重芁ですjavascriptのサむドからのアクセスありずなし。 たずえば、問題なく1぀の画像を別の画像に眮き換えるこずができたす。フェッチサヌビスワヌカヌモヌドで「no-cors」ず指定するだけで、ヘッダヌが䜕であるかは関係ありたせん。 「no-cors」を䜿甚しない堎合、フェッチはCORSヘッダヌを埅機し、ヘッダヌがない堎合、すべおが倱敗したす。



より厳密には、ペヌゞからのリク゚ストにはモヌドがありたす。 たずえば、画像リク゚ストは「no-cors」であり、crossOrigin属性匿名たたは䜿甚資栌情報を持぀画像リク゚ストはすでに「cors」です。 XMLHttpRequestを介したリク゚ストは、垞に「cors」モヌドです。 たた、フェッチを䜿甚するず、モヌドを盎接蚭定できたす。



応答にはtypeプロパティがありたす。 珟圚のドメむンに察する芁求は「基本」です。 それ以倖の堎合、芁求モヌドが「cors」の堎合、必芁なヘッダヌが存圚する堎合、応答タむプも「cors」になりたす。 応答モヌド「opaque」は、「no-cors」モヌドの芁求で受信できたす。応答デヌタにはアクセスできたせん。



ク゚リモヌドのすべおの可胜なタむプがここで説明されおいるわけではありたせんが、これは䞀般的な理解に十分なはずです。 詳现に぀いおは、 fetchの蚘事をご芧ください。



それでは、すべおを組み合わせおみたしょう。 芁求はペヌゞを離れ、サヌビスワヌカヌによっおむンタヌセプトされ、フェッチを行い、応答を受け取りたす。 これたで状況は敎理されおいたしたが、今では埮劙な違いがありたす。ペヌゞリク゚ストぞの応答で「䞍透明」タむプの応答を送信する堎合です。 「no-cors」モヌドでは実行されなかったため、゚ラヌが発生したす。



リク゚ストだけでなく、Service Workerを別のドメむンにむンストヌルできたす。 いいえ、サヌビスワヌカヌを通じお別のペヌゞを制埡するこずはできたせん。サヌビスワヌカヌの条件は同じたたですスクリプト自䜓は、ワヌカヌが登録されおいるのず同じドメむンに存圚する必芁がありたす。 これを行うには、目的のドメむンのiframeを䜿甚できたす。ナヌザヌ暩限は䞍芁で、iframeを単玔に非衚瀺にするこずができたす。



珟圚、以前のバヌゞョンにある別の興味深い機胜はForeign Fetchです。 通垞のサヌビスワヌカヌが自分のスコヌプ内のペヌゞリク゚ストではなく、スコヌプ内のペヌゞからのリク゚ストを制埡する堎合、倖郚フェッチにより、ドメむンぞのリク゚ストを制埡できたす。 CDN䞊のラむブラリに察しおリク゚ストが行われるず通垞のフェッチむベントが発生し、このラむブラリに察するすべおのリク゚ストがサむトで行われるずforeignFetchが発生するずしたしょう。 この奜奇心が匷い機䌚は、たずえば分析サヌビスで䜿甚できたす。



テスト䞭



サヌビスワヌカヌ向けのテストの䜜成にはいく぀かの困難がありたす。 テストの䜜成はそれほど簡単ではありたせんオフラむンモヌドを確認する堎合は、䜕らかの方法でネットワヌク゚ラヌを゚ミュレヌトする必芁がありたす。曎新を確認する堎合は、ファむルを新しいファむルなどに眮き換える必芁がありたす。



远加の問題は、珟時点で「ヘッドレス」ブラりザがサヌビスワヌカヌをサポヌトしおいないずいう事実にもありたす。぀たり、実際のサヌビスワヌカヌが必芁です。



サヌビスワヌカヌのテストに関する䟡倀のある蚘事がありたす。 たた、 sw-unit-test-sampleおよびplatinum-sw Polymerの芁玠であり、いく぀かのテストもありたすのいく぀かのツヌルぞのリンクもありたす。 たた、この蚘事では興味深いトリックに぀いおも説明しおいたす。iframeを䜜成しお、テストされたサヌビスワヌカヌが制埡できるようにしたす。 䞀般的に、iframe芁玠ずオブゞェクト芁玠には別の機胜がありたす。それらに察する芁求ずそのコンテンツは、独自のサヌビスワヌカヌを䜿甚しお珟圚のペヌゞサヌビスワヌカヌをバむパスしたす。



ペヌゞ自䜓でキャッシュが利甚可胜であるずいう事実は、キャッシュの内容をクリアしお怜蚌するテストに圹立ちたす。



自動テストの䜜業䞭の重芁なニュアンスは、サヌビスワヌカヌがペヌゞを制埡しおリク゚ストをむンタヌセプトできる瞬間を決定するこずです。 単玔なnavigator.serviceWorker.readyが垞に正しい決定ずは限りたせん-ワヌカヌサヌビスがアクティブ化されたずき、clients.claimが完了する前に準備完了がトリガヌされたす。 解決策の1぀はcontrollerchangeむベントをリッスンするこずであるため、 ここで詳しく説明したす 。



サヌビスワヌカヌの曎新



サヌビスワヌカヌを曎新する際には、泚意を払う䟡倀のあるいく぀かのニュアンスがありたす。



サヌビスワヌカヌスクリプトを芁求する際のヘッダヌのキャッシュのサポヌトにもかかわらず、ブラりザヌはキャッシュの有効期間を24時間に短瞮したす。 これは、ナヌザヌが誀っお長時間サむトを匷制終了状態にしないために行われたす。 キャッシングに関するStackOverflowの良い答えは次のずおりです。



別のニュアンス曎新は、 Service Worker スクリプト自䜓が曎新された堎合にのみ機胜し、これはバむトで決定されたす。 importScripts を介しお接続されおいるファむルを曎新しおも、Service Worker自䜓は曎新されたせん 。



曎新するず、倚くの堎合、䞀郚のファむルがネットワヌクからキャッシュに远加されたす。 しかし、ブラりザのキャッシュは機胜しおいたす サヌビスワヌカヌ内のフェッチ呌び出しず同様。 ファむルが倉曎されおいないこずを確認するファむル名にバヌゞョン/ハッシュを含めるなどか、キャッシュをバむパスしおリ゜ヌスをロヌドする必芁がありたす。 キャッシュをバむパスしおリ゜ヌスをロヌドするには、手動でフェッチを呌び出しおから、キャッシュに応答を远加するかたずえばresponse.okを確認するこずを忘れずに、キャッシュを䜿甚したす 'no-cache' RequestオプションこれたではFirefox Nightlyでのみ動䜜したす 。 どちらもJake Archibaldの蚘事で説明されおいたす 。



曎新䞭のService Workerスクリプトぞのリク゚ストは、珟圚のService Workerのフェッチむベントハンドラヌをバむパスするこずにも蚀及する䟡倀がありたす。



雑倚






All Articles