Angularサービスワーカー実装の以前のバージョンでは、構成オプションの1つは"routing"
でした。これはこれで見ることができます 未回答SO質問 、これで参照されました Angular CLI issue 、そして残りの最良のドキュメントは Stephen Fluinのブログ投稿 (Angularチーム)、および I/Oトーク Alex Rickabaugh(Googleから)。
Angular 5を使用すると、ServiceWorkerModule
が適切に構築され、ほとんどの構成をngsw-config.json
ファイルを使用して処理できるようになりました。ただし、ルートのリダイレクトを処理する方法については、 angular.ioガイド または ドキュメント のどこにも言及されていません。そのため、次の問題が発生します。アプリにアクセスしてオフラインになったときに、直接アクセスしてもアプリにアクセスできます。 https://jackkoppa.github.io/cityaq-sw-issue 。ただし、ロード時にアプリはsearch
ルートにリダイレクトされ、ほとんどのユーザーは https://jackkoppa.github.io/cityaq-sw-issue/searchのようなURLからロードしようとします。 ?cities = Shanghai (簡単にするために、今のところChromeデスクトップとモバイルについて、そして可能な場合はシークレットモードで話しています)。
オフラインでそのURLにアクセスしようとすると、すぐに504-ゲートウェイタイムアウトが発生します。これは、Service Workerがインデックスをキャッシュしているだけで、他のルートがロードできるようにインデックスにリダイレクトする必要があることを知らないために発生しています。 Angularサービスワーカーの実装の以前の反復が、特定のルートのインデックスへのリダイレクトを設定することにより、このシナリオを処理できたと確信しています。 現在のAngular 5+ ngsw-config.json
、または生成されたngsw.json
ファイルでこのリダイレクトを処理する方法はありますか?それを除いて、回避策は別のサービスワーカーJSファイルでどのように処理する必要がありますか?
TL; DR:私の場合、破損の原因となる少なくとも2つの問題を特定しました。 this build script を使用して修正を試み、アプリがオフラインで動作することを確認できます here 。さらなるテストとプルリクエストが必要です。
文書化された答えを見つけることができませんでしたが、ngsw-worker.js
ファイルをステップ実行し、@angular/service-worker
コミット履歴を読むことで、これまでに見つけたものをここに示します。
「ルーティング」への新しいServiceWorkerModule
アプローチは、「ナビゲーション」リクエスト(つまり、同じドメイン上の非インデックスルート)を取得し、handleFetch
メソッドを再実行しますが、 index.html
リクエスト( source ) SPAがインデックスのキャッシュファイルを取得すると、URLにリダイレクトできる必要があるため、これは正常に機能するはずです。
したがって、オフライン時に上記のサイトが失敗する原因となっている問題は、ルーティングに直接関係していてはならず、これまでのところ2つ見つかっています。これらを回避策で修正することで、アプリをほぼ期待どおりに動作させることができました。元の質問の再現手順で、 cityaq が機能するようになりましたが、元の失敗したサイト cityaq-sw-issue を再現しました。
問題:
ホストのバージョンのAngularアプリ、--base-href
フラグがCLIから設定されている場合、サービスワーカーリソースの絶対URLを一覧表示します。これらのリソースへの要求を比較する場合、ngsw-worker.js
は相対URLを予期しています
私の経験では、ngsw-worker.js
が使用できる3つの使用可能な「状態」のうち、EXISTING_CLIENTS_ONLY
は間違って設定されているようです。
問題#1のPRを作成し、問題#2の理解を助けるのを待っている間に、回避策ビルドスクリプトを使用して、ngsw-worker.js
が生成された後に変更します。警告:EXISTING_CLIENTS_ONLY
を設定する意図した「安全な」動作をく、間違いなく変更します。ただし、私のアプリの場合、ローカルで実行するとき(http-server
)とライブURL(私の場合はGitHubページ)にデプロイするときの両方で、正しいオフラインパフォーマンスが可能です。
回避策を使用するには:(Angular 5、w/Angular 5.2.1)
npm install replace-in-file --save-dev
build/fix-sw.js
package.json
:"scripts": {
...
"sw-build": "ng build --prod && node build/fix-sw",
"sw-build-live": ng build --prod --base-href https://your-url.com/ && node build/fix-sw"
...
}
npm run sw-build cd dist http-server -p 8080を実行します
npm run sw-build-live