Перейти к основному содержимому

Структура src/

Что такое исходный код и source

Исходный код (source code) — текст программы, который читает человек и который превращается в исполняемый бандл при сборке. В репозитории it-knowledge-base это в основном JavaScript, TypeScript, React, CSS и markdown в docs/.

Source (англ. "источник") в контексте фронтенда — каталог src/ с кастомным кодом поверх Docusaurus. Контент статей лежит в docs/; src/ отвечает за то, как контент выглядит, ведёт себя в браузере и связывается с внешними сервисами play.spirzen.ru и code.spirzen.ru.

Разделение близко к слоям приложения — данные (docs/, data/), представление (components/, theme/, css/), интеграции (constants/, embed).


Карта каталогов src/

src/
├── clientModules/ # Скрипты при загрузке каждой страницы
├── components/ # React — embeds, поиск, хабы, article chrome
├── constants/ # URL code/play, trusted origins
├── css/ # Глобальные стили и дизайн-система
├── data/ # JSON/JS — подборки, иконки, темы, индексы
├── pages/ # Лендинг / (homepage)
├── remark/ # Плагины markdown (wiki, lazy import)
├── theme/ # Swizzle-компоненты Docusaurus
├── utils/ # API палитр, PDF
├── types.d.ts
└── docusaurus-shims.d.ts

Отдельной папки hooks/ нет — хуки лежат в components/shared/ и рядом с фичами (useCollectionArticleLists.js, useDocSearchState.js).

ПапкаРоль в одном предложении
clientModules/JS вне React при загрузке страницы
components/Переиспользуемые React-компоненты для MDX и theme
constants/Константы URL и trusted origin
css/Глобальный стиль и дизайн-система
data/Статические списки маршрутов, иконок, индексов
pages/Homepageточка входа /
remark/CommonJS-плагины на этапе сборки
theme/Переопределение UI Docusaurus (swizzle)
utils/Чистые функции — API палитр, PDF

Связанные артефакты вне src/static/doc-search-index.json (генерация скриптом), static/img/, корневые конфиги.


clientModules/

Подключаются в docusaurus.config.jsclientModules. Это клиентский модуль — обычный JS, выполняемый при старте бандла, вне дерева React.

ФайлНазначение
itThemeStorageGuard.jsСброс битых ключей color mode в localStorage
itDesignThemeInit.jsСинхронизация data-design при SPA-навигации
limitRoutePrefetch.jsОграничение prefetch тяжёлых маршрутов

itDesignThemeInit восстанавливает палитру из localStorage после клиентского перехода — SSR уже выставил data-design через inject в config, клиент подтверждает при каждой загрузке страницы.

limitRoutePrefetch подменяет window.docusaurus.prefetch — для префиксов /encyclopedia/, /lab/ и т.д. не тянуть заранее тяжёлые HTML-чанки.


components/

Самая большая папка (~50 файлов). React-компоненты импортируют из MDX (import X from '@site/src/components/...') или подключаются из swizzle-темы через lazyDemo.

Embeds

КомпонентСервисМеханизм
ExternalPlayEmbed.jsxplay.spirzen.ruiframe /p/embed/<slug>/
ExternalCodeEmbed.jsxcode.spirzen.ruiframe /e/embed/<slug>/
DeveloperExamPlay.jsxplay (экзамены лаборатории)Обёртка над play

postMessage от iframe передаёт высоту; принимают только trusted origin из constants/. Подробнее — Архитектура.

shared/ — инфраструктура демо

ФайлРоль
lazyDemo.jsLazy import + Suspense
lazyDemoInView.jsЗагрузка при появлении в viewport
lazyExternalEmbed.jsОтложенный embed
EmbedClickGate.jsxClick-to-load перед iframe
embedLoadQueue.jsОчередь одновременных embed
useEmbedViewport.jsСтабильная высота iframe
DemoShell.jsx, demoFallback.jsxОболочка и скелетон
deferredIdle.jsrequestIdleCallback для DOM-правок
useBreakpoint.js, useCopyToClipboard.jsHooks

Article chrome

Блоки вокруг текста статьи, подключаются из theme/DocItem/Layout без правок MDX.

КомпонентФункция
TechArticleHero.jsxHero с иконкой технологии
ArticlePdfExport.jsxЭкспорт в PDF
ArticleSeeAlso.jsxSee-also — подборки
ArticleRelated.jsxRelated — связанные статьи
RandomChecklistItem.jsxСлучайный пункт чеклиста
RandomQuestionFromArticle.jsxВопрос из текста

