1年ほど前に、
webpack v3 から
実施した
前提
アップデート前の
workbox 関連パッケージの 状況
workbox-sw
と、workbox-webpack-plugin
を使用しています。 % npm outdated | grep workbox workbox-sw 2.1.3 2.1.3 3.6.3 mutter.monotalk.xyz workbox-webpack-plugin 2.1.3 2.1.3 3.6.3 mutter.monotalk.xyz
アップデート対象の
アプリの workbox の 使い 方
workbox-webpack-plugin をgenerateSW で 使用しています。
自前でworkbox を 使った 処理は 実装して おらず、 自動生成された ServieWorker で Cache 機能のみ 使用しています。
アップデート
以下、
package.json の
更新 "devDependencies": { .. "workbox-sw": "^3.6.3", "workbox-webpack-plugin": "^3.6.3" .. }
npm コマンドの
実行 npm install added 26 packages from 13 contributors and updated 5 packages in 22.332s
対応方針
Migrate from Workbox v2 to v3 | Workbox | Google Developers には、
APIが、
GenerateSWと InjectManifestの 2つの クラスに 別れた。 webpack ビルドに
含まれていない アセットが なければ、 globPatterns の 設定は 不要に なった。
しかし
発生した エラーと 対処した 内容
以下、
TypeError: WorkboxPlugin is not a constructor
workbox-webpack-plugin v2 では、WorkboxPlugin を インスタンス化して 使用する 作りでしたが、 workbox-webpack-plugin v3 では、 GenerateSW を インスタンス化して 使うようになりました。
Example を貼り付けますが、 以下のような 記載に なります。 // Inside of webpack.config.js: const {GenerateSW} = require('workbox-webpack-plugin'); module.exports = { // Other webpack config... plugins: [ // Other plugins... new GenerateSW({ option: 'value', }) ] };
ValidationError: child “runtimeCaching” fails because [“runtimeCaching” at position 0 fails because [“cacheName” is not a supported parameter., “cacheExpiration” is not a supported parameter.]]
これは、runtimeCaching
の記載方法が 変更に なったので 発生しました。
無効な設定が あると、 ビルドが 失敗するようになっているようです。
options 内に、cacheName を 移動しました。 ValidationError: child “runtimeCaching” fails because [“runtimeCaching” at position 0 fails because [child “options” fails because [“cacheExpiration” is not a supported parameter.]]]
cacheExpiration
はキー名が expiration
になっているようです。
キー名を変更して 対応しました。 WARNING in You’re using the following Workbox configuration options: [globDirectory, globPatterns]. In Workbox v3 and later, this is usually not needed. Please see https://goo.gl/EQ4Rhm for more info.
globDirectory、globPattern は v3 では 大抵の 場合、 いらないと いう 警告に なります。
これはマイグレーションガイドに 記載が あった 内容ですね。
workbox-webpack-plugin のv3 からは precache-manifest
という ファイルを 生成するようになり、 この ファイルが 空気を 読んで Cache が 必要な ファイルを 読み 込んでくれます。
precache-manifest
の生成内容を 見る 限り、 削除して 問題なさそうでしたので、 globDirectory、 globPattern の 指定を 削除しました。 WARNING in One of the glob patterns doesn’t match any files. Please remove or fix the following
globDirectory、globPattern の 設定で マッチする ファイルが なかった 場合に 出力される 警告です。 globDirectory、WARNING in One of the glob patterns doesn't match any files. Please remove or fix the following: { "globDirectory": "/xxxxxx", "globPattern": "static/webpack_bundles/*.png", "globIgnores": [ "**/node_modules/**/*" ] }
globPattern の 記載を 削除した ことで 警告は 出力されなくなりました。
エラーには ならなかったが、 調整した ところ
エラーにはなりませんでしたが、swDest: distBase + "/templates/CacheWorker.js"
と
Webpack で
output: { path: distBase + "/static/webpack_bundles/", library: "Main", filename: "[name]-[hash].js", publicPath: "/static/webpack_bundles/" },
気になった 設定、 機能
エラーが
v3 の
* importWorkboxFrom
default が
importScripts
v2 だと、指定できなかった 気が します。 GenerateSW で importScripts する スクリプトを 指定できるようになりました。 offlineGoogleAnalytics
true にすると、 workbox.googleAnalytics
の初期化を 行う コードを 追加してくれます。 manifestTransforms
__precacheManifest
に記載される URL の 変更ルールを 実装できます。
v2 から
個人的に
v4 Milestone
webpack.config.js の 修正差分
以下のようになりました。
GenerateSW を
使用する -const WorkboxPlugin = require("workbox-webpack-plugin"); +const {GenerateSW} = require('workbox-webpack-plugin');
publicPath の
設定 output: { path: distBase + "/static/webpack_bundles/", library: "Main", - filename: "[name]-[hash].js" + filename: "[name]-[hash].js", + publicPath: "/static/webpack_bundles/" },
GenerateSW を
使用する、 options に 設定する キー値の 変更 - new WorkboxPlugin({ - globDirectory: distBase, - globPatterns: [ - "static/js/**/*.js", - "static/css/**/*.css", - "static/webpack_bundles/*.png" - ], + new GenerateSW({ runtimeCaching: [ { urlPattern: /\/api\/v2\/.+/, handler: "networkFirst", - "cacheName": "api", - "cacheExpiration": { - "maxAgeSeconds": 60 * 60 * 24, "maxEntries": 20 - }, options: { + expiration: { + maxAgeSeconds: 60 * 60 * 24, + maxEntries: 20 + }, + cacheName: "api", cacheableResponse: { statuses: [0, 200] }
参考
以下、
Workbox の
ドキュメント Workbox の
precacheManifest の importScripts に 記載される path 調整の ために 参考に した Github の Issue と Pull Request - Missing webpack publicPath on workbox.setConfig modulePathPrefix · Issue #1366 · GoogleChrome/workbox
- Workbox Webpack Generates URLs that Point to New Origin · Issue #1534 · GoogleChrome/workbox
- Make webpack path and filename options more customizable by jeffposnick · Pull Request #1403 · GoogleChrome/workbox
参考に
なった スライド
以上です。
コメント