Как преобразовать ваше веб-приложение Vue в прогрессивное веб-приложение. Учебник с примерами.

В этом посте мы увидим, как взять существующее приложение Vue, которое я создал в предыдущем посте, и преобразовать его в PWA!

Прогрессивные веб-приложения (PWA) - это веб-приложения, которые могут без проблем работать на мобильных устройствах. Но это еще не все! PWA не ограничиваются никакими ограничениями и правилами, установленными в Play Store или App Store.

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

Еще одна замечательная особенность PWA - это то, что они могут загружаться в неопределенных сетевых условиях, даже в автономном режиме, и это здорово. Давайте начнем.

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



Базовое приложение

Базовое приложение, над которым мы будем работать, - это простое приложение Vue, которое использует Firebase для аутентификации и базы данных. Ранее я писал сообщение о том, как создать это приложение. Вы можете прочитать это здесь:



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



Используйте команду git clone, чтобы загрузить код в вашу систему:

$ git clone https://github.com/rajatk16/dc-covers

Или, если вы по какой-то причине никогда не использовали GitHub, просто нажмите кнопку «Загрузить как zip».

Затем откройте командный терминал и команду install с помощью NPM или Yarn.

npm install // or yarn install

После завершения установки пакетов вы заметите, что в папке приложения создается новая папка с именем .node_modules. Чтобы проверить, работает ли приложение, запустите npm run dev или yarn dev, чтобы запустить приложение в браузере:

С этим мы можем начать превращать это базовое веб-приложение в прогрессивное!

Манифест

Чтобы создать прогрессивное веб-приложение, браузер должен сначала знать, что это PWA. Это снижено созданием Web App Manifest. Манифест веб-приложения - это файл JSON, который определяет некоторую информацию о приложении. Он очень похож на то, как выглядит файл манифеста Android, и содержит такую ​​информацию, как имя, автор и т. Д.

Внутри корневого каталога проекта создайте новый файл с именем manifest.json.

Еще раз, этот файл используется для описания приложения с помощью некоторых метаданных, как показано ниже:

{
  "name": "DC-Covers",
  "short_name": "Covers",
  "start_url": "index.html",
  "display": "standalone",
  "theme_color": "#0476F2",
  "background_color": "#fff",
  "icons": [
    {
      "src": "", // usually kept in the static/icons folder
      "sizes": "", // enter the size of the image 
      "type": "" // enter the type of the image eg: image/png,
    },
  ]
}

Здесь мы написали name как обложки DC и short_name как обложки. Если название вашего приложения уже короткое, вы можете пропустить добавление этого свойства. Вы не можете дать более короткое имя приложению с названием вроде Whatsapp! 😆

Затем у нас есть свойство с именем start_url, это относится к основному html-файлу нашего приложения, которым в данном случае является файл index.html. Затем мы воспользуемся свойством display, чтобы сообщить нашему браузеру, как открыть приложение. Значение standalone откроет приложение как обычное. Вы можете установить для этого свойства что-нибудь вроде полноэкранный или минимальный-ui.

theme_color будет использоваться для установки цвета любой панели инструментов на наших мобильных устройствах, а background_color будет использоваться для заставки PWA.

icons - это массив объектов, который может использоваться для определения значков нашего приложения.

Осталось сделать последнее! Перейдите к файлу index.html и добавьте тег link, указывающий на этот файл manifest.json.

<html>
  <head>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.css" />
    <link rel="manifest" href="/manifest.json"/>
    <title>DC Comics Rebirth - Covers</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="/build/build.js"></script>
  </body>
</html>

Но как мы узнаем, сработало ли это?

Если мы откроем DevTools в нашем браузере, вы увидите вкладку под названием Приложение. Там должно получиться что-то вроде этого

Мета-теги

Помимо файла манифеста веб-приложения, который мы создали в предыдущем разделе, мы также можем добавить пару метатегов, чтобы предоставить более точную информацию. Это поможет некоторым другим браузерам, таким как iOS и Microsoft Edge, узнать, что это приложение является прогрессивным и, следовательно, его можно установить.

Внутри файла index.html напишите следующие теги meta в разделе head.

<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="DC-Covers">
<meta name="msapplication-TileImage" content="link to the image in static folder">
<meta name="msapplication-TileColor" content="#000">

Первые три тега для браузера / устройства iOS. Первый тег сообщает iOS, что веб-приложение можно установить. Следующий тег настраивает стиль строки состояния, и я установил default строку состояния пользователя. Последний тег iOS - это то место, где мы можем сообщить iOS, что такое title нашего приложения.

Затем мы определяем теги meta для браузеров Microsoft Edge, сначала while направляет на более мелкие значки, хранящиеся в папке static/icons. Тег TileColor определяет tile цвет, который Windows использует для размещения icon на главном экране.

Нам также нужно добавить link к значку, который мы хотим отображать на главном экране главного экрана iOS, как показано ниже:

<link rel="apple-touch-icon" href="link to the smaller icon">

При этом наше приложение узнают все современные браузеры.

Кэширование с помощью сервис-воркеров

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

Создание сервис-воркеров - непростая задача. А поскольку для каждой функции требуется отдельный сервис-воркер, задача также может стать повторяющейся. Вместо этого мы будем использовать sw-precache для автоматизации процесса создания сервис-воркеров.

Начнем с глобальной установки sw-precache с помощью NPM:

$ npm install sw-precache -g

После установки создайте файл конфигурации с именем sw-config.js и напишите в нем следующий код:

module.exports = {
  staticFileGlobs: [
    'index.html',
    'manifest.json',
    'dist/**.js'
  ]
}

Этот файл в основном сообщает, что нам нужно кэшировать index.html, manifest.json и все файлы JavaScript, хранящиеся в папке dist.

