Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
01 Июн 2023
3 мин
1306

Что такое PWA и как создать прогрессивное веб-приложение

Узнайте, что такое PWA и как создать прогрессивное веб-приложение для улучшения пользовательского опыта и стабильности работы!

Прогрессивные веб-приложения (PWA, Progressive Web Apps) – это современный подход к разработке веб-приложений, который позволяет предоставить пользователям опыт, сравнимый с опытом использования нативных приложений. PWA сочетают в себе преимущества веб-технологий и мобильных приложений, обеспечивая высокую производительность, оффлайн-доступность и возможность установки на устройство.

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

  1. Надежность: PWA должны быть доступны даже при отсутствии или нестабильном интернет-соединении. Это достигается с помощью Service Workers, которые кэшируют данные и обеспечивают их доступность оффлайн.

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

  3. Устанавливаемость: PWA могут быть установлены на устройство пользователя, как нативное приложение, и запускаться с рабочего стола или главного экрана.

Чтобы создать прогрессивное веб-приложение, необходимо выполнить следующие шаги:

Регистрация Service Worker

Service Worker – это скрипт, который работает в фоновом режиме и отвечает за кэширование, отправку уведомлений и синхронизацию данных. Для регистрации Service Worker добавьте следующий код в файл index.html:

<script>
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/sw.js').then(() => {
      console.log('Service Worker зарегистрирован успешно');
    });
  }
</script>

Создание манифеста

Манифест – это JSON-файл, который содержит метаданные о вашем приложении, такие как имя, иконки, цвета и т.д. Создайте файл manifest.json и добавьте в него следующий код:

{
«name»: «My PWA»,
«short_name»: «PWA»,
«description»: «Пример прогрессивного веб-приложения»,
«start_url»: «/»,
«display»: «standalone»,
«background_color»: «#ffffff»,
«theme_color»: «#000000»,
«icons»: [
{
«src»: «/icon.png»,
«sizes»: «192×192»,
«type»: «image/png»
}
]
}

Не забудьте добавить ссылку на манифест в ваш index.html:

<link rel="manifest" href="/manifest.json">

Организация кэширования

В файле sw.js (Service Worker) определите список ресурсов для кэширования и добавьте обработчики событий install, activate и fetch:

const CACHE_NAME = 'my-pwa-cache';
const CACHE_FILES = [
  '/',
  '/index.html',
  '/style.css',
  '/script.js',
  '/icon.png'
];

self.addEventListener('install', (event) =&gt; {
  event.waitUntil(
    caches.open(CACHE_NAME).then((cache) =&gt; {
      return cache.addAll(CACHE_FILES);
    })
  );
});

self.addEventListener('activate', (event) =&gt; {
  event.waitUntil(
    caches.keys().then((cacheNames) =&gt; {
      return Promise.all(
        cacheNames.map((cacheName) =&gt; {
          if (cacheName !== CACHE_NAME) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

self.addEventListener('fetch', (event) =&gt; {
  event.respondWith(
    caches.match(event.request).then((response) =&gt; {
      return response || fetch(event.request);
    })
  );
});

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

Заключение

Создание прогрессивного веб-приложения (PWA) – это отличный способ улучшить пользовательский опыт и повысить стабильность работы вашего веб-приложения. Используйте вышеуказанные шаги и рекомендации для создания своего собственного PWA. Удачи вам в разработке! 😉

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
","",""],"correct":1},{"question":"Что происходит во время события 'install' в Service Worker?","answers":["Кэшируются ресурсы приложения","Удаляются устаревшие кэши","Обрабатываются запросы"],"correct":0}]}`; const $wrapper = jQuery('.media-article-test__main'); const { data: testData } = JSON.parse(test_data_json); let current = 0; function showForm() { const input = document.querySelector(".media-article-test__form .media-article-test__form-input--phone"); const iti = window.intlTelInput(input, { initialCountry: "ru", strictMode: true, showSelectedDialCode: true, utilsScript: "https://fastly.jsdelivr.net/npm/intl-tel-input@21.2.7/build/js/utils.js", }); jQuery.validator.addMethod("phoneValid", function () { return iti.isValidNumber() }) const $form = jQuery('.media-article-test__form'); $form.css('display', ''); $form.on('submit', (e) => { e.preventDefault(); }) $form.validate({ rules: { phone: { required: true, phoneValid: true }, email: { required: true } }, messages: { phone: { required: "Телефон обязателен", phoneValid: "Введите корректный телефон" }, email: { required: "Почта обязательна", email: "Введите корректный email" } }, focusInvalid: false, submitHandler: async function (form) { const $phone = $form.find('input[name="phone"]').get(0); const $email = $form.find('input[name="email"]').get(0); const $name = $form.find('input[name="name"]').get(0); const utm_campaign = encodeURIComponent(window.location.href.split('?')[0]) const formData = new FormData(); $name.value && formData.append("name", $name.value); formData.append("email", $email.value); formData.append("phone", window.intlTelInputGlobals.getInstance($phone).getNumber()); formData.append("queryParams", `utm_source=skypro_blog&utm_campaign=${utm_campaign}`); formData.append("sourceKey", "skypro_blog_article_test"); formData.append("funnel", "televox"); $form.addClass("media-article-test__form--loading"); try { await fetch('https://api.sky.pro/api/v1/lead/tilda', { method: 'POST', body: formData, }); jQuery('.media-article-test__success').css('display', ''); try { ym(69215599, "reachGoal", "marketing_lead"); ym(69215599, "reachGoal", "send_any_form"); } catch (e) {} // $modalWrap.css("display", "none"); } catch (e) { // $modal.removeClass("spm-voting__modal--loading"); // jQuery(".spm-voting__form-submit-error").css("display", "block"); jQuery('.media-article-test__form-title').text('Ошибка выполнения запроса!'); } finally { $form.removeClass("media-article-test__form--loading"); jQuery('.media-article-test__form-submit').css('display', 'none'); jQuery('.media-article-test__form .iti').css('display', 'none'); jQuery('.media-article-test__form-input[name="name"]').css('display', 'none'); jQuery('.media-article-test__form-input[name="email"]').css('display', 'none'); } } }) const $testBlock = jQuery('.media-article-test__main'); $testBlock.css('filter', 'blur(10px)'); $testBlock.css('background', 'none'); $testBlock.css('pointer-events', 'none'); $form.css('display', ''); jQuery('.media-article-test').css('min-height', '360px'); jQuery('.media-article-test__title').css('display', 'none'); jQuery('.media-article-test__subtitle').css('display', 'none'); } function render() { const { question, answers } = testData[current] $wrapper.html(`
Вопрос ${current + 1}: ${question}
${current + 1} / ${testData.length}
${answers.map(ans => ` `).join('')}
`); jQuery('.media-article-test__answer').click(() => { jQuery($wrapper).fadeOut(300, function() { if (current < testData.length - 1) { current++; render() } else { showForm() } jQuery(this).fadeIn(300); }); }) } render() })

Добавить комментарий