Article chrome — обвязка doc-страницы (hero, TOC-панель, прогресс, см. также) вокруг тела markdown.

Навигация и хабы

КомпонентРоль
UniverseMap.jsxКарта 9 разделов энциклопедии
GettingStartedPaths.jsxПути для новичков
CollectionHub.jsxХаб подборок
LabTrainersHub.jsxХаб тренажёров лаборатории
HomepageHeroSearch/Поиск на homepage

Хаб — страница-агрегатор со списком ссылок на статьи темы.

DocSearch/ — провайдер поиска

DocSearchContext.jsx — React Context (провайдер состояния поиска). DocSearchModal, DocSearchBar, docSearchEngine.js читают static/doc-search-index.json. Кнопка Ctrl+K — в theme/NavbarItem/DocSearch.

Подробнее — Компоненты.


theme/ — swizzle и переопределение

Swizzle копирует компоненты @docusaurus/theme-classic в src/theme/; Docusaurus подхватывает их вместо стандартных. Это переопределение layout, navbar, sidebar, карточек.

Swizzle-компонентЗачем
Root/index.tsxПровайдер поиска + fallback-sidebar
DocItem/Layout/index.tsxPDF, TOC-панель, hero, related, see-also, прогресс чтения
DocRoot/Layout/index.tsxОверлей sidebar, back-to-top
DocSidebar/Desktop/ContentПоиск по sidebar, resize ширины
Navbar/Layout, ColorModeToggleDesignThemePicker + light/dark
NavbarItem/DocSearchКнопка поиска
DocCard/index.tsxSVG/эмодзи технологий на карточках
DocCategoryGeneratedIndexPageОформление автоген-оглавлений

DOM-улучшения после рендера

articleMetaEnhancement.ts и articleSectionEnhancement.tsкликабельность тегов, обёртка секций .doc-section вокруг h2. Запускаются из layout через scheduleIdleWork после отрисовки.

DocSidebarFallback

DocSidebarFallback/fallback для узкого desktop: оверлей бокового меню, если классический sidebar скрыт. Activator.tsx вешает кнопку "меню раздела".

SidebarResizeHandle.jsx + useSidebarAutoWidth.js — перетаскивание границы sidebar, ширина в localStorage. Работает на desktop.

ChapterProgress

ChapterProgress.tsx — полоска прогресса прокрутки статьи (процент видимого текста в viewport).


data/

Статические данные — JS-модули и JSON. Часть файлов генерируется скриптами перед сборкой.

ФайлТипСодержимое
sidebarCollections.jsJSМаршруты подборок для homepage и /about/collections
encyclopediaSections.jsJS9 разделов карты вселенной
itDesigns.jsonJSONПалитры оформления
techIconRegistry.jsJSid технологии → SVG/эмодзи
techIconPaths.jsJSАвтоген SVG paths (docs:tech-icon-paths)
techArticlePages.jsJSПрефикс doc → tech id для hero
collectionDocTitles.jsonJSONid → заголовок (генерация скриптом)
encyclopediaTermLinks.jsonJSONТермин → URL
wikiLinkIndex.jsonJSONИндекс [[wiki]] (генерируется)
docLegacyRedirects.jsonJSONРедирект старых URL (генерируется)
languagePrerequisitesTopics.jsonJSONТемы для планов языков
englishPlanVocabulary.jsonJSONСловарь плана английского

css/ — стили и дизайн-система

Точка входаcustom.css (плюс it-design-code-overrides.css в config). Цепочка @import.

ФайлРоль
it-design-themes.cssПеременные для каждой data-design
it-design-bridge.cssМост --d-*Infima --ifm-*
it-design-color-mode.cssLight/dark внутри палитры
article-docs-prime.cssТипографика статей
sidebar-explorer.css, sidebar-cosmic-explorer.cssОформление sidebar
doc-search-theme.cssСтили поиска
navbar-layout.cssNavbar
site-chrome.cssОбщая хромированная оболочка сайта

Дизайн-система — набор палитр data-design + мост к Infima + эффекты (it-design-effects.css). API палитр в utils/itDesignTheme.ts. Подробнее — Темы и стили.

Глобальный стиль — CSS из customCss в config на весь сайт; *.module.css у компонентов действует локально.


remark/ — плагины markdown

CommonJS-модули, подключённые в docusaurus.config.jsremarkPlugins. Работают на этапе сборки, в браузере не выполняются.

