Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Создание PWA веб приложений

Лекция



Привет, Вы узнаете о том , что такое pwa-приложения, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое pwa-приложения , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).

Что такое Progressive Web Apps (PWA)

Progressive Web Apps (PWA) — это веб‑приложения, которые используют стандартные веб‑технологии (HTML, CSS, JavaScript), но при этом ведут себя как нативные приложения на устройствах. Они объединяют лучшие стороны сайтов и мобильных приложений.

Основные характеристики

  • Установка на устройство Пользователь может «установить» сайт как приложение: оно получает собственную иконку на рабочем столе или в меню приложений.

  • Работа офлайн С помощью Service Workers PWA могут кэшировать данные и работать даже без подключения к интернету.

  • Нативный интерфейс Запускаются в отдельном окне без браузерных элементов, создавая ощущение полноценного приложения.

  • Кроссплатформенность Один код работает на разных устройствах и ОС (Windows, Android, iOS, macOS).

  • Автоматические обновления Обновляются так же, как сайты — без необходимости скачивать новые версии из магазина.

Преимущества

  • Для бизнеса: дешевле, чем разработка отдельных приложений для iOS и Android.

  • Для пользователей: удобный доступ, меньше места на устройстве, возможность работы офлайн.

  • Для разработчиков: единый код, простота поддержки и масштабирования.

Ключевые элементы PWA

Элемент Назначение
manifest.webmanifest JSON‑файл с настройками (название, иконки, цвет темы, стартовый URL).
Service Worker Скрипт для кэширования, офлайн‑режима и push‑уведомлений.
HTTPS Обязательное условие для безопасности и работы Service Workers.
Responsive Design Адаптация интерфейса под разные устройства.

Сравнение PWA и режима киоск

Критерий Progressive Web App (PWA) Режим киоск
Назначение Сделать сайт похожим на нативное приложение, доступным для установки на устройство Ограничить устройство до работы только с одним приложением/сайтом
Файл манифеста manifest.webmanifest описывает название, иконки, цвета, стартовый URL Обычно не используется; настройка идет через ОС или сторонние приложения
Установка Устанавливается пользователем добровольно (иконка на рабочем столе, меню приложений) Администратор включает режим, и устройство запускает только выбранное приложение
Гибкость Можно запускать как обычный сайт или как приложение Жесткое ограничение: пользователь не может выйти за пределы выбранного приложения
Офлайн‑режим Поддерживается через Service Worker Зависит от приложения, но сам режим киоск не добавляет офлайн‑функций
Безопасность Требует HTTPS, можно добавить push‑уведомления и кэширование Основная цель — физическая и логическая защита: исключить доступ к другим функциям устройства
Применение Удобно для сайтов, которые хотят быть «как приложение» (магазины, сервисы, новостные порталы) Используется в публичных терминалах, интерактивных стойках, точках самообслуживания

Ключевая разница

  • PWA — это про удобство и универсальность: сайт превращается в приложение.

  • Киоск‑режим — это про контроль и ограничение: устройство работает только в одном приложении, чтобы исключить лишние действия пользователя.

Файл manifest.webmanifest используется в Progressive Web Apps (PWA).

Что это значит

  • Это Web App Manifest — JSON‑файл, который описывает параметры веб‑приложения.

  • Он сообщает браузеру, как сайт должен вести себя при установке на устройство: название, иконки, цвет темы, ориентация экрана и т.д.

  • Наличие такого файла — обязательное условие для того, чтобы сайт можно было установить как приложение на смартфон или компьютер.

Ключевые моменты

  • Тип приложений: Progressive Web Apps (PWA).

  • Формат: JSON с MIME‑типом application/manifest+json.

  • Назначение: превращает сайт в «почти нативное» приложение — с иконкой, полноэкранным режимом, возможностью работать офлайн.

Почему браузер автоматически создал «приложение» из веб-страницы

Современные браузеры (особенно Chrome, Edge и др.) могут предлагать установить сайт как PWA — Progressive Web App.
Если сайт соответствует определенным условиям, браузер автоматически показывает кнопку «Установить приложение» или даже устанавливает его сам (в некоторых системах).

