План M1–M5 завершён и опубликован. Текущая поддерживаемая версия приложения — v23.8.0.
Документ сохраняется как запись принятого архитектурного решения и границ выполненной миграции. Новые этапы не должны продолжать нумерацию M1–M5 без отдельного утверждённого плана.
uDream остаётся статическим приложением на JavaScript, GitHub Pages и PWA.
Используются нативные ES Modules, JSDoc и // @ts-check. TypeScript, фреймворк, bundler, сервер и runtime-зависимости не вводятся. package.json нужен для версии приложения и запуска встроенного Node.js test runner и не участвует в браузерной сборке.
- уменьшить связанность монолитного
script.js; - защитить поиск, историю, настройки, представление и PWA регрессионными тестами;
- сохранить работающее поведение и внешний вид;
- не затрагивать активную базу и сохранённые версии;
- оставить сайт запускаемым напрямую с GitHub Pages без build-шага.
- чистая логика поиска и автодополнения выделена в
src/search.js; - сохранена и затем уточнена семантика строгих режимов поиска и релевантности;
- добавлены тесты режимов
symbol,aliases,desc,tags,all; - основной скрипт подключён как ES module;
- модуль включён в PWA-кеш.
- загрузка и fallback JSON выделены в
src/data.js; - ручной JSON-файл разбирается той же проверяемой функцией;
- начальные значения и чтение сохранённых настроек выделены в
src/state.js; - формат и содержимое активной базы не изменялись.
- история переходов, окно хлебных крошек и группировка полной истории выделены в
src/history.js; - чтение и запись строк, переключателей и JSON в
localStorageвыделены вsrc/storage.js; - повреждённая сохранённая история безопасно заменяется пустой и больше не блокирует запуск;
- добавлены тесты навигации, сериализации и восстановления настроек.
- словарь, нормализация языка и справка выделены в
src/i18n.js; - построение карточки, списков, истории, тегов, статистики и материалов для системного sharing выделено в
src/presentation.js; - текущие классы и структура интерактивных элементов сохранены, чтобы не менять визуальное поведение;
- добавлены проверки локализации, HTML-экранирования и враждебного вручную загруженного JSON.
Первоначальный план предполагал только перенос представления. Предварительный аудит показал, что прежний escapeHtml не экранировал кавычки в data-* атрибутах, а Marked разрешал HTML из заметок вручную загруженного JSON. Активная база содержит 4 086 непустых однострочных заметок без используемой Markdown-разметки и raw HTML, поэтому M4 безопасно заменил их вывод на экранированный plain text с абзацами и переносами строк и удалил Marked. Это намеренное усиление границы импортируемых данных без изменения активного контента.
- регистрация Service Worker выделена в
src/pwa.jsи покрыта тестами; - встроенный CSS оставлен в
index.html, поскольку отдельное разделение не требовалось для цели M5; - установка PWA и offline reload подтверждены на Android без локального сервера и интернета;
- последующий релиз
v23.8.0расширил модуль обновлением версии, немедленной активацией Service Worker и установочным баннером.
После M1–M5 отдельно тестируются:
- поиск;
- загрузка данных;
- начальное состояние;
- история;
- localStorage;
- локализация;
- безопасное представление;
- PWA-регистрация и обновление.
script.js остаётся оркестратором браузерного интерфейса. Его дальнейшее разделение допускается только при конкретной пользе, а не ради формальной модульности.
- Один этап — один Pull Request и один uNews-патчноут.
- Этап не должен без необходимости одновременно менять архитектуру, данные и пользовательское поведение.
versions/v3.0.0/и_archive/не изменяются как обычная часть рефакторинга.- При каждом изменении runtime-файлов обновляются список PWA-кеша и
CACHE_NAME. - Перед объединением обязательны
npm test,node scripts/validate-project.mjsи GitHub Actions. - TypeScript рассматривается только при доказанной необходимости, если JSDoc и
@ts-checkперестанут обеспечивать достаточную безопасность. - Любое отклонение от утверждённого плана сначала фиксируется в документации.
- Варианты баз и переводов не перезаписываются и не удаляются при архитектурных изменениях.
Следующая рекомендуемая серия называется D1 и относится не к продолжению модульного рефакторинга, а к происхождению данных и архитектуре нескольких наборов.
Её границы определены в docs/PRODUCT_VISION.md и ROADMAP.md. Первый этап D1 является исследованием и проектированием и не должен изменять активные 4 086 записей.