reactjs - 添加 Service Worker 创建 React App 项目

标签 reactjs service-worker create-react-app freshdesk

我正在安装一个名为 Subscribers 的通知系统,其中包含一个使用 create React app 构建的项目。他们要求开发人员下载他们的 Service Worker 并将其包含在项目的根目录中。我以前从未安装/使用过 Service Worker,这很可能是我误解的根源。

如何将 Service Worker 添加到 React 项目的根目录中?说明显示 Service Worker 应在根目录中显示为 https://yoursite.com/firebase-messaging-sw.js 。为了尝试注册该 URL,我在 src/index.js 下包含了一个 Service Worker:

import Environment from './Environment'

export default function LocalServiceWorkerRegister() {
    const swPath = `${Environment.getSelfDomain()}/firebase-messaging-sw.js`;
    if ('serviceWorker' in navigator) {
      window.addEventListener('load', function() {
        navigator.serviceWorker.register(swPath).then(function(registration) {
          // Registration was successful
          console.log('ServiceWorker registration successful with scope: ', registration.scope);
        }, function(err) {
          // registration failed :(
          console.log('ServiceWorker registration failed: ', err);
        });
      });
    }
}

在生产中,我收到 404 错误。我尝试将 firebase-messaging-sw.js 文件放置在根目录中的 src 文件夹下。每次都出现同样的错误。

以下是订阅者的说明: https://subscribers.freshdesk.com/support/solutions/articles/35000013054-diy-installation-instructions

最佳答案

public 文件夹是提供的“逃生舱口”,用于从模块系统外部添加资源。 来自 docs :

If you put a file into the public folder, it will not be processed by Webpack. Instead it will be copied into the build folder untouched. To reference assets in the public folder, you need to use a special variable called PUBLIC_URL

因此,一旦复制到 public 文件夹,您将像这样引用该文件:

import Environment from './Environment'

export default function LocalServiceWorkerRegister() {
    const swPath = `${process.env.PUBLIC_URL}/firebase-messaging-sw.js`;
    if ('serviceWorker' in navigator) {
      window.addEventListener('load', function() {
        navigator.serviceWorker.register(swPath).then(function(registration) {
          // Registration was successful
          console.log('ServiceWorker registration successful with scope: ', registration.scope);
        }, function(err) {
          // registration failed :(
          console.log('ServiceWorker registration failed: ', err);
        });
      });
    }
}

关于reactjs - 添加 Service Worker 创建 React App 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52279243/

相关文章:

javascript - React 路由器链接不断推送到历史相同的 url?

reactjs - 如何在客户端隐藏 firebaseConfig 信息

reactjs - 如何从 create-react-app 获取类声明?

javascript - React 中确认警报后 onDelete 不起作用

reactjs - 将 Electron 应用程序发布到 Windows 商店时如何修复 'The available app icons include a default icon'?

manifest - Next.js PWA (Service Worker + Manifest.json)

javascript - ServiceWorker - 离线时缓存所有失败的post请求,在线时重新提交

service-worker - 在一个域中推荐一个顶级 Service Worker 或多个 Service Worker?

reactjs - eslint 无法加载配置 "react-app"以从中扩展

javascript - 如何在客户端使用 create-react-app 设置整个应用程序的环境变量