Опубликовано

Изучаем паттерны проектирования JavaScript: руководство для разработчиков JavaScript и React, 2-е издание

Изучаем паттерны проектирования JavaScript: руководство для разработчиков JavaScript и React

Основополагающая книга по паттернам архитектуры и проектирования приложений на языке JavaScript. Рассмотрены порождающие, поведенческие, структурные паттерны, модули, примеси, наблюдатели и медиаторы, применяемые в веб-разработке, архитектурные подходы MVC, MVP и MVVM, островная архитектура веб-приложений, серверные паттерны, в частности паттерны рендеринга, а также специфические темы и паттерны, важные при работе в React — де-факто главном фреймворке для клиентской веб-разработки на JavaScript.

Для веб-разработчиков

Руководство для разработчиков JavaScript и React

Желаете писать красивый, хорошо структурированный и удобный в поддержке код JavaScript, применяя все современные паттерны проектирования? Хотите, чтобы код получался чистым, эффективным и легко управлялся? Держите руку на пульсе непрерывно обновляющихся лучших практик? В таком случае вам идеально подойдёт обновлённое второе издание данной книги.

В ней подробно разобрано, как применять в JavaScript и React современные паттерны проектирования, а также модули, примеси, наблюдатели и медиаторы. Вы узнаете о паттернах, действующих на стороне сервера, в частности о способах рендеринга, изучите островную архитектуру. Также подробно исследованы известные архитектурные паттерны (MVC, MVP и MVVM) с точки зрения разработчика современных веб-приложений.

Кроме того, вы исследуете современный синтаксис JavaScript, а также специфические паттерны React — в частности хуки, компоненты высшего порядка (HOC) и многие другие, что поможет успевать за вечно изменчивым миром веб-разработки.

В этой книге:

  • Архитектурные паттерны для структурирования компонентов и приложений
  • Более 20 паттернов проектирования, применимых в JavaScript и React, которые полезны разработчику независимо от его опыта
  • Различные категории классических паттернов проектирования, в том числе порождающие, структурные и поведенческие
  • Важнейшие приемы повышения производительности, в том числе динамический импорт и разделение кода
  • Паттерны рендеринга, в том числе рендеринг на стороне сервера, гидратация, островная архитектура и многие другие приёмы

Книгу “Изучаем паттерны проектирования JavaScript: руководство для разработчиков JavaScript и React, 2-е издание можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 13

Структура книги………………………………………………………………………………………………………………………… 14

Условные обозначения, используемые в этой книге………………………………………………………………. 15

Использование примеров кода…………………………………………………………………………………………………. 16

Онлайн-обучение O’Reilly…………………………………………………………………………………………………………. 16

Как с нами связаться………………………………………………………………………………………………………………….. 17

Благодарности…………………………………………………………………………………………………………………………… 17

Глава 1. Введение в паттерны проектирования……………………………………… 19

История создания паттернов проектирования………………………………………………………………………… 20

Что такое паттерн?…………………………………………………………………………………………………………………….. 21

Обычный вариант использования паттернов проектирования……………………………………………… 22

Итог……………………………………………………………………………………………………………………………………………… 23

Глава 2. Тестирование паттернов, протопаттерны и правило трех…………. 24

Что такое протопаттерны?……………………………………………………………………………………………………….. 24

“Паттерные” тесты…………………………………………………………………………………………………………………….. 24

Правило трех……………………………………………………………………………………………………………………………… 26

Итог……………………………………………………………………………………………………………………………………………… 26

Глава 3. Структурирование и написание паттернов………………………………. 27

Структура паттерна проектирования……………………………………………………………………………………… 27

Хорошо написанные паттерны………………………………………………………………………………………………… 28

Написание паттерна………………………………………………………………………………………………………………….. 29

Итог……………………………………………………………………………………………………………………………………………… 30

Глава 4. Антипаттерны………………………………………………………………………….. 31

Что такое антипаттерны?………………………………………………………………………………………………………….. 31

Антипаттерны в JavaScript………………………………………………………………………………………………………… 32

Итог……………………………………………………………………………………………………………………………………………… 33

Глава 5. Современный синтаксис и функции JavaScript………………………… 34

Важность разделения приложений………………………………………………………………………………………….. 34

Модули с импортом и экспортом……………………………………………………………………………………………… 35

Объекты модуля…………………………………………………………………………………………………………………………. 37

Модули, загружаемые из удаленных источников………………………………………………………………….. 37

Статический импорт………………………………………………………………………………………………………………….. 38

Динамический импорт……………………………………………………………………………………………………………….. 38

Импорт при взаимодействии…………………………………………………………………………………………………….. 39

