Svelte Framework

SvelteKit

SvelteKit é o framework de aplicação oficial do Svelte. Ele adiciona roteamento baseado em arquivos, funções de load no lado do servidor, form actions e adapters que permitem deploy em qualquer lugar.

intermediate14 min readUpdated 15 de set. de 2026
+page.server.js
js
// src/routes/blog/[slug]/+page.server.js
import { error } from "@sveltejs/kit";

export async function load({ params, fetch }) {
  const res = await fetch(`/api/posts/${params.slug}`);
  if (!res.ok) throw error(404, "Post not found");

  return { post: await res.json() };
}
Construído sobre
Svelte
Router
Baseado em arquivos (src/routes)
Dados
load functions
Mutações
Form actions
Servidor
Node, serverless, edge
Deploy
Adapters para qualquer alvo

Por que importa

Por que o SvelteKit é a configuração padrão do Svelte

Roteamento sem configuração

Pastas e arquivos especiais definem rotas, layouts, estados de carregamento e páginas de erro, sem a necessidade de manter uma tabela de rotas.

Carregamento de dados no servidor

As load functions rodam no servidor ou na edge, então as páginas chegam com os dados já resolvidos.

Adapters para cada host

Um único build pode ter como alvo Node, hospedagem estática, Vercel, Netlify, Cloudflare e mais, apenas trocando o adapter.

O panorama completo

As três ideias por trás do SvelteKit

Arquivos definem rotas, funções de load buscam dados no servidor e adapters transformam a mesma aplicação em qualquer alvo de deployment.

O router

Navegação

Arquivos +page, +layout e +server definem páginas, UI compartilhada e endpoints de API.

Load functions

Dados

Funções de servidor ou universais que buscam dados antes de a página ser renderizada.

Adapters

Deployment

A saída do build é moldada para a plataforma onde você fará o deploy.

SvelteKit em resumo

O que o SvelteKit adiciona ao Svelte

Rotas baseadas em arquivos

src/routes mapeia pastas e arquivos para URLs, incluindo parâmetros dinâmicos.

Layouts

Arquivos +layout envolvem rotas filhas e podem ser aninhados para shells compartilhados.

Load functions

Buscam dados antes da renderização, no servidor ou no navegador.

Form actions

Lidam com envios de formulários no servidor com progressive enhancement.

Endpoints de API

Arquivos +server.js exportam handlers GET, POST e outros métodos HTTP.

Hooks

Executam lógica em cada requisição para auth, logging e locals.

Uma breve historia

Do Sapper ao framework oficial

  1. 2017

    Sapper

    O primeiro framework de aplicação Svelte introduz roteamento baseado em arquivos e SSR.

    17
  2. 2020

    SvelteKit anunciado

    O sucessor do Sapper é projetado em torno de adapters e padrões web.

    20
  3. 2021

    Beta público

    SvelteKit estabiliza suas APIs de roteamento, load e form.

    21
  4. 2022

    SvelteKit 1.0

    Um lançamento estável torna-se a maneira recomendada de construir apps Svelte.

    22
  5. Hoje

    Combinado com Svelte 5

    SvelteKit adota runes e permanece como o framework de aplicação oficial.

    Hoje

O guia completo

SvelteKit: Tudo que voce precisa saber

O que é SvelteKit?

SvelteKit é o framework oficial de aplicações para Svelte. Enquanto o Svelte fornece componentes e reatividade, o SvelteKit adiciona roteamento, carregamento de dados no servidor, manipulação de formulários, endpoints de API e adaptadores de deploy. É a maneira recomendada de construir qualquer coisa maior que um widget, e combina naturalmente com o Svelte 5.

Se você já utilizou Next.js ou Nuxt, a estrutura parecerá familiar. A diferença é uma forte inclinação para os padrões da web: formulários, requisições e respostas são primitivos da plataforma, e o SvelteKit os aprimora em vez de substituí-los.

Roteamento baseado em arquivos

Tudo reside em src/routes. Pastas tornam-se segmentos de URL e arquivos com nomes específicos definem o comportamento.

src/routes/
├── +layout.svelte          # shared shell for all routes
├── +page.svelte            # /
├── about/+page.svelte      # /about
├── blog/
│   ├── +page.svelte        # /blog
│   └── [slug]/
│       ├── +page.svelte    # /blog/:slug
│       └── +page.server.js # data for that page
└── api/
    └── posts/+server.js    # GET/POST /api/posts

O prefixo + marca os arquivos especiais do SvelteKit. +page.svelte renderiza uma página, +layout.svelte envolve as rotas filhas, +page.server.js fornece dados exclusivos do servidor e +server.js define um endpoint de API.

Funções de load

As funções de load buscam dados antes de uma página ser renderizada. Elas podem ser executadas no servidor, no navegador ou em ambos.

// src/routes/posts/+page.server.js
export async function load({ fetch }) {
  const res = await fetch("/api/posts");
  if (!res.ok) throw error(500, "Failed to load posts");
  return { posts: await res.json() };
}
<!-- src/routes/posts/+page.svelte -->
<script>
  let { data } = $props();
</script>

