ДокументацияРазличия в фреймворках
Preact
Nexy отображает Preact 10 компонентов на сервере, затем Preact обрабатывает их в браузере. Страницы, макеты, острова и действия одинаковы в каждой платформе: на этой странице рассказывается о настройке, а затем о частях, которые отличаются от общих контрактов.
В модульном маршрутизаторе компоненты Preact представляют собой острова внутри представлений .nexy, которые возвращает контроллер: нет файла подкачки и нет клиентского маршрутизатора.
Начать проект
nx new my-app --template web-fbr-preact
nx new my-app --template web-modular-preact
Шаблон представляет собой серверный проект с Preact островами. Вместо этого запустите nx new my-app без шаблона, чтобы ответить на запросы: маршрутизатор, тип проекта, использовать ли маршрутизацию на стороне клиента, а затем структуру.
Включить Preact в существующем проекте
from nexy.core.models import NexyConfigModelfrom nexy.frontend import preact class NexyConfig(NexyConfigModel): useFF = preact() useAliases = {"@": "src"}import { defineConfig } from "vite";import preact from "@preact/preset-vite";import nexy from "./__nexy__/vite"; export default defineConfig({ plugins: [nexy(), preact()], customLogger: nexy.log(),});nx new записывает этот файл; Nexy пишет __nexy__/vite.ts сам, поэтому не редактируйте его.
| Пакет | Версия nx new пишет |
|---|---|
preact |
^10.25.4 |
@preact/preset-vite |
^2.10.1 (зависимость от разработчиков) |
preact-render-to-string |
^6.7.0 (зависимость от разработчика, рендеринг на сервере) |
Напишите Preact
Компонент Preact — это функция в стиле React. Отличия, которые здесь имеют значение:
import { useState } from "preact/hooks"; export default function Counter({ start = 0 }: { start?: number }) { const [count, setCount] = useState(start); return <button class="counter" onClick={() => setCount(count + 1)}>{count}</button>;}- Хуки происходят из
preact/hooks, такие типы, какComponentChildrenизpreact. - Напишите атрибуты HTML:
class,for,charset.Linkсчитывает свои классы изclass.
Правила
- Один фреймворк на проект.
useFFтребуется ровно один фреймворк;useFF = [preact(), react()]останавливает сервер при запуске. При использованииuseFF = preact()каждый файл.tsxявляется Preact.
- Страницы являются
.tsx. Только файл.tsxподsrc/routes/становится страницей;.jsxподходит для компонента. - Компоненты находятся вне
src/routes/, обычно вsrc/components/, поэтому они не являются страницами. - У проекта в режиме сервера нет страницы
.tsx, а у проекта в режиме клиента нет страницы.nexy: Nexy отказывается запускаться и присваивает файлу имя. См. режимы.
- Компоненты находятся в
src/components/, и представление импортирует их как острова.
- Страница
.mdxимпортируется из"preact". Nexy компилирует файл.mdxс Preact только тогда, когда видит этот импорт, напримерimport { h } from "preact", и с React в противном случае. См. Markdown и MDX.
Страницы
В режиме клиента (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 { ComponentChildren } from "preact"; export default function RootLayout({ children }: { children: ComponentChildren }) { return ( <html> <body> <header>My app</header> <main>{children}</main> </body> </html> );}Острова
В режиме сервера компонент Preact, импортированный в файл .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 для переходов на стороне клиента. Обратите внимание, что Preact использует class вместо className:
import { Link } from "@nexy/client"; <Link href="/about" class="nav" activeClassName="active">About</Link>
Для программной навигации используйте хук useRouter:
import { useRouter } from "@nexy/client"; const router = useRouter();router.push("/dashboard");
URL-доступ
usePathname(): текущий путьuseParams(): динамические сегментыuseSearchParams(): строка запросаuseLocation(): объект полного местоположения