我正在尝试在我的 Ruby on Rails 应用程序中使用服务 worker 。
我需要在我的 app/javascripts/service-worker.js.erb
文件中使用一些 erb 功能。 Service Worker 注册脚本如下所示:
var registerServiceWorker = function() {
navigator.serviceWorker.register(
'<%= asset_path('service-worker.js') %>',
{ scope: '/assets/' }
)
.then(function() {
console.info('Service worker successfully registered');
})
.catch(function(error) {
console.warn('Cannot register sercie worker. Error = ', error);
});
}
这行不通;我从来没有在这里得到 promise :
navigator.serviceWorker.ready.then
我也尝试了 ./
和 /
作用域,但我得到了这个错误:
DOMException: Failed to register a ServiceWorker: The path of the provided scope ('/') is not under the max scope allowed ('/assets/'). Adjust the scope, move the Service Worker script, or use the Service-Worker-Allowed HTTP header to allow the scope.
如果我将我的 service-worker.js
移动到 public
文件夹,删除 .erb
扩展名并将范围更改为 ./
,一切正常,但我那里没有模板引擎。
有什么建议吗?
最佳答案
现在有一个 gem ,serviceworker-rails
这将允许您在 Assets 管道中代理对 serviceworker 脚本的请求。由于浏览器注册 serviceworker 脚本的方式,最好避免缓存它们。
Sprockets 会对 Assets 进行指纹识别,而 Rails(或您的网络服务器)通常会提供来自 /assets
目录的具有积极缓存 header 的编译文件。
我们想要的是自定义服务 worker 路径和响应 header 的能力并且仍然进行 Sprockets 预处理,即 CoffeeScript/ES2015 到 JavaScript 的转换。
serviceworker-rails
gem 将中间件插入您的 Rails 堆栈,它将代理对 /serviceworker.js
的请求(例如)到相应的指纹编译 Assets 生产。在开发中,您会得到预期的自动重新加载行为。您也可以在不同的范围内设置多个 serviceworker。
关于javascript - Ruby on Rails 和服务 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30007592/