<ul>
  {#each data.posts as post (post.id)}
    <li>{post.title}</li>
  {/each}
</ul>

Como os dados são resolvidos antes da renderização, o primeiro paint já contém conteúdo. Use +page.server.js quando o código precisar de secrets ou de um banco de dados, e +page.js quando ele puder ser executado em ambos os ambientes. Layouts também podem ter funções de load, e os loads dos filhos recebem os dados do pai.

Form actions

Formulários são tratados como cidadãos de primeira classe. Uma form action é executada no servidor e processa o envio, sem a necessidade de um fetch no lado do cliente.

// src/routes/posts/new/+page.server.js
export const actions = {
  default: async ({ request }) => {
    const data = await request.formData();
    const title = String(data.get("title") ?? "").trim();

    if (!title) {
      return { success: false, error: "Title is required" };
    }

    await db.post.create({ data: { title } });
    return { success: true };
  },
};
<!-- src/routes/posts/new/+page.svelte -->
<script>
  let { form } = $props();
</script>

<form method="POST">
  <input name="title" />
  {#if form?.error}<p class="error">{form.error}</p>{/if}
  <button>Create</button>
</form>

O formulário funciona antes mesmo do JavaScript carregar, e o SvelteKit o aprimora assim que o cliente está pronto. O valor retornado fica disponível na prop form da página, tornando o feedback de validação simples.

Endpoints da API

Para APIs JSON, um arquivo +server.js exporta handlers HTTP.

// src/routes/api/posts/+server.js
import { json } from "@sveltejs/kit";

export async function GET() {
  const posts = await db.post.findMany();
  return json(posts);
}

export async function POST({ request }) {
  const body = await request.json();
  const post = await db.post.create({ data: body });
  return json(post, { status: 201 });
}

Estes são objetos comuns de Request e Response da web, portanto, o mesmo conhecimento se aplica a outros runtimes e frameworks.

Hooks

Um arquivo hooks.server.js é executado em cada requisição. É o local ideal para autenticação, logging e preenchimento de event.locals.

// src/hooks.server.js
export async function handle({ event, resolve }) {
  const session = await getSession(event.cookies);
  event.locals.user = session?.user ?? null;

  return resolve(event);
}

Qualquer valor definido em locals fica disponível para as funções de load e actions, o que mantém as preocupações transversais (cross-cutting concerns) em um único lugar, em vez de espalhadas pelas rotas.

Renderização e adapters

O SvelteKit suporta diversas estratégias de renderização e permite que você escolha por rota:

  • SSR renderiza no servidor e faz a hidratação no navegador.
  • Prerendering gera HTML estático no momento do build.
  • CSR renderiza apenas no navegador para as rotas que optarem por isso.
  • Híbrido mistura as três opções, permitindo que uma página de marketing seja estática enquanto uma rota de app seja renderizada no servidor.

O deploy é gerenciado por adapters. Instale o adapter para o seu destino — Node, static, Vercel, Netlify, Cloudflare e outros — configure-o, e o mesmo código-fonte será buildado para aquela plataforma. Mudar de host geralmente exige a alteração de apenas uma linha.

Melhores práticas

  • Use funções de load +page.server.js para dados que devem permanecer no servidor.
  • Prefira form actions em vez de requisições POST no lado do cliente para mutações.
  • Mantenha a autenticação e o logging em hooks.server.js.
  • Escolha o modo de renderização mais restrito que atenda a cada rota.
  • Use +layout.svelte para UI compartilhada, para que o estado persista durante a navegação.
  • Tipagem os valores de retorno da sua função de load ao usar TypeScript.
  • Instale desde o início um adapter que corresponda ao seu alvo de deploy.

Erros comuns

  • Fazer fetch em onMount e perder a renderização no servidor.
  • Colocar segredos em um load universal +page.js em vez de +page.server.js.
  • Recriar formulários com fetch no lado do cliente quando as actions já funcionam.
  • Esquecer de adicionar chaves (key) em blocos {#each} e quebrar as atualizações de listas.
  • Fazer o prerendering de uma rota que depende de dados por usuário.
  • Ignorar hooks e duplicar verificações de autenticação em cada função load.

Próximos passos

O SvelteKit é a forma completa de construir aplicações com Svelte. Aprofunde seus conhecimentos em Svelte, adicione TypeScript e compare a arquitetura com Next.js, Nuxt e Astro. Depois, construa um pequeno app com uma load function, uma form action e um API endpoint para ver todo o modelo em ação.

Carregando dados

Uma load function roda no servidor antes de a página renderizar. Buscar dados no onMount acontece depois e causa flashes de conteúdo vazio.

Preferir
// +page.js
export async function load({ fetch }) {
  const res = await fetch("/api/posts");
  return { posts: await res.json() };
}
Evitar
<script>
  import { onMount } from "svelte";
  let posts = [];
  onMount(async () => {
    posts = await fetch("/api/posts")
      .then((r) => r.json());
  });
</script>

Lidando com formulários

Uma form action roda no servidor e funciona sem JavaScript, sendo aprimorada automaticamente quando o JS está disponível.

Preferir
// +page.server.js
export const actions = {
  default: async ({ request }) => {
    const data = await request.formData();
    await createPost(data.get("title"));
  },
};
Evitar
<script>
  async function submit(e) {
    e.preventDefault();
    await fetch("/api/posts", {
      method: "POST",
      body: new FormData(e.target),
    });
  }
</script>

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender SvelteKit?

Nosso tutorial interativo te guia por SvelteKit passo a passo — com quizzes e codigo real que voce pode executar no navegador.