如何在Rails应用程序上注册serviceWorker

How to register a serviceWorker on a Rails app?

本文关键字:程序上 注册 serviceWorker 应用程序 应用 Rails      更新时间:2023-09-26

我用serviceWorkers来缓存我的网站(一个rails应用程序)的一些页面,所以我想注册我的serviceworker.js,如下所示:

// Playing with serviceworker.js
if (navigator.serviceWorker) {
  navigator.serviceWorker.register('/serviceworker.js', {
    scope: '/'
  });
}

但我意识到在生产服务器上(使用https://)/serviceworker.js路径将不可用。

所以我在想,我应该如何注册serviceworker.js,它将被指纹识别并通过资产管道吐出?

假设视图上有erb可用

您可以将该代码放在js.erb文件中,然后使用类似的:

// Playing with serviceworker.js
if (navigator.serviceWorker) {
  navigator.serviceWorker.register('<%=asset_path('serviceworker.js')%>', {
    scope: '/'
  });
}

我现在也遇到了这个问题。根据我的研究,我认为Rails应用程序处理服务工作者的正确方法是正常使用Asset管道为服务工作者javascript文件提供服务,使用scope选项确定服务工作者的范围,然后使用Service Worker Allowed HTTP标头显式允许新的作用域(如果没有此HTTP标头,Service Worker将被限制为仅拦截标准Rails应用程序中/assets/下的页面的HTTP请求)。

不幸的是,目前实施这种方法有几个障碍:

  1. Rails4(显然)不允许将HTTP头添加到它所服务的资产中,除了缓存控制头。为了解决这个问题,你可以添加一个机架插件,如S.O.的回答中所述,或者在生产中,如果你使用的是资产服务器,如Nginx,你可以通过让Nginx添加HTTP头来解决这个问题。尽管这在开发过程中没有帮助
  2. Rails5确实允许将HTTP头添加到Assets中,正如本文中详细介绍的那样
  3. 浏览器对service Worker和service Worker Allowed HTTP标头的支持目前很差