ПлагинНазначение
wikiLink.js[[термин]] → ссылка по wikiLinkIndex.json
lazyMdxDemoImports.jsПереписывает import тяжёлых компонентов на lazy import

Remark обходит AST markdown до компиляции MDX — часть пайплайна контента.


pages/ — homepage и лендинг

index.jsлендинг маршрута / (homepage). Hero, поиск, ленивые UniverseMap, GettingStartedPaths, RandomArticle.

Остальной контентdocs с routeBasePath: '/', поэтому URL /encyclopedia/intro идут из docs/, а корень / — из pages/.


constants/

ФайлРоль
embedServiceUrl.jsprod vs localhost для embed-URL
codeExamples.jsURL и postMessage origins для code.spirzen.ru
playExamples.jsТо же для play.spirzen.ru

resolveEmbedServiceBaseUrl на localhost:3000 подменяет прод-URL на локальные порты — тест локальной связки embed без правки prod-конфига.

Trusted origin — whitelist доменов для postMessage (защита от поддельных сообщений о высоте iframe).


utils/ и shims

ФайлНазначение
itDesignTheme.tsAPI палитрapplyItDesign, readStoredItDesignId
exportArticlePdf.jshtml2canvas + jsPDF для кнопки в layout

docusaurus-shims.d.ts и types.d.tsshim-типы для IDE (TypeScript), не runtime-код.


docs/ vs src/

docs/src/
СодержимоеMarkdown, MDX, статьиКод, стили, theme
Навигацияsidebars.js, _category_.jsonКомпоненты UI
Сборкаremark → MDX → React-страницыWebpack-чанки, swizzle

Статья в docs/ — файл .md/.mdx с frontmatter. Глава — логическая часть учебного раздела (например, глава "Как устроена Вселенная IT"). Раздел — крупный блок энциклопедии (encyclopedia/, lab/, …). Секция — фрагмент внутри одной страницы (h2 + абзацы, обёртка .doc-section).


Поток зависимостей


Куда класть новый код