Импорт при видимости………………………………………………………………………………………………………………. 39

Модули для сервера………………………………………………………………………………………………………………….. 39

Преимущества использования модулей…………………………………………………………………………………… 40

Классы с конструкторами, геттерами и сеттерами………………………………………………………………… 41

Классы в JavaScript Frameworks……………………………………………………………………………………………….. 43

Итог……………………………………………………………………………………………………………………………………………… 44

Дополнительные материалы…………………………………………………………………………………………………….. 44

Глава 6. Категории паттернов проектирования……………………………………… 45

Предпосылки создания паттернов проектирования……………………………………………………………….. 45

Порождающие паттерны проектирования………………………………………………………………………………. 46

Структурные паттерны проектирования…………………………………………………………………………………. 46

Поведенческие паттерны проектирования………………………………………………………………………………. 46

Классы паттернов проектирования…………………………………………………………………………………………. 46

Итог……………………………………………………………………………………………………………………………………………… 48

Глава 7. Паттерны проектирования JavaScript………………………………………. 49

Порождающие паттерны…………………………………………………………………………………………………………… 49

Паттерн Конструктор………………………………………………………………………………………………………………… 50

Создание объекта…………………………………………………………………………………………………………………. 50

Базовые паттерны Конструктор…………………………………………………………………………………………. 52

Конструкторы с Прототипами……………………………………………………………………………………………. 53

Паттерны Модуль……………………………………………………………………………………………………………………… 53

Объектные литералы……………………………………………………………………………………………………………. 54

Паттерн Модуль…………………………………………………………………………………………………………………… 55

Приватность………………………………………………………………………………………………………………. 55

История………………………………………………………………………………………………………………………. 56

Примеры…………………………………………………………………………………………………………………….. 56

Варианты паттерна Модуль……………………………………………………………………………………………….. 59

Импорт примесей………………………………………………………………………………………………………. 59

Экспорт………………………………………………………………………………………………………………………. 60

Преимущества паттерна Модуль……………………………………………………………………………………….. 60

Недостатки……………………………………………………………………………………………………………………………. 61

Паттерн Модуль с WeakMap……………………………………………………………………………………………….. 61

Модули с современными библиотеками……………………………………………………………………………. 64

Паттерн Раскрывающийся модуль…………………………………………………………………………………………… 64

Преимущества паттерна Раскрывающийся модуль………………………………………………………….. 66

Недостатки паттерна…………………………………………………………………………………………………………… 66

Паттерн Одиночка……………………………………………………………………………………………………………………… 66

Управление состоянием в React………………………………………………………………………………………….. 70

Паттерн Прототип……………………………………………………………………………………………………………………… 71

Паттерн Фабрика……………………………………………………………………………………………………………………….. 74

Когда использовать паттерн Фабрика……………………………………………………………………………….. 76

Когда не следует применять паттерн Фабрика…………………………………………………………………. 77

Абстрактные фабрики………………………………………………………………………………………………………….. 77

Структурные паттерны……………………………………………………………………………………………………………… 78

Паттерн Фасад…………………………………………………………………………………………………………………………… 78

Паттерн Примесь……………………………………………………………………………………………………………………….. 81

Подклассы………………………………………………………………………………………………………………………………….. 81

Примеси………………………………………………………………………………………………………………………………………. 82

Преимущества и недостатки примесей………………………………………………………………………………. 85

Паттерн Декоратор……………………………………………………………………………………………………………………. 85

Псевдоклассические декораторы…………………………………………………………………………………………….. 89

Интерфейсы…………………………………………………………………………………………………………………………… 89

Абстрактные Декораторы…………………………………………………………………………………………………… 90

Преимущества и недостатки Декоратора………………………………………………………………………….. 93

Приспособленец…………………………………………………………………………………………………………………………. 94

Использование Приспособленцев………………………………………………………………………………………. 95

Приспособленцы и обмен данными……………………………………………………………………………………. 95

Реализация классических приспособленцев……………………………………………………………………… 95

Проявление “реализаций”………………………………………………………………………………………… 96

Преобразование кода для использования паттерна Приспособленец……………………………. 98

Простая Фабрика……………………………………………………………………………………………………………….. 100

Управление внешними состояниями………………………………………………………………………………… 101

Паттерн Приспособленец и DOM……………………………………………………………………………………… 102

Пример: централизованная обработка событий…………………………………………………………….. 103

Поведенческие паттерны………………………………………………………………………………………………………… 104

Паттерн Наблюдатель…………………………………………………………………………………………………………….. 105

Разница между паттернами Наблюдатель и Издатель/Подписчик………………………………. 109

