Итак, вы увидели заголовок и задаетесь вопросом, как можно создать реальное мобильное приложение, просто используя знания основных веб-технологий без необходимости изучать разработку для Android или IOS? Это стало возможным благодаря преобразованию ваших обычных веб-приложений в стандартное мобильное приложение, которое можно установить на нескольких платформах. Сделав это, мы получим тип приложения, который называется Progressive Web Apps (PWA).
В этой статье мы узнаем, как использовать возможности HTML, CSS и Javascript для создания простого мобильного приложения. Мы не будем использовать такие фреймворки, как Ionic или React Native. Это связано с тем, что в этом руководстве основное внимание уделяется демонстрации того, как можно заставить базовое веб-приложение чувствовать себя и вести себя как родное мобильное приложение, которое можно установить и запустить на мобильных устройствах, используя самый простой метод с наименьшей абстракцией.
Чтобы продолжить, давайте кратко познакомимся с PWA.
Что такое прогрессивные веб-приложения?
Согласно официальным веб-документам MDN:
Прогрессивные веб-приложения (PWA) — это веб-приложения, в которых используются сервис-воркеры, манифесты и другие функции веб-платформы в сочетании с прогрессивным улучшением, чтобы предоставить пользователям возможности, не уступающие нативным приложениям.
Проще говоря, это в основном веб-сайты в стиле приложений, которые можно запускать либо в браузере веб-сайта, либо устанавливать непосредственно на мобильное устройство и получать к ним доступ как к родному приложению.
Есть три ключевых компонента PWA;
- Service Worker: Service Worker преобразует веб-сайт в приложение, позволяя ему загружать и кэшировать файлы на устройстве.
- Веб-манифест. Этот файл JSON содержит основную метаинформацию о приложении, такую как значок приложения, цвет фона и т. д.
- Безопасный HTTPS. HTTPS является обязательным и делает PWA более безопасными, чем обычные веб-приложения.
У PWA есть плюсы и минусы. Среди бывших:
- Дешевая и быстрая разработка. PWA дешевле, быстрее и проще в создании, чем нативные приложения. Разработка нативных приложений с нуля требует использования определенных технологий для обеих платформ. HTML, CSS и JavaScript — это все, что требуется для PWA.
- Кроссплатформенная доступность. Одним из многообещающих преимуществ PWA является то, что их можно устанавливать и запускать на нескольких устройствах с различными операционными системами.
- Офлайн-функции. Плохой интернет или его полное отсутствие не помешает пользователям использовать ваше приложение, поскольку оно может кэшировать данные для просмотра в автономном режиме с помощью сервисных работников.
- Производительность. По сравнению с нативными мобильными приложениями PWA намного легче, не занимают столько места в памяти и быстрее загружаются.
С отрицательной стороны:
- Высокое потребление батареи. Поскольку PWA представляют собой встроенный высокоуровневый веб-код, телефонам приходится прилагать больше усилий, чтобы прочитать этот код; они потребляют больше энергии, чем родные приложения.
- Доступ к мобильному оборудованию: PWA не могут получить доступ к различным аппаратным функциям, таким как Bluetooth устройства, датчики приближения и т. д.
- Распространение Поскольку PWA не распространяются через магазин приложений, вы можете упустить пользователей, которые в основном просматривают магазин приложений.
Вам следует рассмотреть возможность использования/создания прогрессивных веб-приложений, если вы соответствуете следующим критериям:
- У вас нет бюджета для создания полноценного приложения.
- Вам нужно быстрее достучаться до целевой аудитории.
- Кроссплатформенная совместимость имеет важное значение для вашего бизнеса.
Мы будем создавать мобильное приложение «Todo List» с использованием HTML, CSS и Javascript. Сначала мы создадим веб-приложение, используя IndexedDB для нашей базы данных, рабочий блок, чтобы заставить его работать в автономном режиме, и веб-манифест, чтобы его можно было установить на разных устройствах. Окончательный результат будет следующим:
Мы начинаем с создания пустой папки с именем Todo App, а затем создаем внутри три файла с именами index.html
, index.css
, index.js
и папку с ресурсами (которая будет содержать наш логотип).
Структурирование нашего HTML
Перейдите к файлу index.html
и введите следующие строки кода:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>My Todo</title> <link rel="stylesheet" href="index.css" /> </head> <body> <header> <h1>Todo PWA</h1> <form id="new-task-form"> <input type="text" name="new-task-input" id="new-task-input" placeholder="What do you have planned?" /> <input type="submit" id="new-task-submit" value="Add task" /> </form> </header> <main> <section class="task-list"> <h2>Tasks</h2> <div id="tasks"> </div> </section> </main> <script src="index.js"></script> </body> </html>
Здесь мы создали макет HTML-страницы и связали наши index.css
и index.js
. Теперь давайте продолжим и добавим немного стиля.
Стилизация нашего приложения с помощью CSS
Обновите файл index.css
кодом ниже:
:root { --dark: #05152E; --darker: #1F2937; --darkest: #001E3C; --grey: #6B7280; --pink: #EC4899; --purple: #8B5CF6; --light: #EEE; } * { margin: 0; box-sizing: border-box; font-family: "Fira sans", sans-serif; } body { display: flex; flex-direction: column; min-height: 100vh; color: #FFF; background-color: var(--dark); } header { padding: 2rem 1rem; max-width: 800px; width: 100%; margin: 0 auto; } header h1{ font-size: 2.5rem; font-weight: 300; color: white; margin-bottom: 1rem; } h1{ text-align: center; } #new-task-form { display: flex; } input, button { appearance: none; border: none; outline: none; background: none; } #new-task-input { flex: 1 1 0%; background-color: var(--darker); padding: 1rem; border-radius: 1rem; margin-right: 1rem; color: var(--light); font-size: 1.25rem; } #new-task-input::placeholder { color: var(--grey); } #new-task-submit { color: var(--pink); font-size: 1.25rem; font-weight: 700; background-image: linear-gradient(to right, var(--pink), var(--purple)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; cursor: pointer; transition: 0.4s; } #new-task-submit:hover { opacity: 0.8; } #new-task-submit:active { opacity: 0.6; } main { flex: 1 1 0%; max-width: 800px; width: 100%; margin: 0 auto; } .task-list { padding: 1rem; } .task-list h2 { font-size: 1.5rem; font-weight: 300; color: var(--grey); margin-bottom: 1rem; } #tasks .task { display: flex; justify-content: space-between; background-color: var(--darkest); padding: 1rem; border-radius: 1rem; margin-bottom: 1rem; } .task .content { flex: 1 1 0%; } .task .content .text { color: var(--light); font-size: 1.125rem; width: 100%; display: block; transition: 0.4s; } .task .content .text:not(:read-only) { color: var(--pink); } .task .actions { display: flex; margin: 0 -0.5rem; } .task .actions button { cursor: pointer; margin: 0 0.5rem; font-size: 1.125rem; font-weight: 700; text-transform: uppercase; transition: 0.4s; } .task .actions button:hover { opacity: 0.8; } .task .actions button:active { opacity: 0.6; } .task .actions .edit { background-image: linear-gradient(to right, var(--pink), var(--purple)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .task .actions .delete { color: crimson; }
Повтор сеанса с открытым исходным кодом
OpenReplay — это альтернатива FullStory и LogRocket с открытым исходным кодом. Это дает вам полную наблюдаемость, воспроизводя все, что ваши пользователи делают в вашем приложении, и показывая, как ваш стек ведет себя для каждой проблемы. OpenReplay размещается на собственном сервере для полного контроля над вашими данными.
Удачной отладки для современных клиентских команд — начните бесплатно отслеживать свое веб-приложение.
Настройка Dexie.js для работы с IndexedDB
Давайте перейдем к нашему файлу Javascript. Но сначала давайте настроим нашу базу данных IndexedDB, базу данных в браузере, в которой будут храниться все наши задачи.
Примечание. Это не локальное хранилище, а реальная база данных, расположенная в браузере.
Чтобы взаимодействовать с этой базой данных, нам нужно установить Dexie.js
, оболочку для IndexedDB, которая поможет нам с легкостью управлять нашей базой данных. Перейдите в документацию dexie.js и скачайте файл скрипта. Добавьте следующее к тегу заголовка в index.html
.
<script src="https://unpkg.com/dexie/dist/dexie.js"></script>
Затем в файле index.js
мы инициализируем новую базу данных, используя Dexie.js
.
//creating database structure const db = new Dexie("Todo App"); db.version(1).stores({ todos: "++id, todo" }); const form = document.querySelector("#new-task-form"); const input = document.querySelector("#new-task-input"); const list_el = document.querySelector("#tasks"); //add todo form.onsubmit = async (event) => { event.preventDefault(); const todo = input.value; await db.todos.add({ todo }); await getTodos(); form.reset(); }; //display todo const getTodos = async () => { const allTodos = await db.todos.reverse().toArray(); list_el.innerHTML = allTodos .map( (todo) => ` <div class="task"> <div class="content"> <input id="edit" class="text" readonly="readonly" type="text" value= ${todo.todo}> </div> <div class="actions"> <button class="delete" onclick="deleteTodo(event, ${todo.id})">Delete</button> </div> </div> ` ) .join(""); }; window.onload = getTodos; //delete todo const deleteTodo = async (event, id) => { await db.todos.delete(id); await getTodos(); };
В приведенном выше примере кода мы реализовали основные функции, которые должны быть в нашем приложении. Мы можем добавлять, отображать и удалять задачи из нашей базы данных. Теперь, когда у нас есть базовая настройка приложения, пришло время сосредоточиться на том, что заставит наше приложение вести себя как обычное мобильное приложение. Во-первых, мы сделаем наше приложение автономным, что позволит ему работать без подключения к Интернету.
Настройка рабочего ящика
Google workbox — это инструмент, который будет генерировать сервис-воркеры, благодаря которым наше приложение будет работать без подключения к интернету. Во-первых, давайте глобально установим workbox на нашу машину. Бегать:
npm install Workboxcli --global
Затем, чтобы настроить наш рабочий ящик, запустите:
workbox wizard
В консоли вам будет предложено прописать корневой путь вашего приложения. Выберите Ввести путь вручную, затем используйте ./ в качестве корневого пути.
Затем выберите кэшировать все файлы. Кроме того, согласитесь на сохранение сервисного работника и конфигурации и, наконец, выберите «нет» для последнего варианта.
После этого мы увидим, что был создан файл с именем workbox-config.js
. Сразу после этого запустите эту команду, чтобы сгенерировать сервис-воркера.
workbox generateSW workbox-config.js
Теперь добавьте этот код ниже в тег заголовка HTML-файла. Он зарегистрирует сервисного работника при загрузке окна.
<script> // Check that service workers are supported if ("serviceWorker" in navigator) { // Use the window load event to keep the page load performant window.addEventListener("load", () => { navigator.serviceWorker.register("./sw.js"); }); } </script>
Откройте браузер, щелкните правой кнопкой мыши и выберите проверить, а затем перейдите к приложениям и найдите сервис-воркер. Вы увидите, что сервис-воркер уже запущен.
Прежде чем мы продолжим, отправьте свой код в репозиторий GitHub и разместите его. Для этой статьи я использую страницы GitHub.
Делаем приложение устанавливаемым
Для этого нам нужно добавить веб-манифест в наше приложение. Это файл JSON, в котором будут содержаться необходимые сведения о нашем приложении, такие как логотип, название приложения, описание и т. д. Перейдите в корень папки приложения и создайте manifest.json
. Затем добавьте этот код ниже:
{ name: "Todo PWA", short_name: "Todo", icons: [ { src: "./assets/icon-100.png", sizes: "100x100", type: "image/png", }, { src: "./assets/icon-150.png", sizes: "150x150", type: "image/png", }, { src: "./assets/icon-250.png", sizes: "250x250", type: "image/png", }, { src: "./assets/icon-500.png", sizes: "500x500", type: "image/png", }, ], theme_color: "#FFFFFF", background_color: "#FFFFFF", start_url: "/PWA-TodoApp/", display: "standalone", orientation: "portrait", };
Затем добавьте ссылку на файл манифеста в заголовок нашего файла index.html
. Теперь отправьте эти изменения в свой репозиторий.
Тестирование приложения на мобильном устройстве
Наконец, мы завершили наше мобильное приложение, используя только HTML, CSS и Javascript. Идите вперед и посетите размещенный URL-адрес и установите свое приложение на свое мобильное устройство.
Заключение
Поздравляю! сделать это здесь. Вы научились настраивать мобильные приложения, используя свои знания основных веб-технологий и обзор PWA. Вы можете пойти дальше и расширить свои знания, используя другие платформы, которые помогут вам добавить больше возможностей в ваше приложение.
Если у вас есть вопросы, обращайтесь в Твиттер.
Ресурсы
- Код для этого можно найти здесь — GitHub repo
- Официальная документация Dexiejs
- Google Рабочий ящик
- Индексированная БД
Первоначально опубликовано на https://blog.openreplay.com 2 мая 2022 г.