Базовая конфигурация рабочего ящика для извлечения ресурсов / фрагментов

#reactjs #webpack #workbox

#reactjs #webpack #workbox

Вопрос:

Я пытался заставить Workbox работать в моем пользовательском проекте webpack, но, думаю, я немного заблудился.

Моя цель — получить фрагменты js из service-worker остальные статические файлы.

В настоящее время моя конфигурация webpack выглядит следующим образом:

 const webpack = require('webpack');
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { clientPath, staticPath, currentWorkingDirectory, configPath } = require('../paths');
const Dotenv = require('dotenv-webpack');
const babelConf = require('../babelrc');
const TerserPlugin = require('terser-webpack-plugin');
const { GenerateSW } = require('workbox-webpack-plugin');
const { NODE_ENV, CYPRESS } = process.env;
const isDev = NODE_ENV === 'development';
const isProd = NODE_ENV === 'production';

const webpackConfig = {
  mode: NODE_ENV,
  devtool: isDev ? 'eval-source-map' : undefined,
  entry: {
    client: [
      'core-js/modules/es6.promise',
      'core-js/modules/es6.array.iterator',
      path.resolve(clientPath, 'client.tsx'),
    ],
  },
  output: {
    filename: '[name].bundle.js',
    chunkFilename: '[name].chunk.js',
    path: path.resolve(currentWorkingDirectory, 'build', 'client'),
    publicPath: '/assets/',
  },
  module: {
    rules: [
      {
        test: /.(tsx?)|.(jsx?)$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              ...babelConf,
              cacheDirectory: isDev,
            },
          },
        ],
      },
      {
        test: /.(jpg|png|svg)$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 25000,
          },
        },
      },
    ],
  },
  plugins: [
    new Dotenv({
      path: path.resolve(currentWorkingDirectory, '.env'),
      // machine env variables take precedence over those in .env
      systemvars: CYPRESS || isProd,
      silent: isProd,
    }),
    new webpack.DefinePlugin({
      __DEV__: isDev,
      __PROD__: isProd,
    }),
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'index.ejs'),
      chunks: ['client'],
    }),
    new TerserPlugin({...}),
    new GenerateSW({
      swDest: 'service-worker.js',
      clientsClaim: true,
      skipWaiting: true,
    }),
  ],
  profile: isDev,
  watch: isDev,
  watchOptions: {
    ignored: /node_modules/,
  },

  // Useful for optimizing de external dependencies. Uncomment to activate
  // new BundleAnalyzerPlugin(),
  resolve: {
    symlinks: isProd,
    extensions: ['.js', '.jsx', '.ts', '.tsx', '.json', '*'],
    mainFields: ['browser', 'module', 'main', 'types'],
  },
};

if (isDev) {
  webpackConfig.plugins.push(new webpack.HotModuleReplacementPlugin());
}
module.exports = webpackConfig;
  

И у меня есть это в моем index.ejs :

   if ('serviceWorker' in navigator) {
    window.addEventListener('load', () => {
      navigator.serviceWorker.register('/assets/service-worker.js').then(registration
=> {
        console.log('SW registered: ', registration);
      }).catch((registrationError) => {
        console.log('SW registration failed: ', registrationError);
      });
    });   }
  

Поэтому всякий раз, когда я загружаю свою страницу, я получаю SW, зарегистрированный со следующим содержимым:

 /**
 * Welcome to your Workbox-powered service worker!
 *
 * ...
 */

importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.1.1/workbox-sw.js");

importScripts(
  "/assets/precache-manifest.ddd8b17ce0bc0a1ecf7bc6d1a5d8b832.js"
);

workbox.core.skipWaiting();

workbox.core.clientsClaim();
  

В манифесте:

 /**
 * The workboxSW.precacheAndRoute() method efficiently caches and responds to
 * requests for URLs in the manifest.
 * See ...
 */
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});

