Vanilla front
Автор конспекта: Арина Василевская
Полезные ссылки:
Функционирование frontend-приложения
Схема начала работы фронтенд-приложения может быть представлена следующим образом:

- Пользователь открывает браузер.
- Вводит адрес сайта в адресной строке.
- Браузер через DNS определяет IP-адрес сервера и отправляет HTTP-запрос.
- Сервер по адресу понимает, какой файл нужно вернуть (например,
index.html). - HTML-файл загружается в браузер.
Сервер — это комбинация:
🔵 Компьютер в дата-центре, всегда подключенный к Интернету
🔵 Программное обеспечение, которое обрабатывает запросы
HTML как контейнер приложения
- В классическом сайте HTML содержит много тегов и статическую вёрстку.
- В современном frontend-приложении
index.html— это контейнер, в котором оживает приложение на JavaScript. - Внутри обычно есть:
Этот элемент служит контейнером для всего приложения. Идентификатор может быть любым, но чаще всего
— root, app или main.
Без JavaScript страница выглядит «пустой» — приложение оживает только после загрузки JS-кода.
Декомпозиция приложения
JavaScript-код разделяется на два файла:
- Работа с данными (
data.js) — бизнес-логика, хранение данных. - Работа с отрисовкой (
ui.js) — отвечает за отрисовку и визуализацию данных (UI). Такая декомпозиция помогает отделить логику от представления.
В атрибуте src тега script указываем, откуда загружать скрипт.
Парсинг HTML и DOM
Для браузера index.html — это просто текст. Он парсит(читает) текст скрипта, разбирает его на
теги, атрибуты и превращает их в DOM-дерево. DOM — это древовидная иерархия объектов, которая
описывает структуру документа. JS работает именно с DOM-объектами, а не с «тегами» как строками.
Изменения в DOM автоматически отображаются браузером.
DOM (Document Object Model) — древовидная модель, которая представляет HTML-документ как объект, доступный для чтения и изменения через JavaScript.
Ссылка на статью DOM (doka)
Работа с данными (data.js)
Файл данных обычно содержит:
- Объекты
- Массивы
- Массивы объектов
Это позволяет удобно хранить и обрабатывать информацию (например, список треков).
Файл загружается и выполняется первым.
Работа с UI (ui.js)
- Загружается после
data.js(т.к. подключён вindex.htmlпосле него). - Не хранит данные, а отвечает только за их отрисовку.
- Ищет root-элемент по
id:
- Создаёт новые DOM-элементы. С помощью
forEachпробегаемся по массиву треков и для каждого трека выполняем последовательность действий:
Ссылка на документацию MDN forEach
Практика с Vanilla JS
Пока у нас нет никаких фреймворков, мы работаем с так называемым Vanilla JS.
Vanilla JS — это нативный ("чистый") JavaScript без использования библиотек и фреймворков (например, React или Angular).
Редакторы кода
Для написания кода можно использовать:
- WebStorm — IDE «из коробки» со всеми настройками (автогенерация кода, подсказки, интеграция с фреймворками).
- VS Code или другой редактор — также подойдёт, дело вкуса. Рекомендуем WebStorm начинающим, так как он избавляет от ручных настроек и позволяет сразу сосредоточиться на коде и логике.
Создание html страницы
- Создаем файл
index.html - Чтобы сгенерировать базовую разметку в WebStorm используем комбинацию
! + Tab - Пока убираем
<head> - В
<body>добавляем простую структуру с заголовком и списком.
Запуск страницы в браузере
Два варианта запуска HTML-страницы:
- ❌ Неправильный способ
- Мы можем просто взять файл
index.htmlи перетащить его в браузер. - В этом случае в адресной строке будет:
- Это значит, что браузер прочитал файл прямо с диска (как будто открыл документ Word или PDF).
Такой запуск не имитирует работу настоящего сайта, потому что не запускает локальный сервер и не даёт проверить сетевые запросы.
- ✅ Правильный способ — через сервер. Чтобы страница вела себя как настоящий сайт, нужен программный сервер.
В WebStorm
- Кликаем правой кнопкой →
Run index.html. - WebStorm поднимает встроенный сервер и открывает страницу в браузере.
В VS Code
- Ставим расширение Live Server
- Кликаем правой кнопкой на
index.html → Open with Live Server.
Расширение можно установить с сайта Live Server или через вкладку расширений в VS Code
Теперь страница открывается по HTTP-протоколу с адресом:
Что такое localhost и порт
localhost— особое доменное имя. Браузер понимает его как «обратись к самому себе». То есть запрос не идёт в интернет, а возвращается на этот же компьютер.- Железным сервером в данном случае выступает сам ноутбук/ПК.
- Программным сервером выступает софт (WebStorm, Live Server и т.д.), который слушает определённый порт и отдаёт файлы.
Номер порта нужен, чтобы несколько программ на одном компьютере могли работать с сетью одновременно. Каждая «занимает» свой порт.
Добавляем музыку 🎵 на страницу
- В
<li>вставляем тег<audio> - Тег
<audio>отображается в браузере только если есть атрибутcontrols - В
srcуказываем ссылку на.mp3
Ссылки на треки можно взять здесь 👉 MusicfunApi
🎉 Получается минимальный музыкальный плеер на чистом HTML.
Проверка в DevTools → Network
- Открываем вкладку Network (F12 → Network). Обновляем страницу:

- Загружается наш
index.html. - Подтягиваются встроенные картинки (дефолтные кнопки плеера).
- Запрашиваются музыкальные файлы с сервера (.mp3). При первой подгрузке загружается только превью, а не весь трек. А уже при нажатии play загружается полный трек.
- Устанавливается WebSocket-соединение для автообновления страницы.
- Подгружается фавиконка
Создание frontend-приложения
🤔 Так зачем нам всё-таки делать HTML пустым и оживлять его с помощью JS, если всё работает и без этого?
- Статический HTML — это как написанное «на бумаге»: данные зафиксированы и не меняются.
Но данные в реальности динамичны:
-
могут появляться новые треки, изменяться названия, ссылки;
-
возможны сортировки, фильтры, лайки, подписки и т.п.
-
Если всё «зашить» прямо в HTML, придётся вручную копировать-разметку и править её. Это неудобно и не масштабируется.
Поэтому HTML делают максимально пустым (например, только <div id="root"></div>). Дальше всё
наполняется с помощью JS, который:
- берёт данные (массив объектов треков);
- по алгоритму создаёт
DOM-элементы(заголовки, списки, плееры); - вставляет их на страницу.
Редактируем наш код
- Создаем файл
main.js - Из
index.htmlудаляем все лишнее - Подключаем
main.jsвindex.html
Описываем данные
Создаем массив tracks с объектами треков, которые содержат название трека(title) и ссылку на сам
аудиофайл(url):
Разделение данных и логики отрисовки упрощает поддержку кода (maintainability) — новые треки можно добавлять без изменения алгоритма.
Создание элементов
- Находим наш корневой
<div>поid. Используемdocument.getElementById("root"). - Все новые элементы вставляются внутрь него.
Теперь для каждого трека нам необходимо создать:
li— обёртка для трекаdivс названием трека;audioс атрибутомcontrolsиsrc = track.src
Для обхода массива с данными воспользуемся методом массива forEach:
🚀 Вот и готово первое frontend-приложение!
Важные архитектурные идеи
- разделение данных и рендеринга: данные → массив объектов, рендеринг → алгоритм отрисовки;
- добавление новых треков не требует менять логику.
- DOM-дерево динамическое: изначально пустое, браузер наполняет его из JS.
- Алгоритм универсален: работает одинаково для любого количества данных.
Недостатки нативного подхода
- Код быстро становится громоздким:
- множество
createElement,append, вложенностей; - сложно читать структуру;
- при условной отрисовке появляются
if/else, усложняющие код. - Вёрстка современных приложений слишком сложная, чтобы делать всё руками.
Тут на помощь приходят фреймворки (React, Vue, Angular) со своими преимуществами:
- упрощают работу с DOM (не нужно вручную создавать и вкладывать элементы);
- автоматически обновляют интерфейс при изменении данных;
- позволяют сосредоточиться на данных и бизнес-логике, а не на работе с DOM.
❗Нативный JS не теряет свою важность! Чтобы быть профессионалами своего дела мы должны:
- понимать, что делает фреймворк «под капотом».
- оценивать «стоимость» операций в DOM.
- уметь дебажить проблемы производительности.
🏠 Домашнее задание
Создание списка дел
- Цель задания
Применить полученные знания о работе с DOM для создания интерактивного списка дел (Trelly).
- Задача
На основе изученного примера с музыкальным плеером создать веб-страницу со списком дел, где каждая задача имеет название и статус выполнения.
Требования
Структура данных
Создайте массив объектов tasks с задачами, где каждый объект содержит:
title(string) - название задачиisDone(boolean) - статус выполнения (true/false)
Пример данных
HTML-структура
Создайте следующую структуру:
- Заголовок - элемент
h1с текстом "Список дел" - Список задач - элемент
ulсо списком всех задач - Каждая задача должна быть элементом
li, содержащим:
divс названием задачиinputтипаcheckboxдля отображения статуса выполнения
Технические детали
Обязательные элементы и свойства:
- Получите корневой элемент через
document.getElementById('root') - Создавайте элементы через
document.createElement() - Добавляйте текст через метод
.append() - Устанавливайте тип чекбокса:
taskStatusEL.type = 'checkbox' - Устанавливайте состояние чекбокса:
taskStatusEL.checked = task.isDone
Алгоритм выполнения:
- Создайте и добавьте заголовок
- Создайте контейнер для списка задач (
ul) - Переберите массив задач через
forEach - Для каждой задачи создайте:
- Элемент списка (
li) - Div с названием задачи
- Чекбокс с соответствующим состоянием
- Соберите все элементы в правильной иерархии
Ожидаемый результат
После выполнения задания на странице должен отобразиться список из трёх дел:
- "Купить продукты на неделю" (не выполнено)
- "Полить цветы" (выполнено - чекбокс отмечен)
- "Сходить на тренировку" (не выполнено)

Что делать если что-то пошло не так
Если в процессе прохождения домашнего задания возникнут сложности переходи в комнату help2debug, где ты сможешь получить поддержку со стороны других участников сообщества.
Дополнительно (по желанию)
Попробуйте добавить больше задач в массив или поэкспериментируйте со стилизацией через CSS.


