如何在Rails应用程序上注册serviceWorker
How to register a serviceWorker on a Rails app?
我用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请求)。
不幸的是,目前实施这种方法有几个障碍:
- Rails4(显然)不允许将HTTP头添加到它所服务的资产中,除了缓存控制头。为了解决这个问题,你可以添加一个机架插件,如S.O.的回答中所述,或者在生产中,如果你使用的是资产服务器,如Nginx,你可以通过让Nginx添加HTTP头来解决这个问题。尽管这在开发过程中没有帮助
- Rails5确实允许将HTTP头添加到Assets中,正如本文中详细介绍的那样
- 浏览器对service Worker和service Worker Allowed HTTP标头的支持目前很差
相关文章:
- 使用javascript将视频从我的android应用程序上传到youtube
- 如何保护节点webkit应用程序上的字体
- 如何减少在移动网络应用程序上播放声音的延迟
- 如何在ExtJs4应用程序上为视图、存储和模型设置自定义文件夹名称
- Meteor应用程序上的警报/通知不会出现
- 如何获取模式引导程序上的值复选框
- 在Ionic应用程序上使用$.getScript加载谷歌地图Api
- 离子和角度:带标签的应用程序上的路线
- 无法在Chrome(打包)应用程序上检测到ESC按钮(全屏显示时)
- 一个Web应用程序上有两个Java脚本
- 从datetimepicker引导程序上点击的日期获取点击事件
- 角度UI路由器无法在chrome应用程序上运行
- 是否可以将 ASP.NET Web 应用程序上载到 VMware 上的虚拟 2008 服务器上
- 在单页应用程序上进行客户端路由的正确方法是什么
- 在 Birt 处理程序上使用 Javascript reportContext.setPersistentGlobalV
- 在移动应用程序上滚动iframe会在某个时刻跳到页面顶部
- window.open()在使用phone gap的iOS应用程序上不起作用
- 触发器 JavaScript 事件处理程序已在插件上注册
- 如何在Rails应用程序上注册serviceWorker
- 请参阅在任何元素上注册的任何事件处理程序的代码