self.__precacheManifest = (self.__precacheManifest || []).concat([
  {
    "revision": "137741f4b7384bd4b2da",
    "url": "/assets/Onboarding.chunk.js"
  },
  {
    "revision": "16d41ee8945361f0d22e20185d323d4a",
    "url": "/assets/index.html"
  },
  {
    "revision": "0b06750859ab2667a078",
    "url": "/assets/vendors~Dashboard~Onboarding.chunk.js"
  },
  {
    "revision": "528d57fe189a244ba83d",
    "url": "/assets/OpenInsufficientFunds.chunk.js"
  },
  {
    "revision": "f0bc0ef109abd037e757",
    "url": "/assets/Dashboard~Onboarding.chunk.js"
  },
  {
    "revision": "2d41db393998fc587216",
    "url": "/assets/ErrorStep.chunk.js"
  },
  {
    "revision": "eb6aad1d525a6c54d376",
    "url": "/assets/ExpectedAmount.chunk.js"
  },
  {
    "revision": "e2b8e24b4ab5725b39cf",
    "url": "/assets/FailureInsufficientFunds.chunk.js"
  },
  {
    "revision": "d27900d0825c075f0b1f",
    "url": "/assets/KycAml.chunk.js"
  },
  {
    "revision": "06924db6ebc6ade0d162",
    "url": "/assets/Matured.chunk.js"
  },
  {
    "revision": "a52ea80876523dc37ffc",
    "url": "/assets/MemberConflict.chunk.js"
  },
  {
    "revision": "99198b15ba6366c9d3c2",
    "url": "/assets/MemberCreation.chunk.js"
  },
  {
    "revision": "14ff497a38508a3f82fe",
    "url": "/assets/NominatedAccount.chunk.js"
  },
  {
    "revision": "f22c4cc52ecc19eaf0a1",
    "url": "/assets/NonResidentRejection.chunk.js"
  },
  {
    "revision": "9c143a8a6a590c65854f",
    "url": "/assets/client.bundle.js"
  },
  {
    "revision": "3c5a20be89b88309f58f",
    "url": "/assets/UserDebugDashboard.chunk.js"
  },
  {
    "revision": "ca9267d1e0830e5c38c8",
    "url": "/assets/OpenSufficientFunds.chunk.js"
  },
  {
    "revision": "c94e7199ca5c48cf28d2",
    "url": "/assets/PeriodOpenNoFunds.chunk.js"
  },
  {
    "revision": "8d16616b001483751a73",
    "url": "/assets/ProductDescription.chunk.js"
  },
  {
    "revision": "35f6e282b5670e3fd86f",
    "url": "/assets/Reconciliation.chunk.js"
  },
  {
    "revision": "d9bad4a9afe5c23b8637",
    "url": "/assets/RedirectExternal.chunk.js"
  },
  {
    "revision": "99c168d65c76c530372c",
    "url": "/assets/SourceOfWealth.chunk.js"
  },
  {
    "revision": "13397b01a9296eaea18e",
    "url": "/assets/SuccessTermStarted.chunk.js"
  },
  {
    "revision": "dc3e1e7df9a37a8bc854",
    "url": "/assets/TaxResidency.chunk.js"
  },
  {
    "revision": "12604fb4dc1d454ea2b1",
    "url": "/assets/TermsAndConditions.chunk.js"
  },
  {
    "revision": "620ea69cd4b223dab23e",
    "url": "/assets/Dashboard.chunk.js"
  },
  {
    "revision": "89f94688e54bc9dae380",
    "url": "/assets/ContactPreferences.chunk.js"
  },
  {
    "revision": "21fb9840719c2fe31c52",
    "url": "/assets/AddressCreation.chunk.js"
  }
]);
  

Поэтому я ожидаю этого, когда использую React.ленивый с динамическим импортом ресурс, который я получаю, поступает от работника службы. Но это не так.

В режиме инкогнито Chrome я получаю следующее сообщение в консоли:

консоль Chrome

Когда я нажимаю кнопку, которая загружает другой фрагмент, я получаю это на вкладке сеть:

вкладка сеть

Что неверно, поскольку должно указывать «с диска» на все полученные файлы js, не так ли? Или я чего-то не хватает?

Спасибо 🙂