💡 Условия, по которым браузер решает, что сайт — это приложение:

  1. Наличие manifest.json — специального файла с описанием приложения:

    { "name": "My App", "start_url": "/", "display": "standalone", "icons": [...] } 
  2. Поддержка HTTPS — сайт должен работать по защищенному протоколу.

  3. Service Worker — скрипт, который управляет кэшем и сетевыми запросами (например, для офлайн-режима).

  4. Сайт ведет себя как приложение (например, без видимой адресной строки, с иконкой и собственной оболочкой).

В результате браузер создает из страницы изолированное приложение (WebApp), запускаемое отдельно от вкладок.

Как проверить, что AJAX-запросы идут из приложения, а не из обычной вкладки браузера

Есть несколько способов различить эти случаи — от простых до продвинутых.

1. Проверить заголовки запроса (User-Agent, Referer)

  • PWA (установленное приложение) обычно не имеет Referer (или имеет его как null).

  • У обычной вкладки будет Referer с URL страницы.

На сервере (PHP-пример):

if (empty($_SERVER['HTTP_REFERER'])) { echo "Probably PWA or standalone app"; } else { echo "Browser tab: " . $_SERVER['HTTP_REFERER']; } 

2. Проверить контекст на стороне клиента

На JS можно определить, открыт ли сайт как PWA:

if (window.matchMedia('(display-mode: standalone)').matches) { console.log('Running as installed PWA'); } else { console.log('Running in browser tab'); } 

Можно передавать это в AJAX-запрос:

fetch('/api/check', { method: 'POST', headers: { 'X-From-PWA': window.matchMedia('(display-mode: standalone)').matches ? 'yes' : 'no' } }); 

3. Использовать разные origin или scope в manifest.json

PWA может иметь отдельный scope, например /app/, тогда все AJAX-запросы из него будут иметь соответствующий Origin и Referer.

4. Проверить наличие Service Worker

Если запросы обрабатываются через Service Worker, можно смотреть:

  • В DevTools → Application → Service Workers

  • В консоли или сети: если запрос идет «from ServiceWorker», значит это PWA.

Кратко:

Признак Обычная вкладка Установленное PWA
Referer Есть Часто null
display-mode browser standalone
Service Worker Может отсутствовать Почти всегда есть
Отображение Вкладка с адресной строкой Отдельное окно
User-Agent Обычный браузер Тот же, но без Referer

Если у пользователя установлено такое приложения то все скрипты кешируются у него и не обновляются при изменении скриптов на сайте?

Одна из ключевых особенностей PWA (Progressive Web App) — кэширование.

Действительно, если пользователь установил сайт как приложение, то браузер может использовать старую версию скриптов даже после обновлений сайта.
Разберем подробно, почему это происходит и как это контролировать.

Почему скрипты не обновляются автоматически

Когда сайт становится PWA, в нем появляется Service Worker — это фоновый скрипт, который:

  • перехватывает все сетевые запросы,

  • может кэшировать HTML, JS, CSS, изображения и API-ответы,

  • возвращает кэшированные данные вместо загрузки с сервера.

Поэтому, если твой сайт обновился, но у пользователя уже установлен Service Worker с кэшированными версиями —
он будет видеть старые файлы (например, старый main.js), пока Service Worker не обновится.

Как именно происходит обновление

Service Worker обновляется не мгновенно, а по определенным правилам:

  1. Браузер проверяет, изменился ли service-worker.js (по контенту или ETag).

  2. Если файл другой — создается «новая версия» Service Worker.

  3. Новая версия устанавливается, но не активируется, пока пользователь не:

    • закроет все вкладки/окна приложения,

    • или не перезапустит PWA.

  4. Только потом кэш обновляется.

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

Как правильно заставить PWA обновлять скрипты

Вот как это делают на практике:

1. Версионирование файлов

Добавляй номер версии в имена файлов:


 

или добавляй query-параметр:


 

Браузер считает это новым URL, поэтому кэш не используется.

2. Контроль кэша через Service Worker

В service-worker.js можно задать стратегию:

self.addEventListener('fetch', event => { event.respondWith( caches.open('my-cache-v3').then(cache => { return fetch(event.request).then(response => { cache.put(event.request, response.clone()); return response; }).catch(() => cache.match(event.request)); }) ); }); 

