代码之家  ›  专栏  ›  技术社区  ›  Albert Olivé Corbella

不弹出的Create React应用程序中的Workbox

  •  3
  • Albert Olivé Corbella  · 技术社区  · 7 年前

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

    2 回复  |  直到 6 年前
        1
  •  6
  •   mjsarfatti    7 年前

    经过数小时的试验和错误之后,我在CRA中成功地拥有了Workbox。我是这样做的:

    第一, 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"
    

    希望它有帮助!

        2
  •  4
  •   user158    6 年前

    与…合并 this PR ,创建react app 2 now支持现成的Workbox,因为它现在使用 workbox-webpack-plugins 内部的。

    查看官方文档了解更多信息: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app