Что такое паттерн проектирования синглтон
Что проверяют
Понимаете ли вы, что во фронтенде синглтон чаще получается сам собой, потому что модуль исполняется один раз и результат кэшируется. Дальше смотрят на зрелость: видите ли вы в нём скрытую глобальную зависимость, которая мешает тестам и опасна при серверном рендеринге.
Как отвечать
Определение короткое: ровно один экземпляр и общая точка доступа к нему. В JavaScript честный способ это модуль.
// analytics.js
const queue = [];
export const analytics = {
track(event) { queue.push(event); },
flush() { return queue.splice(0); },
};Классовый вариант со статическим полем и возвратом уже созданного экземпляра из конструктора тоже рабочий, но приватного конструктора в языке нет, так что запретить new нельзя, можно лишь вернуть тот же объект.
Уместные применения: кэш, шина событий, клиент над сетевым слоем, конфигурация, собранная один раз при старте.
Обязательно скажите про серверный рендеринг. На сервере модуль живёт дольше одного запроса и общий для всех посетителей, поэтому положить в синглтон данные пользователя значит однажды показать их чужому человеку. Всё, что зависит от запроса, передаётся параметрами, а синглтон хранит только то, что для всех одинаково.
Где спотыкаются
Пересказывают ответ из мира Java с потокобезопасностью и двойной проверкой блокировки. В браузере поток один, а веб-воркер это отдельное окружение со своей копией модулей, так что единственность экземпляра там всё равно не выполняется и общее состояние строится на сообщениях.
Уверены, что модуль гарантированно один. Две версии пакета в дереве зависимостей, отдельная сборка виджета, горячая замена модулей в разработке дают два экземпляра, а вместе с ними два независимых кэша и трудноуловимые расхождения.
Прячут за синглтоном изменяемое состояние приложения. Поменять его может любой файл, порядок импортов начинает влиять на результат, а тесты перестают быть независимыми: один прогон оставляет данные следующему. Лечится явной передачей зависимости или фабрикой, создающей экземпляр на запрос.