Кэш шаблонов Angular с проблемой сервис-воркера

У меня есть настройка gulp, которая помещает весь мой html в кеш шаблонов для более быстрого доступа в angular. Я пытаюсь добавить в свой проект сервис-воркера, используя sw-preache, чтобы его можно было использовать в автономном режиме. Если я подключен к сети, все работает нормально. Когда я перехожу в автономный режим, запросы на ресурсы html (которые находятся в кеше шаблонов) терпят неудачу, потому что кажется, что он запрашивает путь из сети.

Есть ли что-то, что мне нужно добавить в мою конфигурацию sw-preache, чтобы он откладывал до angular для обработки извлечения файлов html?


person JakeHova    schedule 25.06.2017    source источник
comment
0 голос против принять То, что я закончил, - это избавился от кеша шаблонов angular и вместо этого просто использовал сервис-воркер для обработки кеширования всей разметки. Отзывчивость сайта почти такая же, и теперь он работает в автономном режиме.   -  person JakeHova    schedule 28.06.2017


Ответы (2)


мое исходное решение не было 100%

Чтобы решить эту проблему, используйте sw-precache и sw-toolbox.

Используя конфигурацию gulp, вы можете настроить sw-preache для кэширования вашего контента и расширить его с помощью sw-toolbox, чтобы использовать кешированные ответы на основе конфигурации маршрутизации.

см. https://developers.google.com/web/ilt/pwa/using-sw-precache-and-sw-toolbox.

person Paul Backhouse    schedule 12.07.2017
comment
Этот toolbox.router - это то, что я искал. Ваш исходный ответ сработал, но сначала мне нужно было, чтобы он работал в автономном режиме, и у меня было слишком много компонентов, чтобы вернуться и изменить сами пути кода. Решение sw.toolbox позволяет мне просто явно указать, что любые запросы html / jpg в каталоге приложения должны сначала идти в кеш. Судя по моим предварительным тестам (не тестировали весь сайт), похоже, что это работает правильно. - person JakeHova; 12.07.2017
comment
да, это здорово, теперь я реорганизовал и удалил свое исходное решение, когда у вас настроен sw-toolbox, он вам больше не нужен, вы можете просто иметь templateUrls, и любые запросы, которые вы указываете в своих sw-маршрутах, обрабатываются кешем - person Paul Backhouse; 13.07.2017

хорошо, вот как я решил это. Я использую Angular JS 1.6.4 с sw-preache.

У меня есть CacheStorage через сервис-воркеров, поэтому, используя сервис-воркеров, я знаю, что ожидаю, что устройства будут поддерживать определенные функции, в моем случае мы знаем, что у наших пользователей будут планшеты Android с Chrome, и поддержка действительна.

Я разрабатываю прогрессивное веб-приложение с автономной функциональностью.

Итак, теория ... У меня есть директивы с templateUrls.

Используя этот пост: https://thinkster.io/templatecache-tutorial

У меня в основном есть код директивы:

angular.module('app').directive('location',
['$timeout', 'notify.service', 'user.settings.service', 'log.service',
    function ($timeout, notify, userSettings, log) {
        return {
            restrict: 'EA',
            ... controller etc.., 
            templateUrl: '/App/core/directives/location.html'
        }
    }
]);

Теперь, когда это приложение отключается, кешированные экземпляры контента его не пинают - раздражает.

Итак, после долгого откладывания я спустился и испачкался.

Мое решение - оставить templateUrl как есть, но перезаписать содержимое через службу $ templateCache.

Для этого вы добавляете функцию RUN к своей директиве (для ясности). Мы знаем, что представление кэша сервис-воркера наших URL-файлов содержит общий путь, в моем случае: '/App/core/directives/location.html'.

Итак, используя новую технологию в браузере, window.caches дает мне доступ к CacheStorage, который используют рабочие службы, после чего я могу использовать доступный API: https://developer.mozilla.org/en-US/docs/Web/API/Cache

Затем я могу использовать метод сопоставления, чтобы найти соответствующее содержимое кеша сервис-воркера, прочитать этот двоичный поток и преобразовать в HTML, а затем сказать $ templateCache, чтобы он заменил его кешированным значением сервис-воркера.

Итак, для полноты (и вы можете создать общую службу, которая заменяет кешированные значения на основе templateUrl - что я буду делать для каждой директивы)

(function () {

    'use strict';

    var templateUrl = '/App/core/directives/location.html';

    // <location on-location='someFunc'></location>
    // provides a form/control to find a location either by GEO location or manual city search
    angular.module('app')
            .run(['$templateCache', function ($templateCache) {
                var cache = window.caches;

                cache.match(templateUrl, { ignoreSearch: true }).then(function (response) {

                    if (response) {
                        response.body.getReader().read().then(function (cachedResponse) {
                            // convert the Uint8Array value to HTML string
                            var content = new TextDecoder('utf-8').decode(cachedResponse.value);
                            $templateCache.put(templateUrl, content);
                            //console.log($templateCache.get(templateUrl)); // debug
                        });
                    }
                });


            }])
    .directive('location',
    ['$timeout', 'notify.service', 'user.settings.service', 'log.service',
        function ($timeout, notify, userSettings, log) {
            return {
                restrict: 'EA',
                ... controller, scope etc...
                templateUrl: templateUrl
            }
        }
    ]);  
})();

Отступы ... процесс RUN является синхронным, поэтому сначала они должны сначала попасть на сайт онлайн ... но именно так должен работать сервис-воркер, так что это обрабатывается в обучении :)

Я ожидаю, что будет лучший вариант, но на данный момент это решение, которое у меня есть, я буду создавать службу шаблонов для замены значений $ templateCache на основе var templateUrl, которые будут иметь каждая директива, поэтому код станет более чистым в каждом директиве. .... я подумывал о наличии глобального набора шаблонов и файлов, но, немного неясно, думаю, что его чище для каждой директивы

person Paul Backhouse    schedule 05.07.2017