ДокументацияРазличия в фреймворках
React
Nexy отображает React 19 компонентов на сервере, затем React гидратирует их в браузере. Страницы, макеты, острова и действия одинаковы в каждой платформе: на этой странице рассказывается о настройке, а затем о частях, которые отличаются от общих контрактов.
В модульном маршрутизаторе компоненты React представляют собой острова внутри представлений .nexy, которые возвращает контроллер: нет файла подкачки и нет клиентского маршрутизатора.
Начать проект
nx new my-app --template web-fbr-react
nx new my-app --template web-modular-react
Шаблон представляет собой серверный проект с React островами. Вместо этого запустите nx new my-app без шаблона, чтобы ответить на запросы: маршрутизатор, тип проекта, использовать ли маршрутизацию на стороне клиента, а затем структуру.
Включить React в существующем проекте
from nexy.core.models import NexyConfigModelfrom nexy.frontend import react class NexyConfig(NexyConfigModel): useFF = react() useAliases = {"@": "src"}import { defineConfig } from "vite";import react from "@vitejs/plugin-react";import nexy from "./__nexy__/vite"; export default defineConfig({ plugins: [nexy(), react()], customLogger: nexy.log(),});nx new записывает этот файл; Nexy пишет __nexy__/vite.ts сам, поэтому не редактируйте его.
| Пакет | Версия nx new пишет |
|---|---|
react, react-dom |
^19.2.5 |
@vitejs/plugin-react |
^5.2.0 |
@types/react, @types/react-dom |
зависимости разработчиков |
Правила
- Один фреймворк на проект.
useFFтребуется ровно один фреймворк;useFF = [react(), vue()]останавливает сервер при запуске.
- Страницы — это
.tsx. React владеет.tsxи.jsxдля компонентов, но только файл.tsxподsrc/routes/становится страницей. - Компоненты находятся за пределами
src/routes/, обычно вsrc/components/, поэтому они не являются страницами. - У проекта в режиме сервера нет страницы
.tsx, а у проекта в режиме клиента нет страницы.nexy: Nexy отказывается запускаться и присваивает файлу имя. См. режимы.
- Компоненты находятся в
src/components/, и представление импортирует их как острова.
Страницы
В клиентском режиме (useCSR = True) страница представляет собой файл .tsx.
Компонент страницы
Страница — это экспорт файла по умолчанию. Если экспорта по умолчанию не существует, Nexy выбирает первый названный экспорт.
export default function Home() { return <h1>Hello</h1>;}Динамические сегменты
Параметры URL доступны через хук useParams:
import { useParams } from "@nexy/client"; export default function Post() { const { slug } = useParams<{ slug: string }>(); return <h1>{slug}</h1>;}Макеты
Реализация
Корневой макет определяет оболочку документа. Вложенные макеты оборачивают содержимое под ними.
import type { ReactNode } from "react"; export default function RootLayout({ children }: { children: ReactNode }) { return ( <html> <body>{children}</body> </html> );}Острова
В режиме сервера компонент React, импортированный в файл .nexy, является островом.
Импорт
Импортируйте компоненты в начале файла .nexy:
from "@/components/Counter.tsx" import Counter<Counter start=3 />from "@/components/Counter.tsx" import Counter<Counter start=3 />Директивы по гидратации
Используйте реквизит directive для управления моментом гидратации острова:
client:load(по умолчанию): немедленноclient:idle: когда браузер бездействуетclient:visible: когда он прокручивается в поле зренияclient:media: когда медиа-запрос соответствует
Действия и навигация
Вызов действий
Используйте хук useAction для управления состоянием вызова действия:
import { useAction } from "@nexy/client";import { add_todo } from "@nexy/actions"; const { run, pending, error, data } = useAction(add_todo);// ...<button onClick={() => run({ title: "New Task" })}>Add</button>
Навигация
Используйте компонент Link для переходов на стороне клиента:
import { Link } from "@nexy/client"; <Link href="/about">About</Link>
Для программной навигации используйте хук useRouter:
import { useRouter } from "@nexy/client"; const router = useRouter();router.push("/dashboard");
URL-доступ
usePathname(): текущий путьuseParams(): динамические сегментыuseSearchParams(): строка запросаuseLocation(): объект полного местоположения