Преимущества паттернов Наблюдатель и Издатель/Подписчик………………………………….. 111

Недостатки паттернов Наблюдатель, Издатель/Подписчик…………………………………………. 111

Реализация Издателя/Подписчика……………………………………………………………………………………. 112

Пример реализации Издателя/Подписчика………………………………………………………….. 112

Использование нашей реализации………………………………………………………………………… 113

Уведомления пользовательского интерфейса (UI)………………………………………………. 114

Разделение приложений с помощью реализации Pub/Sub Бена Алмана…………… 115

Разделение приложения jQuery на основе Ajax…………………………………………………… 117

Паттерн Наблюдатель в экосистеме React…………………………………………………………… 120

Паттерн Посредник………………………………………………………………………………………………………………….. 120

Простой Посредник……………………………………………………………………………………………………………. 122

Сходства и различия………………………………………………………………………………………………………….. 123

События…………………………………………………………………………………………………………………… 123

Сторонние объекты………………………………………………………………………………………………… 123

Выбор паттерна: когда какой использовать………………………………………………………… 124

Использование агрегатора событий………………………………………………………………………………… 124

Использование Посредника………………………………………………………………………………………………. 125

Агрегатор событий (Pub/Sub) и посредник, работающие вместе………………………………….. 125

Медиатор/промежуточное ПО в современном JavaScript………………………………………………. 126

Сравнение паттернов Медиатор и Фасад……………………………………………………………………….. 127

Паттерн Команда…………………………………………………………………………………………………………………….. 127

Итог…………………………………………………………………………………………………………………………………………… 129

Глава 8. Паттерны JavaScript MV*………………………………………………………. 130

MVC………………………………………………………………………………………………………………………………………….. 130

MVC из Smalltalk-80…………………………………………………………………………………………………………… 130

MVC для разработчиков JavaScript……………………………………………………………………………………….. 131

Модели………………………………………………………………………………………………………………………………… 132

Представления……………………………………………………………………………………………………………………. 133

Шаблонизация……………………………………………………………………………………………………………………. 135

Контроллеры………………………………………………………………………………………………………………………. 137

Что дает нам MVC?…………………………………………………………………………………………………………………. 137

MVC из Smalltalk-80 на JavaScript…………………………………………………………………………………………. 138

Кратко о MVC………………………………………………………………………………………………………………………….. 138

MVP…………………………………………………………………………………………………………………………………………… 139

Модели, Представления и Presenter’ы………………………………………………………………………………. 139

MVP или MVC?…………………………………………………………………………………………………………………… 140

MVVM………………………………………………………………………………………………………………………………………. 141

История MVVM………………………………………………………………………………………………………………….. 141

Модель………………………………………………………………………………………………………………………………… 142

Представление……………………………………………………………………………………………………………………. 143

ПредставлениеМодель………………………………………………………………………………………………………. 143

Коротко об элементах Представление и ПредставлениеМодель………………………………….. 144

Сравнение компонента ПредставлениеМодель с Моделью………………………………………….. 144

Плюсы и минусы MVVM…………………………………………………………………………………………………………. 144

Преимущества MVVM……………………………………………………………………………………………………….. 144

Недостатки MVVM……………………………………………………………………………………………………………. 145

MVC, MVP или MVVM?………………………………………………………………………………………………………….. 145

Современные паттерны семейства MV*……………………………………………………………………………….. 146

МV* и React.js…………………………………………………………………………………………………………………….. 146

Итог…………………………………………………………………………………………………………………………………………… 147

Глава 9. Паттерны асинхронного программирования………………………….. 148

Асинхронное программирование…………………………………………………………………………………………… 148

Предпосылки……………………………………………………………………………………………………………………………. 150

Паттерны с использованием промисов………………………………………………………………………………….. 151

Сцепление промисов………………………………………………………………………………………………………….. 152

Обработка ошибок с использованием промисов…………………………………………………………….. 152

Промисы и параллелизм……………………………………………………………………………………………………. 153

Последовательное выполнение промисов……………………………………………………………………….. 153

Мемоизация промисов……………………………………………………………………………………………………….. 153

Конвейер промисов……………………………………………………………………………………………………………. 154

Повторное выполнение промисов…………………………………………………………………………………….. 154

Декоратор для промисов…………………………………………………………………………………………………… 155

Гонка промисов………………………………………………………………………………………………………………….. 155

Паттерны async/await……………………………………………………………………………………………………………… 155

Объединение функций async……………………………………………………………………………………………… 156

Итерация async…………………………………………………………………………………………………………………… 156

