javascript - Ruby on Rails 和服务 worker

标签 javascript ruby-on-rails html service-worker

我正在尝试在我的 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。

https://github.com/rossta/serviceworker-rails

关于javascript - Ruby on Rails 和服务 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30007592/

相关文章:

jquery - 如何将图像隐藏到图像的中心点

javascript - Bootstrap - "Uncaught TypeError: undefined is not a function"

javascript - 更改警报框上的 'ok' 按钮以停止进一步移动

html - 将复选框放在添加的选项旁边

ruby-on-rails - 具有多态模型的嵌套形式

ruby-on-rails - Rails、OpenID 和 Authlogic

html - 删除行内填充而不删除换行符

javascript - 使用 Ajax 调用将数组传递到 Javascript 代码中

javascript - 如何在 Next.js React Framework 中构建自定义/动态路由

javascript - 使用 Jquery 迭代嵌套 JSON 并返回匹配的索引?