В середине 2018 года я играл с Parcel, чтобы создать VueJs прогрессивное веб-приложение (PWA).

Тогда это было как-то необычно.

Переработав его, я могу сказать, как он сравнивается с Webpack и как Parcel улучшает свой опыт PWA.

Напоминания

Если вы уже знакомы с названием, можете пропустить эту часть 🥳.

Прогрессивное веб-приложение (PWA)

Короче говоря, PWA — это веб-сайт, который использует определенный набор веб-технологий, чтобы его можно было использовать как обычное приложение для iOS/Android.

Чтобы немного покопаться в этом:

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

Это необходимо:

  • что вы размещаете свой веб-сайт в HTTPS
  • браузер, поддерживающий Service Worker API
  • файл веб-манифеста: файл JSON, который предоставляет информацию о вашем веб-приложении.
  • service worker: файл JavaScript, который использует SW API для выполнения каких-то действий (да, вещей, потому что вы можете делать много-много вещей)

Вы можете написать последнее в предпочитаемом вами текстовом редакторе, но…

… рабочий ящик

— это инструмент, разработанный и поддерживаемый Google, который поможет вам написать файл сервисного работника.

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

Если вы еще этого не сделали, попробуйте. Документация хорошая, а инструмент прост в использовании.
И самое главное: Workbox действительно помогает.

Посылка 1.11.0

Это молниеносно быстрый сборщик веб-приложений, не требующий настройки.
Он помогает людям компилировать вещи с помощью веб-технологий (HTML, CSS и JS).

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

Вы можете проверить этот пост о Parcel, если вам нужна дополнительная информация. (Да, самореклама 😎)

Как было с Parcel в середине 2018 года

Основной принцип Parcel заключается в том, что он анализирует точку входа вашего приложения, проходит по любому пути к файлу внутри него и компилирует/оптимизирует/хэширует их.
Это может быть почти что угодно (см. типы активов в документе! ), так что HTML, CSS, JS, изображения, JSON… ВСЕ!

Так что это хорошо и хорошо, но это может быть проблемой, так как Parcel имеет тенденцию быть слишком жадным (быть слишком жадным плохо).

Чтобы иметь PWA, нам нужно (по порядку):

1/ есть несколько значков приложений
2/ есть manifest.webmanifest файл
3/ создаем наш HTML/JS/CSS /ресурсы:

• наш HTML должен ссылаться на манифест с помощью <link rel="manifest" href="/manifest.webmanifest">
• наш будущий сервис-воркер должен вызываться в нашем JS-файле

4/ создайте сервис-воркер с помощью Workbox, который будет кэшировать любые ресурсы, необходимые для приложения
5/ …и все 🎉

Но в это время Parcel будет иметь:

  • перешел по ссылке на наш манифест и преобразовал ее в файл js 😨
  • следил за регистрацией нашего сервис-воркера и ломается, потому что его еще не существует 😰
  • и так 😱

Для того, чтобы этого избежать, вам необходимо:

  • избегайте вашего HTML-файла в качестве точки входа (поэтому компилируйте только JS/CSS)
  • приходите с еще одним упрощенным HTML-файлом для использования сервера Parcel dev
  • сгенерировать сервис-воркера с помощью workbox-build
  • создать другой рабочий HTML-код, который:
    — ссылается на файл манифеста
    — содержит тег script, который устанавливает наш сервис-воркер (таким образом Parcel не будет анализировать его)

manifest.webmanifest

с веб-пакетом

В истории Webpack существует плагин webpack-pwa-manifest, который позаботится о:

  • создание иконок
  • создание файла манифеста
  • вставка его в HTML
  • позаботьтесь о старых проприетарных тегах в iOS, если это необходимо

и это УЖАСНО.

с посылкой

Теперь он поддерживает НЕ анализ/изменение вашего файла манифеста, что было настоящим обломом в предыдущих версиях.

Создание собственного файла манифеста само по себе не является проблемой. Это всего лишь небольшой файл JSON, который со временем сильно не изменится.
Что касается значков, я нашел node-image-resizer, который поможет вам создать значки разных размеров для приложений. И поскольку он использует jimp под капотом, вам не нужно будет устанавливать какие-либо внешние зависимости (например, GraphicMagic).

Так что, даже если это менее «подключи и работай», чем использование веб-пакета, теперь это намного лучше, чем не использовать ваш HTML-файл в качестве точки входа (в основном для сервера разработки).
Я хотел бы увидеть веб-пакет-pwa- манифестные альтернативы, но мой собственный останется в моем списке проектов с открытым исходным кодом, чтобы сделать это, я знаю, что не найду времени, чтобы сделать, но это может быть полезно для сборки 😔

сервисный работник

с веб-пакетом

Google разрабатывает и поддерживает workbox-webpack-plugin, который позволяет создавать рабочий файл.

На inject mode у него есть несколько приятных дополнений, а именно:

  • внедрение библиотеки workbox для вас
  • создание отдельного файла манифеста предварительного кэша (я считаю, что все эти пути должны быть отделены от «настоящего» кода работника службы)

с посылкой

Есть parcel-plugin-sw-cache, который работает достаточно хорошо. Нет приятных дополнений к workbox-webpack-plugin, но он справляется со своей задачей.

Кроме того, конфигурация зависит от package.json, поэтому она может быть менее гибкой, чем конфигурация веб-пакета JS.

Но чтобы предотвратить слишком жадное поведение Parcel, вам нужно использовать небольшую хитрость, чтобы зарегистрировать вашего сервис-воркера так, чтобы Parcel этого не заметил:

Вывод

Webpack предлагает более плавный опыт благодаря более зрелой экосистеме, но работа с Parcel для создания PWA намного более плавная, чем была. Хорошая игровая посылка! 🏆

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

Вы можете найти веб-приложения здесь:

  • Tailpha, который использует веб-пакет
  • Thaime, который использует Parcel

Первоначально опубликовано на hiswe.github.io.