javascript - 在不弹出的情况下创建 React App 中的工作箱

标签 javascript reactjs create-react-app workbox

我正在尝试配置 Workbox在 CRA 中没有弹出。有人成功了吗?

最佳答案

经过数小时的反复试验,我成功地在 CRA 中拥有了工作箱。这是我的做法:

首先,yarn add -D workbox-build

接下来,在根文件夹中创建一个名为 build-sw.js 的文件:

const fs = require('fs-extra');
const pathmodule = require('path');
const workbox = require('workbox-build');

function build() {
  const cwd = process.cwd();
  const pkgPath = `${cwd}/node_modules/workbox-sw/package.json`;
  const pkg = require(pkgPath);
  const readPath = `${cwd}/node_modules/workbox-sw/${pkg.main}`;
  let data = fs.readFileSync(readPath, 'utf8');
  let path = `${cwd}/build/workbox-sw.js`;
  console.log(`Writing ${path}.`);
  fs.writeFileSync(path, data, 'utf8');
  data = fs.readFileSync(`${readPath}.map`, 'utf8');
  path = `${cwd}/build/${pathmodule.basename(pkg.main)}.map`;
  console.log(`Writing ${path}.`);
  fs.writeFileSync(path, data, 'utf8');

  workbox
    .injectManifest({
      globDirectory: 'build',
      globPatterns: ['**/*.{html,js,css,png,jpg,json}'],
      globIgnores: ['sw-default.js', 'service-worker.js', 'workbox-sw.js'],
      swSrc: './src/sw-template.js',
      swDest: 'build/sw-default.js'
    })
    .then(_ => {
      console.log('Service worker generated.');
    });
}

try {
  build();
} catch (e) {
  console.log(e);
}

之后,在 src/sw-template.js 中创建一个文件: (请记住,在此文件中您必须放置自己的缓存策略。有关详细信息,请参阅 Docs)

workbox.setConfig({
  debug: true
});

workbox.core.setLogLevel(workbox.core.LOG_LEVELS.debug);

workbox.precaching.precacheAndRoute([]);

workbox.skipWaiting();
workbox.clientsClaim();

workbox.routing.registerRoute('/', workbox.strategies.networkFirst());

最后,在 src/registerServiceWorker.js 中更改:

-      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
+      const swUrl = `${process.env.PUBLIC_URL}/sw-default.js`;

并在 package.json 中更改:

-      "build": "react-scripts build && sw-precache --config=sw-precache-config.js'",
+      "build": "react-scripts build && yarn sw",
+      "sw": "node build-sw.js"

希望对您有所帮助!

关于javascript - 在不弹出的情况下创建 React App 中的工作箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51533563/

相关文章:

reactjs - 未找到 React 应用程序的 GitHub Pages 页面

javascript - 海洋协议(protocol) react 教程 npm 启动失败

javascript - 在网页上如何显示在悬停时更改为下拉框的标签

javascript - 如何使用 javascript 在 Facebook 上分享文本?

reactjs - React Antd v4 自动完成在选择选项时显示选定的值而不是标签

javascript - 如何将 Material UI Table 放在页面中间?

javascript - 在 meteor 应用程序中将 base64 转换为 png

javascript - 为所有图像添加宽度和高度属性

css - 使用 React-Router 和 Outlet 时如何确保内容保留在下方

javascript - 使用 create-react-app 和 webpack 开发服务器将客户端 React 应用程序的请求代理到服务器