Затем запустите команду sw-precache с флагом --config, связанным с файлом sw-config.js, как показано ниже:

$ sw-precache --config sw-config.js

Это создаст новый файл с именем service-worker.js, содержащий массу кода, определяющего сервис-воркера, который кэширует все файлы, упомянутые выше.

Автоматизация генерации серверных рабочих

В предыдущем разделе мы вручную сгенерировали серверного воркера. Но что нам действительно нужно сделать, так это автоматизировать это внутри процесса сборки. Это можно сделать, используя sw-precache-webpack-plugin как зависимость разработчика.

Сначала установите этот пакет как devDependency:

$ npm install -D sw-precache-webpack-plugin

Затем откройте webpack.config.js и импортируйте указанную выше devDependency, как показано ниже:

const SWPrecache = require('sw-precache-webpack-plugin')

Внизу вы увидите оператор if, который определяет все плагины, используемые в приложении. Напишите внутри него новый экземпляр SWPrecache, как показано ниже:

new SWPrecache({
  cacheId: 'dc-covers',
  filepath: 'service-worker.js',
  staticFileGlobs: [
    'index.html',
    'manifest.json',
    'dist/*.{js,css}
  ],
  stripPrefix: '/'
})

Запустите команду npm run build, и вы увидите, что создается новый файл с именем service-worker.js.

Следующим шагом является регистрация этого сервис-воркера в браузере.

Регистрация сервис-воркера

Как упоминалось ранее, после создания сервис-воркера нам нужно зарегистрировать его в браузере. Самый простой способ сделать это - написать регистрационный код внутри файла src/main.js.

Внутри файла main.js мы будем использовать navigator API. В навигаторе есть свойство serviceWorker с методом register, который принимает URL-адрес файла service-worker.js.

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

Кроме того, сервис-воркеры создаются только тогда, когда приложение находится в рабочем режиме. Поэтому нам также необходимо убедиться, что код запускается только тогда, когда приложение работает в производственном режиме.

const prod = process.env.NODE_ENV === 'production'
const shouldSW = 'serviceWorker' in navigator && prod
if (shouldSW) {
  navigator.serviceWorker.register('/service-worker.js').then(() => {
    console.log("Service Worker Registered!")
  })
}

Перестройте приложение с помощью npm run build, а затем запустите его с помощью http-server или расширения Live Server для VS Code. В разделе «Приложение» инструментов разработчика браузера вы заметите, что разделы «Сервис-воркеры» уже не так пусты.

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

Браузер обновляет сервис-воркер, выполняя побайтовое сравнение измененной версии и старой версии. Если они отличаются, измененная версия заменит старую версию.

Но если мы внесем какие-либо изменения, перестроим приложение и запустим приложение в браузере, вы заметите, что ничего не изменилось. Это связано с тем, что сервис-воркер имеет полный контроль над кешем в течение некоторого времени (обычно в течение 1 часа).

Автоматическая отмена регистрации сервис-воркера

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

Сначала нам нужно создать нового сервис-воркера для режима разработки. Я назову этот файл service-worker-dev.js. Весь смысл этого сервис-воркера состоит в том, чтобы перезаписать исходный сервис-воркер производственного режима.

Добавьте eventListener в событие install, которое будет вызывать функцию, вызывающую skipWaiting. Это принудительно активирует сервис-воркер.

self.addEventListener('install', () => {
  self.skipWaiting()
})

Я также добавлю еще EventListener для события activate. Это поможет нам получить доступ ко всем другим вкладкам и окнам браузера, которые будут использовать этого сервис-воркера.

self.addEventListener('activate', () => {
  self.clients.matchAll({
    type: 'window'
  }).then(clients => {
    for (let client of clients) {
      client.navigate(client.url)
    }
  })
})

Как и в предыдущем разделе, нам нужно использовать этого сервис-воркера, добавив его в файл main.js.

const shouldSWDev = 'serviceWorker' in navigator && !prod

Затем мы добавляем else if к оператору if из предыдущих разделов, который проверяет, не является ли режим производственным.

else if (shouldSWDev) {
  navigator.serviceWorker.register('/service-workder-dev.js').then(() => {
    console.log('Service Worker Registered!')
  })
}

Теперь запустите приложение, используя npm run dev. Тогда вы заметите в разделе приложения DevTool, что файл сервис-воркера изменился!

Заключение

В этом посте мы впервые вкратце увидели, что такое прогрессивные веб-приложения. Затем мы создали «манифест», чтобы помочь браузерам распознавать наши веб-страницы как веб-приложения. Мы также добавили несколько тегов meta, чтобы другие браузеры могли распознавать веб-страницу как приложение. Таким образом, приложение потенциально можно будет установить.

Затем мы вручную создаем нашего первого сервис-воркера. Затем мы увидели, как автоматизировать процесс внутри сервера webpack. Наконец, мы зарегистрировали сервис-воркера, увидели, почему изменения не обновляются в браузере, а затем создали нового сервис-воркера, который отменяет регистрацию нашего исходного сервис-воркера в режиме разработки.

Есть еще много вещей, которые мы можем сделать, чтобы сделать наше приложение прогрессивным. DevTools Chrome может «проверять» наше приложение и сообщать нам, насколько оно прогрессивно и что еще мы можем сделать для его улучшения.

Кроме того, при создании каталога проекта нашего приложения с помощью Vue-CLI мы можем просто использовать vue-init pwa vue-app.

Это упростит нам создание нашего прогрессивного веб-приложения!

Спасибо за чтение, и, пожалуйста, не стесняйтесь комментировать и спрашивать что-нибудь 😄 Ура

Учить больше