DokuRahmenunterschiede
Preact
Nexy rendert Preact 10 Komponenten auf dem Server, dann Preact übernimmt sie im Browser. Seiten, Layouts, Inseln und Aktionen sind in jedem Framework gleich: Auf dieser Seite geht es um die Einrichtung und dann um die Teile, die sich von den gemeinsamen Verträgen unterscheiden.
Beim modularen Router sind Preact Komponenten Inseln innerhalb der .nexy Ansichten, die ein Controller zurückgibt: Es gibt keine Auslagerungsdatei und keinen Client-Router.
Starten Sie ein Projekt
nx new my-app --template web-fbr-preact
nx new my-app --template web-modular-preact
Die Vorlage ist ein Servermodus-Projekt mit Preact Inseln. Führen Sie stattdessen nx new my-app ohne Vorlage aus, um die Eingabeaufforderungen zu beantworten: den Router, den Projekttyp, ob clientseitiges Routing verwendet werden soll, dann das Framework.
Aktivieren Sie Preact in einem vorhandenen Projekt
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 schreibt diese Datei; Nexy schreibt __nexy__/vite.ts selbst, also bearbeiten Sie es nicht.
| Paket | Version nx new schreibt |
|---|---|
preact |
^10.25.4 |
@preact/preset-vite |
^2.10.1 (Entwicklerabhängigkeit) |
preact-render-to-string |
^6.7.0 (Entwicklerabhängigkeit, Renderings auf dem Server) |
Schreiben Sie Preact
Eine Preact-Komponente ist eine Funktion im React-Stil. Die Unterschiede, auf die es hier ankommt:
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>;}- Haken stammen von
preact/hooks, Typen wieComponentChildrenvonpreact. - Schreiben Sie HTML-Attribute:
class,for,charset.Linkliest seine Klassen ausclass.
Regeln
- Ein Framework pro Projekt.
useFFbenötigt genau ein Framework;useFF = [preact(), react()]stoppt den Server beim Start. MituseFF = preact()ist jede.tsx-Datei Preact.
- Seiten sind
.tsx. Nur eine.tsx-Datei untersrc/routes/wird zu einer Seite;.jsxist für eine Komponente in Ordnung. - Komponenten befinden sich außerhalb von
src/routes/, normalerweise insrc/components/, daher sind sie keine Seiten. - Ein Servermodus-Projekt hat keine
.tsxSeite, und ein Clientmodus-Projekt hat keine.nexySeite: Nexy weigert sich zu starten und benennt die Datei. Siehe Modi.
- Komponenten leben in
src/components/und eine Ansicht importiert sie als Inseln.
- Eine
.mdx-Seite importiert aus"preact". Nexy kompiliert eine.mdx-Datei mit Preact nur, wenn es diesen Import sieht, zum Beispielimport { h } from "preact", andernfalls mit React. Siehe Markdown und MDX.
Seiten
Im Client-Modus (useCSR = True) ist eine Seite eine .tsx-Datei.
Seitenkomponente
Eine Seite ist der Standardexport der Datei. Wenn kein Standardexport vorhanden ist, wählt Nexy den zuerst benannten Export aus.
export default function Home() { return <h1>Hello</h1>;}Dynamische Segmente
URL-Parameter sind über den Hook useParams verfügbar:
import { useParams } from "@nexy/client"; export default function Post() { const { slug } = useParams<{ slug: string }>(); return <h1>{slug}</h1>;}Layouts
Umsetzung
Das Root-Layout definiert die Dokumenthülle. Verschachtelte Layouts umschließen den Inhalt.
import type { ComponentChildren } from "preact"; export default function RootLayout({ children }: { children: ComponentChildren }) { return ( <html> <body> <header>My app</header> <main>{children}</main> </body> </html> );}Inseln
Im Servermodus ist eine in eine .nexy-Datei importierte Preact-Komponente eine Insel.
Importieren
Importieren Sie Komponenten in die Frontmatter der Datei .nexy:
from "@/components/Counter.tsx" import Counter<Counter start=3 />from "@/components/Counter.tsx" import Counter<Counter start=3 />Trinkrichtlinien
Verwenden Sie die Requisite directive, um zu steuern, wann die Insel hydratisiert:
client:load(Standard): sofortclient:idle: wenn der Browser inaktiv istclient:visible: wenn es in die Ansicht scrolltclient:media: wenn die Medienabfrage übereinstimmt
Aktionen und Navigation
Aktionen aufrufen
Verwenden Sie den Hook useAction, um den Status eines Aktionsaufrufs zu verwalten:
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>
Navigation
Verwenden Sie die Komponente Link für clientseitige Übergänge. Beachten Sie, dass Preact class anstelle von className verwendet:
import { Link } from "@nexy/client"; <Link href="/about" class="nav" activeClassName="active">About</Link>
Verwenden Sie für die programmatische Navigation den Hook useRouter:
import { useRouter } from "@nexy/client"; const router = useRouter();router.push("/dashboard");
URL-Zugriff
usePathname(): aktueller PfaduseParams(): dynamische SegmenteuseSearchParams(): AbfragezeichenfolgeuseLocation(): vollständiges Standortobjekt