ЗадачаПапка
Виджет в одной статьеcomponents/ + import в MDX
Блок на всех статьяхtheme/DocItem/Layout
Пункт navbartheme/Navbar* или NavbarItem/
Статический список маршрутовdata/*.js или JSON
Глобальный стильcss/
Синтаксис markdownremark/
Скрипт при загрузке сайтаclientModules/
URL внешнего APIconstants/

Глоссарий

Исходный код

Текст программы до сборки; в проекте — src/, docs/, scripts/, конфиги.

source / src

Каталог src/кастомный код Docusaurus поверх шаблона.

Код

Инструкции на JS/TS/CSS; см. выполнение кода.

Кастомный код

Всё в src/, чего нет в стандартном шаблоне Docusaurus — theme, компоненты, стили.

React-компоненты

Функции/классы, возвращающие JSX; основа UI. React — компоненты.

Переопределение

Замена стандартного компонента темы своей версией в src/theme/ (swizzle).

Стили

CSS в src/css/ и *.module.css у компонентов.

remark-плагины

Обработчики markdown при сборке; см. package.json и стек.

Клиентский модуль

Файл из clientModules/ — выполняется при загрузке бандла, вне React.

Контент

Текст и медиа статей в docs/; компоненты его оборачивают и дополняют.

Статья

Один документ в docs/ (.md/.mdx); id и slug.

Скрипт

JS-модуль — clientModules/, scripts/*.mjs (пайплайн), или inline в config.

Загрузка страницы

Первый HTTP-запрос HTML/JS или клиентский переход в SPA; clientModules срабатывают при старте бандла.

Компонент

Единица UI в React; файл в components/ или theme/.

Константа

Незменяемое значение — URL, ключ storage, список origins в constants/.

embed

Встраивание внешнего UI (iframe) — play, code, экзамены.

Хаб

Страница-агрегатор ссылок (CollectionHub, LabTrainersHub).

article chrome

Обвязка doc-страницы — hero, PDF, related, see-also, прогресс, TOC-панель.

trusted origin

Доверенный домен для postMessage от iframe.

Дизайн-система

Палитры data-design, CSS-переменные, мост Infima, picker в navbar.

docs

Плагин и папка docs/ — основной контент сайта.

lazy import

import() + React.lazy — отложенная загрузка чанка.

swizzle-компонент

Копия компонента @docusaurus/theme-classic в src/theme/.

shim

Заглушка типов (docusaurus-shims.d.ts) для IDE.

hooks

React-хуки (useState, useDoc, useEmbedViewport) в shared/ и DocSearch.

shared

components/shared/ — общая инфраструктура embed и lazy.

Ключи color mode

Записи localStorage с префиксом theme (light/dark Docusaurus).

localStorage

Хранилище браузера для темы, дизайна, ширины sidebar.

SPA

Single Page Application — навигация без полной перезагрузки. Docusaurus после первой загрузки.

Навигация

Переходы между маршрутами — navbar, sidebar, Link, поиск.

Синхронизация

Согласование состояния при переходах — data-design, color mode, iframe theme query.

prefetch

Предзагрузка следующей страницы Docusaurus Link; ограничена для /encyclopedia/.

Маршрут

URL ↔ страница (/encyclopedia/intro, /). См. route.

Бандл

Собранный JS/CSS для браузера; src/ режется на чанки.

play.spirzen.ru

Сервис интерактива — тренажёры, /p/embed/<slug>/. См. Архитектура.

code.spirzen.ru

Сервис примеров кода — /e/embed/<slug>/, ExternalCodeEmbed.

iframe

HTML-элемент вложенной страницы; embed play/code.

Провайдер поиска

DocSearchProvider — Context для модального поиска.

fallback

Запасной UI — sidebar overlay, skeleton embed, эмодзи вместо SVG.

Боковое меню документации; swizzle в theme/DocSidebar/. См. sidebars.js.

TOC

Table of Contents — оглавление статьи; DocTocPanel, mobile/desktop TOC.

hero

Верхний баннер страницы — TechArticleHero, homepage header.

Блок связанных статей — ArticleRelated.jsx.

see-also

Блок "См. также" / подборки — ArticleSeeAlso.jsx.

Прогресс чтения

ChapterProgress — индикатор прокрутки статьи.

Оверлей

Плавающий слой поверх контента — sidebar fallback на узком desktop.

back-to-top

Кнопка прокрутки вверх в DocRoot/Layout.

resize

Изменение ширины sidebar перетаскиванием (SidebarResizeHandle).

desktop

Широкий viewport; отдельные layout-решения от mobile/tablet.

pick

Выбор палитры — DesignThemePicker в navbar/sidebar.

Верхняя панель; swizzle Navbar/Layout, ColorModeToggle.

Кликабельность

Интерактивные теги и badge после articleMetaEnhancement.

Секция

Фрагмент статьи под h2 (обёртка .doc-section).

Раздел

Крупная ветка сайта или энциклопедии (1-basics, lab/).

Глава

Часть внутреннего учебного раздела (файлы 01-, 02- в "Как устроена Вселенная IT").

homepage

Главная /src/pages/index.js.

Палитра оформления

Запись в itDesigns.json + CSS для data-design.

SVG

Векторная иконка технологии из techIconPaths.js.

Эмодзи

Запасной badge в techIconRegistry (fallback: '🐍').

Автоген

Автоматически сгенерированный файл (techIconPaths.js, wikiLinkIndex.json).

Префикс

Начало пути или id (5-01-, префикс doc для hero).

Редирект

Перенаправление старого URL — docLegacyRedirects.json, plugin redirects.

Индекс

JSON-каталог для поиска или wiki (doc-search-index, wikiLinkIndex).

Точка входа

Главный файл модуля — custom.css, pages/index.js, Root/index.tsx.

Переменные

CSS custom properties (--ifm-*, --d-*) в css/.

Типографика

Размеры шрифтов, межстрочный интервал статей — article-docs-prime.css.

Мост

it-design-bridge.css — сопоставление --d-* с Infima --ifm-*.

Infima

CSS-фреймворк темы Docusaurus. См. package.json и стек.

CommonJS

require/module.exportsremark, часть theme require('@theme/...').

Сборка

npm run buildbuild/. См. package.json и стек.

Лендинг

Маркетинговая главная / с hero и CTA.

prod

Продакшен — spirzen.ru, code/play на spirzen.ru; против localhost в constants.

postMessage

API браузера для сообщений между окном и iframe (высота embed).

Тест локальной связки

Разработка с локальными code/play на портах 4321/4322 через resolveEmbedServiceBaseUrl.

API

Программный интерфейс — applyItDesign, URL embed-сервисов, поисковый индекс.

API палитр

Функции itDesignTheme.ts — чтение/запись активного data-design.

Генерация скриптом

scripts/*.mjs пишут JSON в src/data/ или static/ перед build.

Глобальный стиль

CSS из customCss в config, действует на весь сайт.


Связь с другими главами

Полезные статьи энциклопедии

Содержание