Самоучитель: динамические веб-приложения
Глава 13 из 18VI. Браузер как приложение100 минут

Глава 13. JavaScript-модули, DOM и локальное состояние

Модуль получает зависимости через import, владеет небольшим состоянием и обновляет только тот участок DOM, контракт которого он понимает.

После главы вы сможете
  • разделить модули
  • связать событие с командой
  • не сделать DOM скрытой базой данных

Модуль — это граница имён

script type=module включает строгий режим, отдельную область видимости и явные import/export. Зависимости перестают зависеть от порядка множества script-тегов. Относительные URL модулей разрешаются от файла, поэтому приложение нужно проверять через HTTP-сервер, а не file://.

Экспортируйте небольшой публичный API. Модуль, который отдаёт все внутренние функции и изменяемые объекты, лишь переносит глобальное пространство имён в другой файл.

Событие превращается в намерение

Обработчик DOM извлекает минимальные данные и вызывает функцию сценария интерфейса. Не передавайте Event через все слои. Используйте event delegation для повторяющихся элементов, но проверяйте ближайшую допустимую цель через closest и границу контейнера.

Кнопка должна оставаться button, а ссылка — link. JavaScript не исправляет неверную семантику исходного документа.

Три вида состояния

Состояние браузераDOM отображает модель, но не становится надёжным долговечным источником предметных данных.Server HTMLначалоModelданныеDOMпроекцияStorageлокально
DOM отображает модель, но не становится надёжным долговечным источником предметных данных.

Чистое обновление

Функция reducer получает предыдущее состояние и событие и возвращает новое значение без скрытой записи. Даже без библиотеки это упрощает тестирование фильтров, пагинации и optimistic UI. DOM-renderer получает готовую модель представления и меняет конкретный контейнер.

Не сериализуйте в localStorage пароль, session id или данные, которым нужна серверная авторизация. LocalStorage подходит для несекретных предпочтений и черновиков, если пользователь понимает срок жизни и может их очистить.

Ошибки и отмена

Асинхронное действие имеет состояния idle, pending, success и error. Повторный запрос поиска отменяйте через AbortController или маркируйте последовательностью, чтобы старый ответ не перезаписал новый. Кнопка блокируется только на время конкретной команды и возвращается в доступное состояние в finally.

Ошибка сети не равна HTTP 500: fetch отклоняется при сетевом сбое, но ответ 404 или 500 нужно проверить через response.ok.

Нужен ли React

Компонентный фреймворк оправдан, когда интерфейс содержит много взаимозависимого состояния, повторяемые компоненты и отдельную команду фронтенда. Для серверного каталога с несколькими фильтрами native modules и progressive enhancement часто уменьшают сборку и поверхность обновлений.

Решение принимают по сложности состояния и жизненному циклу продукта, а не потому, что тема присутствует в учебной книге.

Практика главы

Разделите фильтр задач на state.js, api.js и view.js. Реализуйте обычную HTML-форму, затем перехват submit, отмену прошлого запроса и восстановление URL через history.replaceState.

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

Проверка актуальности

  • developer.mozilla.orghttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/ModulesПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie