гем serviceworker-rails не интегрируется с гем Solidus eCommerce

Я использую гем serviceworker-rails, чтобы сделать свое приложение электронной коммерции прогрессивным веб-приложением. Вот фрагмент файла gem из проекта;

# progressive web application gem
gem 'serviceworker-rails'
# eCommerce gems
gem 'solidus'
gem 'solidus_auth_devise'
#base gems
gem 'rails', '~> 5.2.0'
ruby '2.5.1'

гем serviceworker-rails, в свою очередь, генерирует файлы манифеста, необходимые для превращения приложения в прогрессивное веб-приложение;

приложение/активы/javascripts/serviceworker.js.erb

var CACHE_VERSION = 'v1';
var CACHE_NAME = CACHE_VERSION + ':sw-cache-';

function onInstall(event) {
  console.log('[Serviceworker]', "Installing!", event);
  event.waitUntil(
    caches.open(CACHE_NAME).then(function prefill(cache) {
      return cache.addAll([

        // make sure serviceworker.js is not required by application.js
        // if you want to reference application.js from here
        '<%#= asset_path "application.js" %>',

        '<%= asset_path "application.css" %>',

        '/offline.html',

      ]);
    })
  );
}

function onActivate(event) {
  console.log('[Serviceworker]', "Activating!", event);
  event.waitUntil(
    caches.keys().then(function(cacheNames) {
      return Promise.all(
        cacheNames.filter(function(cacheName) {
          // Return true if you want to remove this cache,
          // but remember that caches are shared across
          // the whole origin
          return cacheName.indexOf(CACHE_VERSION) !== 0;
        }).map(function(cacheName) {
          return caches.delete(cacheName);
        })
      );
    })
  );
}

// Borrowed from https://github.com/TalAter/UpUp
function onFetch(event) {
  event.respondWith(
    // try to return untouched request from network first
    fetch(event.request).catch(function() {
      // if it fails, try to return request from the cache
      return caches.match(event.request).then(function(response) {
        if (response) {
          return response;
        }
        // if not found in cache, return default offline content for navigate requests
        if (event.request.mode === 'navigate' ||
          (event.request.method === 'GET' && event.request.headers.get('accept').includes('text/html'))) {
          console.log('[Serviceworker]', "Fetching offline content", event);
          return caches.match('/offline.html');
        }
      })
    })
  );
}

self.addEventListener('install', onInstall);
self.addEventListener('activate', onActivate);
self.addEventListener('fetch', onFetch);

приложение/активы/javascripts/serviceworker-companion.js

if (navigator.serviceWorker) {
  navigator.serviceWorker.register('/serviceworker.js', { scope: './' })
    .then(function(reg) {
      console.log('[Companion]', 'Service worker registered!');
    });
}

Приложение не выдает никаких ошибок; просто я случайно заметил, что сервисный работник не регистрируется. Вот манифест в использовании;

приложение/активы/javascripts/manifest.json.erb

{
  "name": "My Progressive Rails App",
  "short_name": "Progressive",
  "start_url": "/"
}

...и наконец;

приложение/представления/макеты/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>Istore</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

<link rel="manifest" href="/manifest.json" />
<meta name="apple-mobile-web-app-capable" content="yes">
</head>

  <body>
    <%= yield %>
  </body>
</html>

По честному; Я использовал эту настройку раньше, и она работала хорошо. Что-то ломается, когда я использую его с solidus_gem. Уже; мои усилия по отладке проблемы привели меня только к набору вероятностей. Сильнейшее существо; отсутствие корневой директивы.

(гем также не работает для стартовой страницы рельсов по умолчанию)

Но при настройке пользовательской корневой страницы; жемчужина работает. Итак, я сделал несколько исправлений обезьяны и добавил корневую страницу солидуса в свой проект, а затем добавил маршруты приложений, чтобы включить домашнюю страницу солидуса.

config/routes.rb

Rails.application.routes.draw do
  root to: 'spree/home#index'

  mount Spree::Core::Engine, at: '/'    

end

Это оказалось неудачным. Я использую маяк для аудита приложения, и ошибка означает, что сервисворкер не регистрируется.

Что мне не хватает? Что-то выходит за рамки?


person kevin Mucheru    schedule 17.09.2018    source источник
comment
Используется ли макет вашего приложения с этой настройкой? Из этого я не могу сказать, используется ли макет вашего приложения или, возможно, движок драгоценного камня предоставляет свой собственный. Если это последнее, то ваше приложение js не загрузится и впоследствии не зарегистрирует вашего сервисного работника.   -  person rossta    schedule 20.09.2018
comment
Драгоценный камень солида поставляется с раскладками по умолчанию. Я думаю, здесь кроется проблема. Добавление файлов драгоценных камней в проект и их изменение, похоже, тоже не работает. Уже; драгоценный камень, кажется, переопределяет все, что мешает активам драгоценного камня. Эту проблему может решить добавление пользовательской корневой страницы, для которой требуется макет приложения.   -  person kevin Mucheru    schedule 21.09.2018


Ответы (1)


Наконец-то я заработал :). Драгоценным камнем, обеспечивающим макет приложения, является солидус, но проблема в том, что манифест находится в локальном приложении, внутри которого солидус является драгоценным камнем.

Чтобы сделать его видимым для драгоценного камня; Я удалил теги с

app/views/layouts/application.html.erb

а затем поместите их в файл макета драгоценных камней. Вы должны загрузить его локально, чтобы внести изменения. Файл макета на момент написания этого находится по адресу

app/views/spree/layouts/

но раздел head содержит рендер партиала _head в

app/views/spree/shared/_head.html.erb

откуда более эффективно разместить эти теги внутри, чтобы решить проблему.

<%= javascript_include_tag "application" %>
<link rel="manifest" href="/manifest.json" />
<meta name="apple-mobile-web-app-capable" content="yes">
person kevin Mucheru    schedule 23.09.2018