Тяжёлое добавление PWA на сайт
В последние дни полностью сосредоточился на добавлении поддержки PWA на свой сайт. Дело шло ну очень тяжело! Проблемы вылезали откуда только можно. Впрочем, в этом весь я: не могу взять и просто сделать по инструкции/образцу, обязательно нужно сначала перепробовать кучу неправильных вариантов. (Эх, знать бы ещё, почему так! Хотя на самом деле знаю — чтобы лучше вникнуть, что и как работает, как всё устроено на самом деле.)
Так было и в этот раз. Сначала сделал неправильный scope, спустив файл с service worker в подкаталог, так как хотел предусмотреть возможность для каждого стиля оформления IntB делать свой. Потом разобрался, в чём дело, заодно и придумал, как сделать кеширование так, чтобы оно не зависело от стиля. Дальше нашёл в чьих-то gists образец кода для обработчика события fetch. Сначала вроде работало. Потом стал переделывать под те стратегии кеширования, которые я задумал, и посыпались какие-то непонятные ошибки. Полтора дня бился, потом сдался, запустил DeepSeek и поставил ему задачу написать четыре функции, каждая из которых реализовала бы нужную стратегию. Он справился на отлично, дальше оставалось только прописать правила, какую стратегию в каких случаях применять, и код для выбора. (Заодно, изучая его код, понял, что делал не так с предыдущим кодом.) Но тут уже особых сложностей не было, хотя на составление всех правил ушло немало времени.
Вчера наконец-то выложил сделанное, но тут вылезла новая неприятность: при редиректах стало выдаваться, что страница недоступна в оффлайне. Оказалось, что нужно ещё проверять networkResponse.type на редирект (в отличие от XMLHttpRequest, который все редиректы скрывает, что доставило немало неудобств, когда я писал FormStorage). Но с этим разобрался быстро, и думал, что всё, с PWA закончено.
Но сегодня утром понял, что кое-что нужно переделать (например, убрать кеширование ответа сторонних серверов и немного переделать логику выдачи fallback-страниц). Начал было писать, и тут вообще посыпались какие-то совершенно необъяснимые ошибки, вплоть до того, что не загружался ни manifest-файл, ни даже главная страница. А причина оказалась предельно простая: я добавил промежуточную функцию, которая вызывала две разных стратегии кеширования для URL на своём сайте и сторонних доменах. Но забыл прописать return, чтобы эта функция возвращала результаты их вызова! (Хех, видимо, переусердствовал с изучением Rust, там так можно делать.) И бился с этим больше часа, да ещё и начал сильно злиться.
В общем, только сейчас могу сказать «ну всё, вроде работает!» и вздохнуть спокойно. Завтра, видимо, устрою себе день отдыха и информационной разгрузки. Зато теперь могу быть довольным тем, что хотя бы на своём сайте сделал шаг в идеологически правильную сторону — оффлайновой доступности, ибо к Интернету нужно относиться как к чему-то, что может пропасть в любой момент.