Parcourir la source

feat: support pwa config (#3508)

* feat: support pwa config

* style: change code style
陈帅 il y a 7 ans
Parent
commit
178c48deda
3 fichiers modifiés avec 64 ajouts et 54 suppressions
  1. 11 7
      config/config.js
  2. 1 0
      src/defaultSettings.js
  3. 52 47
      src/global.js

+ 11 - 7
config/config.js

@@ -5,6 +5,8 @@ import webpackPlugin from './plugin.config';
 import defaultSettings from '../src/defaultSettings';
 import slash from 'slash2';
 
+const { pwa, primaryColor } = defaultSettings;
+
 const plugins = [
   [
     'umi-plugin-react',
@@ -22,12 +24,14 @@ const plugins = [
         loadingComponent: './components/PageLoading/index',
         webpackChunkName: true,
       },
-      pwa: {
-        workboxPluginMode: 'InjectManifest',
-        workboxOptions: {
-          importWorkboxFrom: 'local',
-        },
-      },
+      pwa: pwa
+        ? {
+            workboxPluginMode: 'InjectManifest',
+            workboxOptions: {
+              importWorkboxFrom: 'local',
+            },
+          }
+        : {},
       ...(!process.env.TEST && os.platform() === 'darwin'
         ? {
             dll: {
@@ -67,7 +71,7 @@ export default {
   // Theme for antd
   // https://ant.design/docs/react/customize-theme-cn
   theme: {
-    'primary-color': defaultSettings.primaryColor,
+    'primary-color': primaryColor,
   },
   externals: {
     '@antv/data-set': 'DataSet',

+ 1 - 0
src/defaultSettings.js

@@ -10,4 +10,5 @@ module.exports = {
     disableLocal: false,
   },
   title: 'Ant Design Pro',
+  pwa: true,
 };

+ 52 - 47
src/global.js

@@ -1,54 +1,59 @@
 import React from 'react';
 import { notification, Button, message } from 'antd';
 import { formatMessage } from 'umi/locale';
+import defaultSettings from './defaultSettings';
 
-// Notify user if offline now
-window.addEventListener('sw.offline', () => {
-  message.warning(formatMessage({ id: 'app.pwa.offline' }));
-});
+const { pwa } = defaultSettings;
+// if pwa is true
+if (pwa) {
+  // Notify user if offline now
+  window.addEventListener('sw.offline', () => {
+    message.warning(formatMessage({ id: 'app.pwa.offline' }));
+  });
 
-// Pop up a prompt on the page asking the user if they want to use the latest version
-window.addEventListener('sw.updated', e => {
-  const reloadSW = async () => {
-    // Check if there is sw whose state is waiting in ServiceWorkerRegistration
-    // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
-    const worker = e.detail && e.detail.waiting;
-    if (!worker) {
-      return Promise.resolve();
-    }
-    // Send skip-waiting event to waiting SW with MessageChannel
-    await new Promise((resolve, reject) => {
-      const channel = new MessageChannel();
-      channel.port1.onmessage = event => {
-        if (event.data.error) {
-          reject(event.data.error);
-        } else {
-          resolve(event.data);
-        }
-      };
-      worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
+  // Pop up a prompt on the page asking the user if they want to use the latest version
+  window.addEventListener('sw.updated', e => {
+    const reloadSW = async () => {
+      // Check if there is sw whose state is waiting in ServiceWorkerRegistration
+      // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
+      const worker = e.detail && e.detail.waiting;
+      if (!worker) {
+        return Promise.resolve();
+      }
+      // Send skip-waiting event to waiting SW with MessageChannel
+      await new Promise((resolve, reject) => {
+        const channel = new MessageChannel();
+        channel.port1.onmessage = event => {
+          if (event.data.error) {
+            reject(event.data.error);
+          } else {
+            resolve(event.data);
+          }
+        };
+        worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
+      });
+      // Refresh current page to use the updated HTML and other assets after SW has skiped waiting
+      window.location.reload(true);
+      return true;
+    };
+    const key = `open${Date.now()}`;
+    const btn = (
+      <Button
+        type="primary"
+        onClick={() => {
+          notification.close(key);
+          reloadSW();
+        }}
+      >
+        {formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })}
+      </Button>
+    );
+    notification.open({
+      message: formatMessage({ id: 'app.pwa.serviceworker.updated' }),
+      description: formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }),
+      btn,
+      key,
+      onClose: async () => {},
     });
-    // Refresh current page to use the updated HTML and other assets after SW has skiped waiting
-    window.location.reload(true);
-    return true;
-  };
-  const key = `open${Date.now()}`;
-  const btn = (
-    <Button
-      type="primary"
-      onClick={() => {
-        notification.close(key);
-        reloadSW();
-      }}
-    >
-      {formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })}
-    </Button>
-  );
-  notification.open({
-    message: formatMessage({ id: 'app.pwa.serviceworker.updated' }),
-    description: formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }),
-    btn,
-    key,
-    onClose: async () => {},
   });
-});
+}