DocsDiferenças de estrutura

Svelte

Nexy renderiza Svelte 5 componentes no servidor e então Svelte os assume no navegador. Páginas, layouts, ilhas e ações são iguais em todos os frameworks: esta página cobre a configuração e depois as partes que diferem dos contratos compartilhados.

Modo nexyconfig.py As páginas são Svelte é
Servidor (padrão) useCSR = False .nexy arquivos ilhas dentro dessas páginas
Cliente useCSR = True .svelte arquivos a página inteira, com layouts e um roteador cliente

Com o roteador modular, Svelte componentes são ilhas dentro das .nexy visualizações que um controlador retorna: não há arquivo de paginação e nenhum roteador cliente.

Iniciar um projeto

nx new my-app --template web-fbr-svelte
nx new my-app --template web-modular-svelte

O modelo é um projeto em modo servidor com Svelte ilhas. Execute nx new my-app sem um modelo para responder aos prompts: o roteador, o tipo de projeto, se deve usar roteamento do lado do cliente e, em seguida, a estrutura.

Habilite Svelte em um projeto existente

nexyconfig.py
from nexy.core.models import NexyConfigModelfrom nexy.frontend import svelte  class NexyConfig(NexyConfigModel):    useFF = svelte()    useAliases = {"@": "src"}
vite.config.ts
import { defineConfig } from "vite";import { svelte } from "@sveltejs/vite-plugin-svelte";import nexy from "./__nexy__/vite"; export default defineConfig({  plugins: [nexy(), svelte()],  customLogger: nexy.log(),});

nx new grava este arquivo; Nexy escreve __nexy__/vite.ts sozinho, então não o edite.

Pacote Versão nx new escreve
svelte ^5.20.2
@sveltejs/vite-plugin-svelte ^5.0.0

Regras

  • Svelte 5. Os componentes usam runas: $props(), $state() e trechos para crianças.
  • Uma estrutura por projeto. useFF leva exatamente uma estrutura; useFF = [svelte(), vue()] interrompe o servidor na inicialização.
  • Um componente por arquivo. O nome sob o qual você importa um arquivo .svelte é apenas a tag que você escreve.
  • Os componentes ficam fora de src/routes/, geralmente em src/components/, portanto não são páginas.
  • Um projeto em modo servidor não tem página .svelte e um projeto em modo cliente não tem página .nexy: Nexy se recusa a iniciar e nomeia o arquivo. Veja modos.
  • Os componentes residem em src/components/, e uma visualização os importa como ilhas.

Páginas

No modo cliente (useCSR = True), uma página é um arquivo .svelte.

Componente de página

A página é o componente definido pelo bloco de script do arquivo .svelte.

src/routes/index.svelte
<script lang="ts"></script> <h1>Hello</h1>

Segmentos dinâmicos

Os parâmetros de URL chegam à página como acessórios por meio da runa $props():

src/routes/blog/[slug].svelte
<script lang="ts">  let { slug }: { slug: string } = $props();</script> <h1>{slug}</h1>

Alternativamente, use o armazenamento $params de @nexy/client em qualquer componente.

Layouts

Implementação

O layout raiz define o shell do documento. Os layouts aninhados envolvem o conteúdo usando o snippet children.

src/routes/layout.svelte
<script lang="ts">  import type { Snippet } from "svelte";  let { children }: { children?: Snippet } = $props();</script> <html>  <body>    <header>My app</header>    <main>{@render children?.()}</main>  </body></html>

Ilhas

No modo servidor, um componente Svelte importado para um arquivo .nexy é uma ilha.

Importando

Importe componentes no frontmatter do arquivo .nexy:

src/rotas/index.nexy
---from "@/components/Counter.svelte" import Counter---<Counter start=3 />
src/apps/home_view.nexy
---from "@/components/Counter.svelte" import Counter---<Counter start=3 />

Diretrizes de hidratação

Use a propriedade directive para controlar quando a ilha hidrata:

  • client:load (padrão): imediatamente
  • client:idle: quando o navegador está ocioso
  • client:visible: quando rola para visualização
  • client:media: quando a consulta de mídia corresponde

Ações e navegação

Chamando ações

Use o gancho useAction para gerenciar o estado de uma chamada de ação. Em Svelte, isso retorna uma loja (lida com $).

<script lang="ts">  import { useAction } from "@nexy/client";  import { add_todo } from "@nexy/actions";   let title = $state("");  const save = useAction(add_todo, { onSuccess: () => (title = "") });</script> <form onsubmit={(e) => { e.preventDefault(); save.run({ title }); }}>  <input bind:value={title} />  <button disabled={$save.pending}>Add</button></form>

Use o componente Link para transições do lado do cliente:

<script lang="ts">  import Link from "@nexy/Link.svelte";</script> <Link href="/about" activeClass="active">About</Link>

Para navegação programática, use o objeto router de @nexy/client:

import { router } from "@nexy/client"; router.push("/dashboard");

Acesso URL

Todos os dados de localização são fornecidos como lojas:

  • $pathname: caminho atual
  • $params: segmentos dinâmicos
  • $searchParams: string de consulta
  • $location: objeto de localização completo

Próximas etapas

Editar no GitHub

Enter abre o resultado, Esc fecha.