Должен ли я кэшировать файл ServiceWorker в PWA?

Я все еще пытаюсь избежать проблем с кэшированием в прогрессивных веб-приложениях. Решающим для любого кэширования PWA является возможность обновлять файл ServiceWorker (назовем его sw.js). Но подробности меня немного смущают:

  • Можно выполнять navigator.serviceWorker.register('sw.js') при каждой загрузке страницы, потому что register() обновляет кеш приложения или ничего не делает, если все обновлено — верно?

  • Имеет ли смысл делать что-то вроде navigator.serviceWorker.register('sw.js?' + Date.now()), чтобы избежать кэширования HTTP? Или я в безопасности, если сервер использует ETags?

  • Проверяет ли браузер наличие в сети обновленного файла sw.js при каждой загрузке страницы? Иногда я не вижу его на вкладке сетевого инспектора.

  • Если sw.js находится в кеше приложения, извлекает ли браузер его оттуда, не проверяя сервер на наличие обновлений?

  • Иногда я вижу демонстрационные скрипты ServiceWorker, которые кэшируют себя так:

    self.addEventListener('install', ev => {
        const myCaches = {
            app: {...}, 
            sw: {
                files: [
                    '/sw.js'
                ],
                version: '1'
            }
        }
        for (let name in myCaches) {
            const cacheName = name + '-' + myCaches[name].version
            ev.waitUntil(
                caches.has(cacheName).then(uptodate => {
                    if (uptodate) return true
                    caches
                        .open(cacheName)
                        .then(cache => {
                            cache.addAll(myCaches[name].files)
                        })
                })
            )
            // clear old caches
        }
    })
    

Имеет ли это смысл, это хорошая практика? Делает ли это обновление кеша более надежным?

Я не уверен насчет ETag, но похоже, что браузеры будут двигаться в направлении игнорирования кэширования HTTP для сервис-воркеров Developers.google.com/web/updates/2018/06/fresher-sw

ashawley 08.03.2019 10:44

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

wortwart 09.03.2019 22:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
8
2
1 944
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Браузер установит сервис-воркер для вашего PWA, когда вы его зарегистрируете. Браузер использует отдельное средство для кэширования и управления сервисными работниками. Кэширование не входит в ваши обязанности.

Добавление временной метки к имени файла вашего сервис-воркера является антишаблоном. Согласно статье о жизненном цикле Service Worker, вы должны использовать избегайте изменения URL-адреса вашего скрипта сервисного работника.

Что вызывает большую озабоченность, так это то, что вы подняли вопрос об обновлении работника службы, как браузер узнает, когда это делать?

Ну, согласно разделу Обновление сервис-воркера из статьи Service Worker Lifecycle:

Most browsers, including Chrome 68 and later, default to ignoring caching headers when checking for updates of the registered service worker script. They still respect caching headers when fetching resources loaded inside a service worker via importScripts(). You can override this default behavior by setting the updateViaCache option when registering your service worker.

Your service worker is considered updated if it's byte-different to the one the browser already has. (We're extending this to include imported scripts/modules too.) The updated service worker is launched alongside the existing one, and gets its own install event.

If your new worker has a non-ok status code (for example, 404), fails to parse, throws an error during execution, or rejects during install, the new worker is thrown away, but the current one remains active.

Если вы тестировали PWA в автономном режиме, вы заметите, что браузер выдает ошибку в консоли, когда пытается получить ваш файл sw.js. Это не о чем беспокоиться. Как сказано в последнем пункте выше, «текущий остается активным».

Интересно, зациклены ли люди на этой записи 404 в консоли для JavaScript сервис-воркера, когда они тестируют в автономном режиме и добавляют файл сервис-воркера в кеш в приступе бритья яка? Вероятно, это оказывает медвежью услугу вашему сайту и его пользователям, тратя время и диск на кеширование ненужного файла в браузере.

Избегание 404 действительно может быть единственной (неубедительной) причиной для кэширования приложения sw.js. Не уверен насчет кэширования HTTP, поскольку не нашел документации о поведении других браузеров. Динамическое добавление параметра HTTP не должно вызывать тех же проблем, что и изменение имени файла.

wortwart 11.03.2019 10:45

Да, правила кэширования для сервис-воркера нечетко определены. На самом деле они постоянно меняются, и неудивительно, что они различаются в разных браузерах. Это новая технология, поэтому она все еще дорабатывается.

ashawley 12.03.2019 13:13

Я полагаю, что эти вещи развиваются со временем.

Я только что проверил свое экспериментальное приложение. Независимо от того, включаю ли я сервис-воркер в URL-адреса для кэширования, pwa всегда извлекает сервис-воркера всякий раз, когда он обновляется.

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

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

Community 25.09.2021 22:43

Другие вопросы по теме