Обрати внимание на my-cache-v3 — когда ты изменяешь версию (v3 → v4), старый кэш будет сброшен.

3. Принудительное обновление Service Worker

В service-worker.js нужно добавить:

self.skipWaiting(); self.clients.claim(); 

Это заставит новый SW активироваться сразу, не дожидаясь закрытия старого.

Но будь осторожен — если в момент обновления пользователь что-то делает,
может произойти конфликт старых и новых кэшей (например, ошибки JS).

4. Проверка актуальности на клиенте

Можно сделать автоматическую проверку:

navigator.serviceWorker.getRegistration().then(reg => { if (reg) { reg.update(); // принудительная проверка новой версии } }); 

Коротко:

Поведение Причина Решение
Скрипты не обновляются Кэш Service Worker Версионирование или update()
Сайт загружается офлайн PWA кэширует все ресурсы Настроить кэш стратегию
Пользователь видит старую версию SW не активировался skipWaiting(), clients.claim()

Если приложение не использует Service Worker, то поведение с кэшированием работает по-другому —
и действительно может сбивать с толку, особенно у PWA, созданных «автоматически» браузером.

Разберем подробно:

Что происходит, если Service Worker отсутствует

Когда ты устанавливаешь сайт как приложение (PWA или просто «ярлык» через Chrome → "Добавить на рабочий стол"),
браузер делает следующее:

  1. Создает отдельный контейнер (WebApp) с минимальной оболочкой.

  2. Открывает сайт в режиме display-mode: standalone — без адресной строки.

  3. Продолжает использовать обычное кэширование браузера — то есть:

    • HTTP кэш (Cache-Control, ETag, Last-Modified);

    • кэширование DNS и ресурсов (JS, CSS, изображений);

    • локальные данные (localStorage, IndexedDB, cookies).

То есть в этом случае обновления зависят не от Service Worker, а от стандартных правил HTTP-кэширования.

Почему все равно может казаться, что скрипты «не обновляются»

Есть несколько причин:

1. Об этом говорит сайт https://intellect.icu . HTTP-заголовки разрешают кэш

Проверь, что сервер не отправляет слишком «долгий» кэш.
Например, это плохой пример:

Cache-Control: public, max-age=31536000 

Это заставляет браузер хранить JS-файлы целый год.

Лучше:

Cache-Control: no-cache 

или:

Cache-Control: max-age=0, must-revalidate 

2. Файл тот же URL — браузер не перезапрашивает

Браузер может подумать, что main.js не изменился,
и брать его из локального кэша (особенно в standalone-режиме).

Решение — добавить версионирование:


 

3. PWA (или standalone) хранит кэш дольше, чем вкладка

Chrome и Edge часто агрессивнее кэшируют ресурсы в режиме приложения,
чтобы запуск был моментальным.
В этом случае обновления подтягиваются только после принудительной проверки (Ctrl+F5)
или при изменении заголовков.

4. Offline Cache / AppData (Windows)

Если пользователь установил приложение через Chrome,
файлы могут сохраняться в системной папке вроде:

%LOCALAPPDATA%\Google\Chrome\User Data\Default\Web Applications\ 

Иногда Chrome берет оттуда статичные ресурсы (старые версии JS).
Удаление приложения или его данных решает проблему.

Как проверить, откуда грузятся скрипты

  1. Открой DevTools → Network.

  2. Обнови страницу внутри приложения (Ctrl+R).

  3. Посмотри на колонку Size или Status:

    • from disk cache / from memory cache → старый кэш.

    • 200 OK → файл реально загружен с сервера.

Также можно очистить кэш конкретного домена:

chrome://settings/clearBrowserData 

или для конкретного сайта:

chrome://inspect/#apps 

Вывод оп кешированию

Ситуация Что кэширует Как обновить
Без Service Worker Обычный HTTP-кэш браузера Изменить заголовки или URL
С Service Worker Программный кэш в JS Обновить SW и версию кэша
Установленное PWA Может хранить дольше Очистка кэша или версия в URL

Если у пользователя установлено приложениемно на сайте удали тег с manifest.json, то приложэение продолжит запускаться?

Это важный нюанс поведения установленных PWA (Progressive Web Apps).

Короткий ответ

Да, приложение продолжит запускаться,
даже если ты удалишь тег с сайта.

Но:
Браузер больше не сможет обновлять информацию о приложении (иконку, имя, цвет темы, поведение и т.д.).

Подробное объяснение

Когда пользователь устанавливает PWA (или «добавляет сайт на рабочий стол»), браузер:

  1. Загружает manifest.json;

  2. Сохраняет его содержимое в своем внутреннем хранилище (в профиле пользователя);

  3. Создает системную «оболочку» для запуска приложения (.desktop, ярлык, иконка и т.п.);

  4. Больше не зависит от наличия manifest.json на сервере при старте.

То есть после установки все уже локально:

  • Иконки — скопированы в систему;

  • Название — сохранено;

  • URL запуска (start_url) — записан;

  • Отображение (display-mode: standalone) — зафиксировано.

Что произойдет после удаления manifest.json

Поведение Результат
Приложение уже установлено ✅ Продолжит работать
Пользователь откроет сайт в браузере ❌ Кнопка «Установить» исчезнет
Переустановка ❌ Невозможна — нет manifest.json
Обновление имени, иконки и т.п. ❌ Не произойдет, браузер не сможет проверить
Удаление сайта и повторная установка ⚠️ Невозможна без манифеста

Как проверить на практике

  1. Установи сайт как приложение (через Chrome → ⋮ → «Установить приложение»).

  2. После установки удали manifest.json или тег

  3. Перезапусти приложение — оно откроется, потому что данные сохранены локально.

  4. Открой тот же сайт во вкладке браузера — кнопки установки больше не будет.

Дополнительные нюансы

  • Если в manifest.json раньше был start_url, то именно по нему приложение всегда открывается — даже если на сайте теперь другой код или структура.

  • Если сайт недоступен, приложение покажет ошибку соединения (нет Service Worker — нет офлайн-режима).

  • Chrome, Edge, Opera и другие Chromium-браузеры ведут себя одинаково.
    Firefox — чуть иначе: он вообще слабо поддерживает PWA и может не запускать без манифеста после перезагрузки профиля.

Резюме

Действие Поведение приложения
Удалить Работает, но без обновлений
Удалить сам manifest.json Работает, но не переустанавливается
Изменить manifest.json Изменения не подхватятся до переустановки
Очистить данные сайта (AppData / Storage) Приложение перестанет работать

Как можно программно (через JS) определить, что пользователь уже использует установленное приложение (даже если manifest.json больше нет на сервере)?

Вот несколько надежных способов на JavaScript определить, что пользователь открыл установленное приложение (PWA),
даже если manifest.json больше не существует на сайте.

1. Проверка режима отображения (display-mode)

Самый надежный и простой способ — через window.matchMedia:


if (window.matchMedia('(display-mode: standalone)').matches) { 
    console.log(' Запущено как установленное приложение (PWA)'); 
} else {
    console.log(' Открыто во вкладке браузера');
 } 

Это работает даже без manifest.json,
потому что браузер запоминает display-mode при установке приложения.

2. Проверка по navigator.standalone (для iOS/Safari)

Safari на iOS использует свой флаг:

if (window.navigator.standalone) { 
    console.log('Установленное приложение на iOS'); 
} 

Этот флаг есть только в Safari (не в Chrome/Edge).

3. Комбинированный универсальный вариант

Чтобы поддержать все платформы:

function isRunningAsApp() {
    return ( window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone === true ); 
} 

if (isRunningAsApp()) { 
console.log('Приложение запущено в standalone режиме');
 } else { 
console.log(' Обычная вкладка браузера');
 } 

4. Проверка через document.referrer (дополнительно)

Установленные приложения часто не имеют Referer,
в отличие от обычных вкладок:

if (!document.referrer) {
 console.log('Вероятно, запущено как отдельное приложение');
 } else { console.log('Открыто с другой страницы или вкладки'); 
} 

Можно использовать это как дополнительный сигнал.

5. Проверка источника загрузки (через window.location)

Иногда установленное приложение может иметь специальный start_url
(например, /app/ или /home.html), отличный от обычного сайта.

Можно сделать так:

if (window.location.pathname.startsWith('/app')) { console.log(' Приложение запущено с app-пути'); } 

Это удобно, если при установке ты задавал start_url в manifest.json.

Бонус: отправить на сервер факт, что запущено как PWA

Можно добавить в твой AJAX-код:

fetch('/api/ping', { method: 'POST', headers: { 'X-From-PWA': isRunningAsApp() ? 'true' : 'false' } }); 

Тогда на сервере (PHP, например) ты сможешь различать:

if ($_SERVER['HTTP_X_FROM_PWA'] === 'true') { // код для приложения } 

Проверить в DevTools

Если хочешь убедиться, что условие работает:

  • Открой приложение (установленное).

  • Открой DevTools → Console.

  • Вставь код из п.1.

  • Должно показать "Запущено как установленное приложение (PWA)".

Рассмотрим подробне удобство start_url в manifest.json.

Давай подробно разберем, что такое start_url в manifest.json,
и почему он важен — особенно если ты работаешь с установленным приложением (PWA).

Что такое start_url

start_url — это путь (URL), с которого запускается установленное веб-приложение (PWA).

Он задается в файле manifest.json, например:

{ "name": "My Cool App", "start_url": "/app/home.html", "display": "standalone", "icons": [ { "src": "/icons/icon192.png", "sizes": "192x192", "type": "image/png" } ] } 

Что делает start_url

Когда пользователь устанавливает сайт как приложение, браузер:

  • сохраняет это значение (/app/home.html);

  • и потом всегда открывает приложение именно с этого URL,
    даже если пользователь нажимает на ярлык, а не на ссылку.

То есть — это «точка входа» твоего приложения.

Пример

Допустим, твой сайт:

https://example.com/ 

а в manifest.json ты прописал:

"start_url": "/dashboard" 

Теперь:

  • при открытии приложения из меню/ярлыка браузер запустит:
    https://example.com/dashboard

  • но если пользователь просто откроет сайт вручную, то он увидит https://example.com/

То есть это позволяет разделить поведение между:

  • сайтом для обычных посетителей;

  • и приложением для установленных пользователей.

Почему это удобно

Потому что ты можешь:

  • направить приложение на другой интерфейс (/app/, /panel/, /offline.html);

  • использовать разные версии сайта;

  • или показывать другой JS-файл / другой layout,
    специально для установленных пользователей.

Пример использования

Ты можешь использовать start_url совместно с JS-проверкой:

if (window.matchMedia('(display-mode: standalone)').matches) { console.log('App started from', window.location.href); } 

И если window.location.pathname совпадает со значением из start_url,
значит, пользователь запустил установленное приложение, а не просто открыл сайт.

Кратко:

Свойство Назначение
start_url URL, с которого приложение запускается после установки
Работает где В Chrome, Edge, Opera, Android WebView
Что делает Определяет «точку входа» для PWA
Можно использовать для Разделения логики сайта и приложения

Если в manifest.json не указан параметр start_url?

Давай разберем — что происходит, если в manifest.json не указан параметр start_url.

Короткий ответ

Если в manifest.json нет поля "start_url",
то браузер по умолчанию использует URL страницы,
с которой пользователь установил приложение.

Подробное объяснение

Когда пользователь нажимает «Установить приложение» (или «Добавить на рабочий стол»),
браузер смотрит:

«С какой страницы я сейчас устанавливаюсь?»

Если в manifest.json нет start_url, то он просто сохраняет текущий адрес
и делает его точкой запуска.

Пример 1 — без start_url

manifest.json:

{ "name": "MyApp", "display": "standalone" } 

Пользователь установил сайт с:

https://example.com/index.html 

После установки приложение всегда будет запускаться с

https://example.com/index.html 

Пример 2 — с подстраницей

Если пользователь установил приложение из другой страницы, например:

https://example.com/app/dashboard 

Тогда при запуске приложения оно всегда будет открываться именно на этом URL,
даже если ты потом изменишь структуру сайта.

Возможные проблемы

  1. Непредсказуемое поведение
    Если разные пользователи устанавливают приложение с разных страниц,
    у каждого будет своя «точка входа».
    Один будет попадать на /, другой — на /shop/, третий — на /app/dashboard.

  2. Проблемы при обновлении
    Если ты меняешь маршруты или удаляешь ту страницу,
    с которой приложение было установлено, —
    у пользователя может появиться ошибка 404 при запуске.

  3. Нельзя централизованно управлять стартом приложения,
    потому что URL зависит от того, где пользователь находился во время установки.

Рекомендация

Лучше всегда указывать start_url явно, например:

{ "name": "MyApp", "short_name": "App", "start_url": "/app/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#2196f3", "icons": [ { "src": "/icons/192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/icons/512.png", "sizes": "512x512", "type": "image/png" } ] } 

Так ты контролируешь, откуда приложение стартует у всех пользователей,
и можешь специально подготовить интерфейс под display-mode: standalone.

Итого:

Сценарий Что произойдет
start_url указан Приложение всегда запускается с этого адреса
start_url не указан Приложение запускается с того адреса, где было установлено
Страница была удалена ❌ Приложение перестает работать (ошибка 404)
Рекомендация ✅ Всегда явно указывать start_url

есть ли разница между

и

формат и расширение файла манифеста PWA.

Короткий ответ

Нет функциональной разницы между:


 

и


 

Оба варианта абсолютно равнозначны для браузера.
Главное, чтобы:

  • файл имел корректный MIME-тип (application/manifest+json);

  • и содержал валидный JSON.

Подробно

1. Что важно для браузера

Браузеру все равно, как называется файл —
manifest.json, manifest.webmanifest, или даже myapp.manifest.

Он ориентируется на:

  • rel="manifest" — это сигнал, что это PWA-манифест;

  • правильный MIME-тип (HTTP-заголовок);

  • корректный JSON-синтаксис.

2. Почему появилось .webmanifest

Расширение .webmanifest — это новый рекомендуемый стандарт от W3C и Google Chrome.
Его ввели, чтобы:

  • отличать PWA-манифест от обычных JSON-файлов (например, config.json);

  • позволить серверам правильно выставлять MIME-тип по расширению.

Спецификация:
https://www.w3.org/TR/appmanifest/

3. MIME-тип — вот что действительно важно

Браузеры ожидают, что сервер отдает файл с типом:

Content-Type: application/manifest+json 

Если сервер отдает application/json, Chrome и Edge все равно его примут,
но могут показать предупреждение в DevTools.

Если отдается что-то вроде text/plain — манифест игнорируется.

4. Как проверить MIME-тип

Открой в браузере свой manifest.webmanifest и посмотри в DevTools → Network → Headers.
В заголовках должно быть:

content-type: application/manifest+json 

Если видишь application/json, это не критично, но можно поправить в .htaccess:

AddType application/manifest+json .webmanifest 

Краткий итог

Критерий .json .webmanifest
Работает в браузерах ✅ Да ✅ Да
Рекомендуется стандартом ⚠️ Нет ✅ Да
Требует MIME-типа application/manifest+json ✅ Желательно ✅ Обязательно
Различие в функциональности ❌ Нет ❌ Нет
Зачем использовать .webmanifest Для ясности и совместимости с будущими стандартами

Рекомендация

Используй:


 

и на сервере пропиши MIME-тип:


 
AddType application/manifest+json .webmanifest

Так будет идеально по стандартам и без предупреждений в Chrome.

Будет ли работать такое приложение запущенное через явлык пользователем если сайт-сервер недоступен или у пользователя отключен интернет?

Это самое уязвимое место PWA, если оно не использует Service Worker.

Разберем четко, что произойдет.


Сценарий

Пользователь установил сайт как приложение (через ярлык).
Сайт теперь запускается в отдельном окне (display-mode: standalone).

Что будет, если:

  • сервер недоступен (ошибка 500, 404, хост не отвечает),

  • или нет интернета?

Короткий ответ

Приложение не запустится.

Браузер при запуске такого ярлыка просто пытается загрузить тот же URL (из start_url или страницы установки).
Если:

  • сервер не отвечает,

  • нет подключения к сети,

  • или страница не загружена из кэша,

то пользователь увидит стандартную ошибку браузера:

“Нет подключения к Интернету”
“This site can’t be reached”
“ERR_INTERNET_DISCONNECTED”

Даже если приложение установлено, оно не автономное, если нет Service Worker.

Почему так

Без Service Worker браузер не имеет права использовать кэшированные версии произвольно.
Он обращается напрямую к сети, и если сервер недоступен — все падает.

Service Worker же — это как «прокси в браузере», который может сказать:

«Сети нет? Тогда вот тебе сохраненная страница из кэша».

Что точно не спасет

Механизм Что делает Поможет офлайн?
manifest.json / webmanifest Только описывает метаданные (имя, иконку, цвет и т.п.) ❌ Нет
Добавление на рабочий стол Создает ярлык и окно ❌ Нет
HTTP Cache Может держать ресурсы в памяти, но не гарантированно ⚠️ Только если недавно открывал и не очистил кэш

Браузерный кэш может «случайно» сохранить ресурсы,
и приложение может один раз открыться офлайн — но это не надежно.

Как сделать, чтобы работало офлайн

Нужно добавить Service Worker, который:

  1. Устанавливается при первом запуске.

  2. Кэширует нужные файлы (index.html, main.js, style.css, картинки и т.п.).

  3. При следующем запуске:

    • если интернет есть — загружает свежие файлы;

    • если нет — берет их из кэша.

Минимальный пример:

// service-worker.js 

self.addEventListener('install', event => { event.waitUntil( caches.open('my-cache-v1').then(cache => { return cache.addAll([ '/', // главная страница '/index.html', '/style.css', '/main.js', '/icon.png' ]); }) ); }); self.addEventListener('fetch', event => { event.respondWith( fetch(event.request).catch(() => caches.match(event.request)) ); }); 

И подключение в HTML:


 

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

Вывод

Условие Будет работать офлайн?
Без Service Worker ❌ Нет
С Service Worker и кешем ✅ Да
Сайт впервые открыт, но не кэширован ❌ Нет
Сайт уже посещен, но сервер недоступен ⚠️ Иногда (если повезет с HTTP-кэшем)

Хочешь, я покажу пример Service Worker, который делает офлайн-режим с кастомной страницей "Вы офлайн",
чтобы пользователь видел красивое сообщение вместо ошибки браузера?

You said:
если "start_url": ".", что значит и валидно ли?
ChatGPT said:

Да, это хороший момент — разберем подробно.


🧩 Что значит "start_url": "."

В manifest.json поле start_url задает URL, с которого будет запускаться установленное приложение.

  • "." в URL — это относительный путь, который указывает на текущую директорию файла манифеста.

  • То есть браузер будет запускать приложение с того же каталога, где лежит manifest.json.

Пример структуры:


 
/index.html /manifest.json /app/main.js

Если в manifest.json указано:


 
"start_url": "."

И файл manifest.json лежит в корне /, то . → /
То есть приложение будет запускаться с /index.html (или /, в зависимости от сервера).

Если файл лежит в /app/manifest.json, то . → /app/.

Валидность

  • Валидно. JSON-спецификация PWA позволяет использовать относительные пути.

  • Главное, чтобы при разрешении относительно местоположения манифеста получилось корректное URL.

Особенности

  1. В зависимости от расположения манифеста результат может быть разным.

    • Если manifest.json в корне → . = /

    • Если manifest.json в поддиректории /app/ → . = /app/

  2. Лучше явно указывать путь относительно корня сайта для однозначности:


 
"start_url": "/"

или


 
"start_url": "/app/"
  1. Совместимость с браузерами

    • Chrome, Edge, Opera корректно интерпретируют ".".

    • Safari (iOS) также работает, но иногда лучше использовать абсолютный путь для надежности.

Вывод

start_url Что означает Рекомендация
"." Текущая директория манифеста ✅ Работает, но относительный путь зависит от расположения файла
"/" Корень сайта ✅ Однозначно и безопасно
"/app/" Поддиректория /app/ ✅ Контролируемое поведение для PWA

Вау!! 😲 Ты еще не читал? Это зря!

Исследование, описанное в статье про pwa-приложения, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое pwa-приложения и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

создано: 2025-10-21
обновлено: 2026-03-10
16



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:
Пожаловаться

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)