Контекст
Singleton — один общий экземпляр в заданной области видимости и одна точка доступа к нему.
В JS экспорт ES-модуля часто даёт это «бесплатно»: модуль вычисляется один раз на graph/realm.
Важная оговорка
Это не «один на всю вселенную»: workers, iframes, процессы сервера, дубликаты пакета, отдельные бандлы — у каждого может быть свой экземпляр.
export const metrics = {
counters: new Map(),
inc(name) {
this.counters.set(name, (this.counters.get(name) ?? 0) + 1);
},
};
Когда уместен / когда вреден
Уместен: metrics registry, пул соединений на процесс.
Вреден: request/user state; скрытые глобалы усложняют тесты и cleanup. Часто яснее dependency injection.
Итог: singleton = общий инстанс в scope; в JS часто = модуль. Не храни в нём пользовательское состояние.