Обработка ошибок с использованием async……………………………………………………………………. 157

async и параллелизм………………………………………………………………………………………………………….. 157

Последовательное выполнение async………………………………………………………………………………. 157

Мемоизация async………………………………………………………………………………………………………………. 158

Обработка событий с использованием async………………………………………………………………….. 158

Конвейер async/await…………………………………………………………………………………………………………. 158

Повторное выполнение async……………………………………………………………………………………………. 159

Декоратор для async/await………………………………………………………………………………………………… 159

Еще несколько практических примеров………………………………………………………………………………… 159

Отправка HTTP-запроса……………………………………………………………………………………………………. 160

Чтение файла из файловой системы…………………………………………………………………………………. 160

Запись в файл, находящийся в файловой системе…………………………………………………………… 160

Выполнение нескольких операций async…………………………………………………………………………. 160

Последовательное выполнение нескольких операций async…………………………………………. 161

Кеширование результата операции async……………………………………………………………………….. 161

Обработка событий с помощью async/await…………………………………………………………………… 161

Повторное выполнение операции async при сбое…………………………………………………………… 161

Создание декоратора для async/await……………………………………………………………………………… 162

Итоги…………………………………………………………………………………………………………………………………………. 163

Глава 10. Модульные паттерны разработки в JavaScript……………………… 164

Примечание о загрузчиках скриптов……………………………………………………………………………………… 164

Формат AMD……………………………………………………………………………………………………………………………. 164

Начало работы с Модулями…………………………………………………………………………………………….. 165

Модули AMD с jQuery……………………………………………………………………………………………………….. 169

Регистрация jQuery в качестве async-совместимого модуля……………………………….. 169

Почему AMD лучше всего подходит для написания модульного кода на JavaScript?         170

Что еще почитать об AMD……………………………………………………………………………………… 170

Загрузчики скриптов и фреймворки, поддерживающие AMD…………………………….. 171

Формат AMD: итоги…………………………………………………………………………………………………………… 171

CommonJS………………………………………………………………………………………………………………………………… 171

Начало работы с CommonJS……………………………………………………………………………………………. 172

Потребление нескольких зависимостей…………………………………………………………………………… 173

CommonJS в Node.js…………………………………………………………………………………………………………… 173

Подходит ли CommonJS для работы с браузером?………………………………………………………… 174

Что еще почитать о CommonJS………………………………………………………………………………………… 175

AMD и CommonJS: разные, но равные стандарты………………………………………………………………. 175

UMD: формат подключаемых модулей, совместимый с AMD и CommonJS………………… 175

Использование CommonJS, AMD или глобальных параметров браузера для создания модуля      176

Подключаемые модули jQuery, которые работают во всех средах…………………… 177

Что почитать об UMD и AMD………………………………………………………………………………… 180

Итоги…………………………………………………………………………………………………………………………………………. 180

Глава 11. Паттерны пространства имен……………………………………………….. 181

Главное об организации пространств имен………………………………………………………………………….. 181

Одиночные глобальные переменные……………………………………………………………………………………… 182

Пространство имен с префиксом……………………………………………………………………………………………. 182

Литеральная нотация объекта……………………………………………………………………………………………….. 183

Вложенное пространство имен………………………………………………………………………………………………. 186

Выражения с немедленно вызываемой функцией…………………………………………………………………. 187

Внедрение пространства имен……………………………………………………………………………………………….. 189

Более сложные паттерны для организации пространства имен…………………………………………. 191

Автоматизация вложенного пространства имен…………………………………………………………….. 191

Паттерн объявления зависимостей…………………………………………………………………………………… 193

Глубокое расширение объекта…………………………………………………………………………………………. 194

Рекомендации…………………………………………………………………………………………………………………………… 196

Итоги…………………………………………………………………………………………………………………………………………. 196

Глава 12. Паттерны разработки React.js………………………………………………. 197

React: введение………………………………………………………………………………………………………………………… 197

Используемая терминология…………………………………………………………………………………………….. 198

Основные понятия………………………………………………………………………………………………………………. 198

Компоненты более высокого порядка……………………………………………………………………………………. 200

Объединение……………………………………………………………………………………………………………………….. 203

Преимущества паттерна HOC…………………………………………………………………………………………… 203

Недостатки HOC………………………………………………………………………………………………………………… 203

Рендер-пропсы…………………………………………………………………………………………………………………………. 204

Подъем состояния………………………………………………………………………………………………………………. 206

Дочерние элементы в качестве функции………………………………………………………………………….. 208

Преимущества рендер-пропсов………………………………………………………………………………………… 209

