@cdd-team/react

中文文档
1.7.1发布于 2026/11/01MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 1971

Учебная реализация React

原始使用文档
文档目录7 节
  1. Быстрый старт
  2. Возможности
  3. Безопасность
  4. Разработка
  5. Playground
  6. Навигация по коду
  7. Документация и участие

@cdd-team/react

Учебная реализация React на TypeScript

От JSX и компонентов до hooks, Context и обновления DOM.

Версия в npm TypeScript Bun 1.4.0 и новее Лицензия MIT

Быстрый старт · Возможности · Разработка · Контекст проекта

Реализация React команды Cringe-Driven Development с функциональными компонентами, JSX, hooks, Context и мемоизацией. В основе — Fiber-дерево, собственный планировщик и обновление DOM.

Быстрый старт

Установи пакет в приложение со сборщиком, поддерживающим TSX:

bun add @cdd-team/react

В tsconfig.json настрой automatic JSX runtime:

{
    "compilerOptions": {
        "jsx": "react-jsx",
        "jsxImportSource": "@cdd-team/react"
    }
}

Добавь в HTML контейнер <div id="root"></div>. Пример входного файла приложения:

import { createRoot, useState } from "@cdd-team/react";
import type { ReactElement } from "@cdd-team/react";

function Counter(): ReactElement {
    const [count, setCount] = useState(0);

    return (
        <button onClick={() => setCount((value) => value + 1)}>
            Счётчик: {count}
        </button>
    );
}

const container = document.getElementById("root");

if (container) {
    createRoot(container).render(<Counter />);
}

Стейт-менеджер для этой библиотеки — @cdd-team/zustand.

Возможности

МеханизмAPI и реализация
Элементыh, hFragment, createElement, Fragment, Children, isValidElement
РендерингcreateRoot, root.render, root.unmount, Fiber и reconciliation
Планированиеscheduler, render и commit phases
Состояние и эффектыuseState, useEffect, useLayoutEffect
Мемоизацияmemo, useMemo, useCallback
КонтекстcreateContext, useContext
Внешние сторыuseSyncExternalStore, useSyncExternalStoreWithSelector
JSXautomatic runtime: jsx-runtime и jsx-dev-runtime

Публичные экспорты собраны в src/index.ts. Проект развивается как учебная реализация; набор поддерживаемых API определяется этим репозиторием.

Безопасность

Рендерер закрывает пять путей к XSS через props и элементы:

  • javascript:-URL. В href, src, action, formAction, xlink:href и xlinkHref (имя без учёта регистра) URL с протоколом javascript: не записывается ни в property, ни в attribute, а атрибут удаляется. Проверка учитывает регистр протокола, начальные символы с кодами 0–32 и tab/CR/LF внутри протокола. Значение приводится к строке один раз, и записывается именно проверенная строка. Prop protocol (без учёта регистра) игнорируется: иначе он превращает уже записанный безопасный href в javascript:.
  • Сырой HTML через props. innerHTML, outerHTML и srcdoc (без учёта регистра) не записываются при установке и обновлении. Запрет srcDoc — собственная политика библиотеки. Текстовые children остаются текстом.
  • Поддельные элементы. Объект без $$typeof === Symbol.for("react.element"), например распарсенный JSON, отклоняется с TypeError в h, JSX, createElement, Children.toArray, результате компонента и root.render(). Отклонённый root.render() не меняет DOM и не отменяет уже запланированный рендер.
  • Строковые обработчики. Props с префиксом on в любом регистре считаются событиями. Значение, которое не является функцией, не попадает ни в DOM, ни в addEventListener.
  • HTML <script>. Тег script (без учёта регистра) создаётся HTML-парсером из фиксированной строки <script></script>, и браузер не исполняет его ни при вставке, ни после смены children или src. Элемент остаётся в DOM со своими props и children; данные приложения в парсер не попадают. Намеренно исполняемых скриптов рендерер не создаёт.

Ограничения:

  • Поведение не обещает полного совпадения с официальным React.
  • Spread произвольного объекта в props не становится безопасным: защищены только перечисленные пути.
  • Это не защита от всех XSS. Проверка $$typeof не является песочницей для недоверенного JavaScript.
  • <script> внутри <svg> создаётся в SVG namespace и не становится инертным.
  • Допустимые ресурсы определяет приложение: URL allowlist, санитайзер HTML и CSS, CSP, Trusted Types и проверка data:-URL в библиотеку не входят.

Разработка

Пакет живёт в монорепозитории frontend-packages. Нужен Bun 1.4.4; версия указана в .bvmrc.

git clone https://github.com/Cringe-Driven-Development-Team/frontend-packages.git
cd frontend-packages
bun install --frozen-lockfile
cd packages/react
bun run build

Общие команды проверки и порядок их запуска — в корневом README, правила выпуска — в release runbook.

Playground

playground/ — ручной dev-стенд с примерами состояния, эффектов, Context и мемоизации. Он находится вне workspaces, CI и релизов; зависимости устанавливаются отдельно.

Чтобы запустить стенд на локальной сборке пакета, после сборки выполни из корня монорепозитория:

cd packages/react
bun link
cd playground
bun install
bun link @cdd-team/react
bun run dev -- --host 127.0.0.1

Для запуска с опубликованным пакетом достаточно выполнить bun install и bun run dev -- --host 127.0.0.1 в packages/react/playground. Версия зависимости указана в его package.json.

На Windows сохраняй playground вне корневых workspaces: зависимость на собственный пакет порождает рекурсивные цепочки node_modules.

Навигация по коду

  • src/ — элементы, Fiber, scheduler, reconciliation, hooks и DOM-layer.
  • test/ — тесты библиотеки.
  • playground/src/ — примеры использования библиотеки.
  • AGENTS.md — инструкции для работы с монорепозиторием.

Документация и участие

版本与发布记录

@cdd-team/react 共发布 9 个版本,首次发布于 2026/10/18;过去 12 个月发布了 9 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.7.1latest2026/11/018 天前
1.7.02026/10/2614 天前
1.6.02026/10/2615 天前
1.5.02026/10/2317 天前
1.4.02026/10/2218 天前
1.3.02026/10/1921 天前

关于 @cdd-team/react 的常见问题

@cdd-team/react 是什么?

Учебная реализация React

如何安装 @cdd-team/react?

在项目目录运行 npm install @cdd-team/react,或使用 pnpm add / yarn add / bun add。

@cdd-team/react 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cdd-team/react 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@cdd-team/react 可以商用吗?

@cdd-team/react 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@cdd-team/react 的下载量有多少?

根据 npm 官方下载统计,@cdd-team/react 在 2026/10/10 – 2026/11/08 这 30 天内被下载 1,971 次,日均约 66 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cdd-team/react 还在维护吗?

最新版本 1.7.1 发布于 2026/11/01(8 天前);至今共发布 9 个版本,其中过去 12 个月发布了 9 个;首次发布于 2026/10/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。