📦 Сделал
Разбил словарь переводов на модули. Был один файл почти на 3000 строк — весь i18n проекта в одной куче, en и ru вперемешку по всем экранам. Разнёс на 42 модуля по неймспейсам:
auth, tables, spaces, kanban, settings — каждая фича держит свой кусок словаря рядом с собой.Каждый модуль экспортит
{ en, ru } одним объектом — оба языка живут вместе, не в двух параллельных файлах, которые вечно расходятся. На сборке они статически собираются в один словарь, из которого рантайм-резолвер достаёт ключ по t('tables.addRow'). Рантайм не поменялся ни на байт — те же ключи, тот же лукап. Поменялась только форма исходника.Прогнал
tsc — чисто, нулевая остаточная кириллика в коде. Это Phase 0 под большую задачу: дальше можно резать словарь по роутам и не тащить в бандл переводы экранов, которые юзер сейчас не открыл.🔍 Что нашли
Про то, зачем вообще пилить монолит на модули. Наивно — оставить один блоб: он грузится целиком,
t() резолвит из него любой ключ, всё работает. Цена всплывает в двух местах. Первое — мерж: один файл на 3000 строк, и любые две правки в разных фичах дерутся за одни и те же строки, конфликт на каждый коммит. Второе — бандл: тащишь весь словарь всех экранов, даже если открыт один.Тяжёлый вариант — взять i18n-фреймворк с бэкенд-лоадером: лишний фетч, лишняя точка отказа. Вместо этого — обычные ES-модули по неймспейсам, статически композятся в один объект. Ноль рантайм-цены сегодня, tree-shaking и code-splitting по роутам — на потом. Просто перестал держать всё в одном файле — и мерж-конфликты испарились сами.
Спасибо что читаете. До завтра.
━━ Конец дня 245 ━━