Усі записи

Копія, яка каже, що вона копія

Два інші пункти аудиту PWA. Якщо сторінка прийшла з мережі, а текст записів — із кешу воркера, картка тепер каже, що це копія, і від якого числа. А текст записів іншої збірки, ніж сторінка, вісь більше не зшиває з нею: картка пропонує відкрити сторінку знову.

Що знайшов аудит

Після оновлення, яке не забирає офлайн, у звіті аудиту PWA від 26 вересня лишалися два пункти середньої ваги, R2 і R3. Обидва про текст записів, який вісь дозавантажує окремим файлом data.json уже після першого кадру.

R2. Коли мережа не віддавала data.json, воркер мовчки брав його з кешу. Рядок «Ви офлайн: це копія, збережена …» додавався лише тоді, коли з кешу приходила вся сторінка. Сторінка ж могла прийти з мережі свіжою, а текст записів — копією попередньої збірки. Аудит показав це на evt-0198: картка казала «джерела зібрано автоматично» і називала три джерела, хоча в даних уже стояла людська перевірка й чотири джерела. Стара атрибуція перевірки видавалася за поточну. README обіцяє інше: поточний перевірений текст читач бачить завжди, коли є мережа.

R3. Якщо data.json приходив з іншої збірки, ніж сторінка, вісь питала його вдруге, оминаючи кеші. Друга розбіжність уже приймалася. Так на одному екрані опинялися дві редакції: позначки й лічильники осі від однієї збірки, перевірка й кількість джерел від іншої. «6 в 1» доручив обидва пункти одному чату, бо це два боки однієї вади.

Спершу тести

Два нові тести. У tests/browser/pwa.spec.ts сторінка приходить з мережі, а запит воркера до data.json обривається. Картка мусить показати датовану позначку копії. У tests/browser/atlas.spec.ts, без воркера, сервер двічі поспіль віддає текст записів з іншим штампом збірки. Картка мусить перейти у відновлюваний стан, а не зшити дві редакції. На старому коді впали обидва. Перший упав саме так, як описав аудит: бейдж перевірки з кешованого тексту стояв на картці, і жодного слова про копію.

Що змінилося

Воркер тепер тримає кожен *.json із часом, коли його отримано, так само як сторінки. Коли мережа відмовляє і він віддає копію, то позначає її заголовком. Вісь цей заголовок читає й пише на картці та над переліком: «Текст записів не надійшов із мережі: показано копію, збережену …» і дату. Слова «Ви офлайн» тут немає навмисно. Не прийшов один файл, а читач може бути в мережі, тож рядок говорить про текст, а не про мережу. Через це він має власні рядки в словнику, чотири ключі в uk і en разом.

Текст записів іншої збірки вісь тепер не приймає ніколи. Після другої розбіжності картка пояснює, що сторінка й текст з різних версій атласу, і пропонує «Відкрити сторінку знову». Це посилання на ту саму адресу, де стоїть читач, з періодом, записом, поданням і пошуком. Його пише той самий серіалізатор, що й решту адрес осі. Сторінку перезавантажує читач, один раз, коли сам натисне. Острів сам цього не робить, тож сервер, який уперто віддає не ту збірку, коштує читачеві одного рядка на картці, а не циклу перезавантажень. Тест натискає це посилання й перевіряє, що та сама картка заповнюється, щойно сервер віддає узгоджений текст.

Звіт пропонував і ширший варіант: називати data.json версією збірки, щоб сторінка просила саме свій файл. Я від нього відмовився. Vercel замінює розгортання цілком, тож стара сторінка на новий файл отримала б 404, а не свій текст. Відновлюваний стан однаково був би потрібен. А копія з кешу однаково мусила б казати, що вона копія. Натомість змінилися б адреса опублікованого файлу, бюджет у scripts/budgets.json, оболонка воркера й тести, які на неї спираються. Бюджетам ця зміна не шкодить: /sw.js виріс на 129 байтів і має 3 565 з 4 096, а data.json не змінився ні на байт.

Що не перевірено

Перевірено в Chromium через Playwright: обидва нові тести, повністю pwa.spec.ts і atlas.spec.ts, а також verify:code. Не перевірено справжній Android та iOS, Safari й Firefox. Не відтворено й сам сценарій аудиту, де сторінкою ще керує воркер попередньої збірки. Такий воркер копію не позначає, тож рядка про копію не буде. Але штамп у його копії інший, ніж у нової сторінки, і картка має перейти у стан «Відкрити сторінку знову», а не показати стару перевірку. Це випливає з коду, тестом не доведено.

Запис зроблено 27 вересня 2026 р.

Коміти, про які цей запис

  • 0469223