Недостатки рендер-пропсов……………………………………………………………………………………………… 209

Паттерн Хуки……………………………………………………………………………………………………………………………. 209

Компоненты классов………………………………………………………………………………………………………….. 210

Реструктуризация………………………………………………………………………………………………………………. 211

Сложность…………………………………………………………………………………………………………………………… 212

Хуки…………………………………………………………………………………………………………………………………….. 212

Хук useState………………………………………………………………………………………………………………………………. 212

Хук useEffect……………………………………………………………………………………………………………………….. 214

Пользовательские Хуки……………………………………………………………………………………………………… 214

Дополнительные рекомендации по использованию Хуков……………………………………………. 216

Преимущества и недостатки Хуков………………………………………………………………………………….. 217

Сравнение Хуков React с классами………………………………………………………………………………….. 219

Статический импорт………………………………………………………………………………………………………………… 220

Динамический импорт…………………………………………………………………………………………………………….. 221

Загружаемые компоненты…………………………………………………………………………………………………. 222

Импорт при взаимодействии……………………………………………………………………………………………… 224

Импорт при появлении в поле видимости………………………………………………………………………… 224

Расщепление кода……………………………………………………………………………………………………………………. 225

Расщепление кода на основе маршрутов………………………………………………………………………… 225

Расщепление кода на основе бандлов……………………………………………………………………………… 226

Паттерн PRPL…………………………………………………………………………………………………………………………… 227

Определение приоритетов загрузки……………………………………………………………………………………….. 230

Предварительная загрузка в одностраничных приложениях………………………………………… 231

Хитрость: предварительная загрузка + async………………………………………………………………….. 232

Предварительная загрузка в Chrome 95+………………………………………………………………………… 232

Виртуализация списков…………………………………………………………………………………………………………… 232

Как работает организация окон/виртуализация?…………………………………………………………… 233

Списки…………………………………………………………………………………………………………………………………. 233

Сетка……………………………………………………………………………………………………………………………………. 235

Улучшения в веб-платформе…………………………………………………………………………………………….. 236

Выводы……………………………………………………………………………………………………………………………………… 236

Итоги…………………………………………………………………………………………………………………………………………. 236

Глава 13. Паттерны рендеринга…………………………………………………………… 237

Паттерны рендеринга — это важно……………………………………………………………………………………….. 238

Рендеринг на стороне клиента (CSR)…………………………………………………………………………………….. 240

Рендеринг на стороне сервера (SSR)……………………………………………………………………………………… 240

Статический рендеринг…………………………………………………………………………………………………………… 241

Инкрементная статическая регенерация (ISR)………………………………………………………………… 243

ISR по требованию…………………………………………………………………………………………………………….. 243

Статический рендеринг: заключение……………………………………………………………………………….. 244

Потоковый SSR………………………………………………………………………………………………………………………… 244

Пограничный SSR……………………………………………………………………………………………………………………. 245

Гибридный рендеринг……………………………………………………………………………………………………………… 246

Постепенная гидратация…………………………………………………………………………………………………………. 246

“Островная” архитектура……………………………………………………………………………………………………….. 247

Реализация островов………………………………………………………………………………………………………….. 248

Преимущества и недостатки островной архитектуры……………………………………………………. 249

React Server Components…………………………………………………………………………………………………………. 250

Гибридный рендеринг с RSC и Маршрутизатор приложений Next.js…………………………… 251

Итоги…………………………………………………………………………………………………………………………………………. 251

Глава 14. Структура приложения для React.js………………………………………. 254

Введение…………………………………………………………………………………………………………………………………… 254

Группировка по модулям, функциям или маршрутам……………………………………………………. 254

Группировка по типу файла……………………………………………………………………………………………… 255

Гибридная группировка на основе домена и общих компонентов……………………………….. 256

Структура приложения для современных функций React…………………………………………………… 257

Redux…………………………………………………………………………………………………………………………………… 258

Контейнеры………………………………………………………………………………………………………………………… 258

Хуки…………………………………………………………………………………………………………………………………….. 258

Стилизованные компоненты……………………………………………………………………………………………… 259

Другие рекомендации……………………………………………………………………………………………………………… 259

Структура для приложений Next.js………………………………………………………………………………………… 261

Итог…………………………………………………………………………………………………………………………………………… 262

Глава 15. Выводы………………………………………………………………………………… 263

Предметный указатель…………………………………………………………………………. 265

Об авторе……………………………………………………………………………………………… 269

Об изображении на обложке………………………………………………………………… 270

Османи Эдди

Эдди Османи – ведущий инженер компании Google, руководитель разработчиков браузера Chrome.

Добавить комментарий