Итак, вы увидели заголовок и задаетесь вопросом, как можно создать реальное мобильное приложение, просто используя знания основных веб-технологий без необходимости изучать разработку для Android или IOS? Это стало возможным благодаря преобразованию ваших обычных веб-приложений в стандартное мобильное приложение, которое можно установить на нескольких платформах. Сделав это, мы получим тип приложения, который называется Progressive Web Apps (PWA).

В этой статье мы узнаем, как использовать возможности HTML, CSS и Javascript для создания простого мобильного приложения. Мы не будем использовать такие фреймворки, как Ionic или React Native. Это связано с тем, что в этом руководстве основное внимание уделяется демонстрации того, как можно заставить базовое веб-приложение чувствовать себя и вести себя как родное мобильное приложение, которое можно установить и запустить на мобильных устройствах, используя самый простой метод с наименьшей абстракцией.

Чтобы продолжить, давайте кратко познакомимся с PWA.

Что такое прогрессивные веб-приложения?

Согласно официальным веб-документам MDN:

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

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

Есть три ключевых компонента PWA;

  1. Service Worker: Service Worker преобразует веб-сайт в приложение, позволяя ему загружать и кэшировать файлы на устройстве.
  2. Веб-манифест. Этот файл JSON содержит основную метаинформацию о приложении, такую ​​как значок приложения, цвет фона и т. д.
  3. Безопасный 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. Вы можете пойти дальше и расширить свои знания, используя другие платформы, которые помогут вам добавить больше возможностей в ваше приложение.

Если у вас есть вопросы, обращайтесь в Твиттер.

Ресурсы

Первоначально опубликовано на https://blog.openreplay.com 2 мая 2022 г.