Conhecimento Profundo de Svelte
Use este como um índice de lacunas de conhecimento prováveis. Verifique as APIs relevantes contra o MCP oficial do Svelte durante o planejamento e a implementação.
Verificado em 2026-11-01 contra Svelte 5.57.3, SvelteKit 3.1.1 e SvelteKit 2.70.3.
Comece com as versões instaladas
- Inspecione as versões dos pacotes e a configuração do Vite. Combine as orientações com a versão principal do Kit instalada e os sinalizadores experimentais ativados.
- Chame
list-sectionsdo MCP do Svelte e, em seguida, busque as seções relevantes junto comget-documentation. O MCP e svelte.dev servem a documentação do Kit 3. Para um projeto Kit 2, leia a página correspondente do branchversion-2desveltejs/kitemdocumentation/docs. - Para projetos Kit 3 e migrações Kit 2 → 3, leia a referência do Kit 3. Para projetos Kit 2, leia a referência do Kit 2.
- Execute
svelte-autofixerem componentes/módulos Svelte novos ou editados e resolva as conclusões aplicáveis. Use as verificações do projeto para integração e tipos.
Para exemplos de novas APIs do Svelte, renderização assíncrona, anexos e ferramentas do compilador, leia a referência do Svelte.
Funções remotas, limites e await
Para novos aplicativos SvelteKit que adotam async experimental, prefira funções remotas com await direto para dados de componentes e limites granulares para UI de carregamento/erro. Escolha o posicionamento de svelte:boundary com base no que deve ser renderizado no servidor.
- Ative
experimental.remoteFunctionsecompilerOptions.experimental.asyncjuntos. A configuração oficial de funções remotas requer ambos os sinalizadores. load, ações de formulário e rotas+servercontinuam suportados, mas não incentivados. Siga a arquitetura existente, a menos que a tarefa inclua migração..loading,.errore.currentcontinuam sendo APIs de consulta suportadas. Oawaitdireto é o mecanismo preferido.- Use
await query(args)em contextos de renderização e imperativos. {#await}continua suportado, embora não seja incentivado, e tem seu próprio comportamento de estado de promessa. Use await direto e limites para renderização assíncrona coordenada; preserve{#await}quando seu comportamento se adequar à tarefa.
Verifique com as seções do MCP kit/remote-functions, svelte/await-expressions e svelte/svelte-boundary.
Comportamento de renderização assíncrona
- Await em nível de componente chegou no Svelte 5.36; SSR assíncrono chegou no 5.39. Await é suportado no script de nível superior,
$derivede marcação. - Svelte coordena atualizações de UI dependentes enquanto o trabalho assíncrono é resolvido. Expressões await de template independentes são executadas simultaneamente. Awaits sequenciais de script ainda criam cascatas; inicie o trabalho independente antes de aguardar seus resultados.
- O snippet
pendingde um limite aparece na criação inicial. Use$effect.pending()para trabalho subsequente nesse limite; sua contagem exclui limites filhos. - Durante o SSR, um limite com
pendingrenderiza o placeholder e pula seu conteúdo. Expressões await fora de tais limites resolvem antes queawait render(...)seja concluído. Coloque o conteúdo necessário no HTML inicial de acordo. Esta API ainda não fornece SSR com streaming. $state.eager(value), adicionado no 5.41, expõe feedback imediato enquanto as atualizações coordenadas esperam. Use para feedback do usuário, como um indicador de navegação ativo.tick()espera por mudanças de estado pendentes;settled(), adicionado no 5.36, também espera pelo trabalho assíncrono causado por elas e pelas atualizações de DOM resultantes.
Limites de erro
<svelte:boundary>suportafailed(error, reset)eonerror(error, reset)para falhas de renderização/efeito. Trate erros de manipulação de eventos e de async desconectados em seus locais de chamada.- Snippets
failedtambém capturam erros durante o SSR, desde o Svelte 5.53. No SvelteKit, o erro passa porhandleErrorprimeiro, então o snippet recebe oApp.Errorsanitizado.onerroré executado quando o limite com falha é hidratado. - O Kit 3 envia erros de renderização através de
handleErrorpara o+error.sveltemais próximo, que atua como um limite. UmhandleErrorassíncrono do cliente precisa decompilerOptions.experimental.async. O Kit 2.54+ precisa deexperimental.handleRenderingErrorspara a mesma integração. - A nota "desde 5.51" mais antiga da documentação do limite entra em conflito com o changelog publicado. Use 5.53 como a versão de introdução e verifique os patches atuais ao diagnosticar problemas de SSR/hidratação.
Recursos de template
Tags de declaração, Svelte 5.56+
- Prefira
{let ...}e{const ...}para variáveis locais da marcação.{@const}está documentado como legado e permanece disponível para projetos mais antigos. - Declarações simples inicializam valores. Use runas explícitas para reatividade:
{let count = $state(0)}e{const doubled = $derived(count * 2)}. - Migrar
{@const area = width * height}reativo requer{const area = $derived(width * height)}. Um{const area = width * height}simples não é reativo. - Declarações usam escopo léxico dentro de seu elemento/bloco, podem sombrear variáveis externas e devem preceder o uso. Vários declaradores são suportados.
Anexos
- Prefira
{@attach ...}para novas integrações de elemento no Svelte 5.29+. Retorne a limpeza do anexo. - Anexos rastreiam leituras reativas e são executados novamente quando as dependências mudam. Valores falsos os desabilitam. Evite repetir configuração cara lendo opções em mudança através de um getter dentro de um efeito filho.
- Wrappers de componente devem encaminhar props que carregam anexos para o elemento pretendido.
createAttachmentKey()suporta anexos em objetos spread. fromAction(action, () => argument)preserva o comportamento de uma ação existente. Seu segundo argumento é um getter. Este auxiliar chegou no 5.32, depois dos próprios anexos.
Classes, bindings e HTML
classaceita arrays e objetos aninhados desde 5.16.ClassValuedesvelte/elementsestá disponível desde 5.19 para props de wrapper.- Bindings de função usam
bind:value={get, set}desde 5.9. Usenullcomo getter para bindings somente leitura. - Inputs numéricos podem produzir
undefinedquando vazios ou inválidos. O estado de checkbox pode usarbind:checkedebind:indeterminate; grupos de rádio usambind:group. - Inputs suportam
defaultValue/defaultCheckeddesde 5.6. Selects suportamdefaultValuedesde 5.57, incluindo comportamento de reset de formulário. Verifique a precedência de binding ao fornecer padrões. - Selects nativos personalizáveis são suportados desde 5.47. Verifique o suporte do navegador e o padrão documentado
<selectedcontent>antes de substituir um widget select personalizado. - Comentários no estilo JavaScript entre atributos são válidos desde 5.53:
<div /* explicação */ class="card">. {@html}aceitaTrustedHTMLdesde 5.52. O suporte a Trusted Types não sanitiza entrada arbitrária; use uma fonte confiável ou política de sanitização.
Blocos each e snippets
{#each items as { id, name }}desestrutura itens. A iteração de intervalo pode usar{#each { length: 8 }, index}.- Prefira chaves de item estáveis para listas cuja identidade importa. Ao editar um item, vincule sua propriedade através do objeto do item para que as mutações atinjam a fonte.
- Snippets são declarados na marcação e renderizados com
{@render snippet(...)}. Snippets de nível superior podem ser exportados de<script module>desde 5.5 se não capturarem estado da instância. - Snippets suportam genéricos desde 5.30. Genéricos de componente usam
<script lang="ts" generics="T">. - No modo runas, variáveis de componente renderizam dinamicamente como
<Component />. Componentes recursivos podem importar a si mesmos.
Runas e estado compartilhado
Estado e props
$state.rawrastreia reatribuição sem proxy profundo. Use para valores grandes substituídos como um todo.$state.snapshotextrai dados simples e respeitatoJSON().- Instâncias de classe não são tratadas com proxy profundo. Use campos
$state, ou sua primeira atribuição no construtor desde 5.31. Campos reativos tornam-se accessors não enumeráveis; preservethisao passar métodos como callbacks. - Passar um valor reativo para uma função passa seu valor atual. Passe um getter quando a função precisar de valores futuros. Desestruturar um proxy também lê os valores atuais.
- Use
.svelte.js/.svelte.tspara lógica de runas compartilhada. Exporte um objeto de estado estável ou accessors quando os consumidores precisarem de estado mutável; exportar diretamente estado de runa reatribuído é restrito. - Escope o estado específico do usuário através do contexto do componente durante o SSR. O estado de módulo compartilhado pode vazar entre requisições.
$props.id(), adicionado no 5.20, fornece um ID de instância de componente que corresponde entre SSR e hidratação.$bindable()declara uma prop vinculável. Props podem ser reatribuídas localmente; mutar o proxy não vinculável de um pai gera avisos de ownership. Valores de fallback não são automaticamente tratados com proxy.- Mantenha o tipo real não inicializado de
$state<T>(), que incluiundefined, ou forneça um valor inicial válido. Use estreitamento nos locais de acesso.
Derivados e efeitos
- Use
$derived(expression)ou$derived.by(fn)para valores computados. Derivados declarados comletpodem ser reatribuídos para UI otimista desde 5.25; mudanças de dependência os recalculam. - Valores
$deriveddesestruturados permanecem reativos. Objetos retornados não são automaticamente proxies profundos. Igualdade referencial pode pular trabalho downstream. - Efeitos rastreiam leituras síncronas de sua execução mais recente. Leituras dentro de um callback assíncrono comum após await não são dependências automáticas.
$effecté executado no navegador. Retorne a limpeza de forma síncrona; reserve efeitos para sincronização externa e coloque trabalho acionado pelo usuário em handlers.$effect.tracking()detecta um contexto de rastreamento.$effect.root()cria um escopo gerenciado manualmente e retorna um dispostor.getAbortSignal(), adicionado no 5.35, deve ser executado dentro de um efeito ou derivado. Seu sinal é abortado na reexecução ou destruição. Use para trabalho fetch de propriedade dessa computação reativa.untrack(fn)exclui leituras do rastreamento de dependências.$inspect(...).with(fn)recebe"init"/"update"seguido por valores.$inspect.trace(label?), adicionado no 5.14, deve ser a primeira instrução na função rastreada.$host()é para elementos personalizados e retorna seu elemento DOM hospedeiro.
Módulos de tempo de execução
createContext<T>()fornece contexto tipado desde 5.40. Desde 5.57 retorna[get, set, has];has()verifica disponibilidade antes deget(), que lança erro quando não definido. A busca de contexto inclui o componente atual e ancestrais. Chame accessors de contexto durante a inicialização e defina o contexto antes do primeiroawaitno script. Desde 5.57.1, umsetContextposterior lançaset_context_after_initdurante o SSR.svelte/reactivityforneceSvelteMap,SvelteSet,SvelteDate,SvelteURLeSvelteURLSearchParams. Entradas de Map/Set não se tornam profundamente reativas.- Svelte 5.57 adiciona
SvelteMap.getOrInsert(key, value)egetOrInsertComputed(key, key => value). O callback computado é executado quando a chave está ausente, incluindo o tratamento correto de entradasundefinedexistentes. MediaQueryecreateSubscriberchegaram no 5.7. UsecreateSubscriberpara conectar eventos externos a leituras rastreadas com configuração e limpeza de assinatura compartilhadas.MediaQueryaceita um fallback de SSR; use CSS quando puder expressar o mesmo comportamento.svelte/reactivity/windowfornece valores.currentreativos para dimensões, posição de rolagem, status online, posição da tela e proporção de pixels desde 5.11. Considere valores de janela indisponíveis durante o SSR.on()desvelte/eventspreserva a ordenação com handlers de evento declarativos e retorna limpeza. Use<svelte:window>/<svelte:document>para listeners globais declarativos.flushSync(fn?)libera atualizações pendentes de forma síncrona.createRawSnippetsuporta marcação programática com configuração/limpeza.getAllContexts()fornece o mapa de contexto atual para montagem programática; chame durante a inicialização.SpringeTweendesvelte/motionsubstituem os storesspring()/tweened()obsoletos desde 5.8. Ambos expõem.target,.current,.set()e.of(fn).Spring.setsuportapreserveMomentum;prefersReducedMotionsuporta movimento acessível.- Desde 5.55, as exportações de motion incluem
TweenOptions,SpringOptions,SpringUpdateOptionseUpdater. hydratable(key, fn), adicionado no 5.44, serializa dados para reutilização durante a hidratação. Ele usa devalue e suporta promessas aninhadas. Chaves com namespace evitam colisões. As funções remotas do Kit já lidam com essa camada.- Com CSP, integrações SSR personalizadas devem configurar
rendercom um nonce por resposta ou hashes estáticos e colocar valores correspondentes nos cabeçalhos de resposta. Svelte 5.46 adicionou suporte CSP para render; 5.57 exportaRenderOutput,SyncRenderOutput,CspeSha256Sourcedesvelte/server. - Para ferramentas,
print()converte um AST Svelte moderno para código fonte desde 5.45;parseCss()chegou no 5.48. As opções do compiladorcss,runesecustomElementpodem ser funções dependentes do nome do arquivo desde 5.54. Leia a referência do Svelte antes de usar essas APIs.
SvelteKit
Novos aplicativos usam Kit 3 (npx sv create). Migre um aplicativo Kit 2 com npx sv migrate sveltekit-3 e, em seguida, trabalhe nos TODOs gerados. As orientações do Kit 2 aplicam-se apenas a projetos que permanecem na 2.x.
Linha de base do Kit 3
- O Kit 3 requer Node 22.17, TypeScript 6, Svelte 5.57.1, Vite 8.0.12 e vite-plugin-svelte 7.
- A configuração reside em
sveltekit({...})dentro devite.config.ts, com as opções do Kit no nível superior ao lado decompilerOptions. O Kit 3 não lê maissvelte.config.js. #libsubstitui$libatravés de imports de subcaminho em package.json. Escreva extensões de arquivo, como#lib/server/db.ts.- Um segmento de nome de arquivo
server, ou qualquer diretórioserverfora desrc/routes, marca um módulo como somente servidor. Um segmento de nome de arquivoremote, como emdata.remote.tsouremote.ts, marca um módulo remoto. - Declare variáveis de ambiente em
src/env.tscomdefineEnvVarsde@sveltejs/kit/env. Importe valores de$app/env/privatee$app/env/public, ebrowser,building,dev,versionde$app/env. Variáveis públicas podem aparecer emapp.htmlcomo%sveltekit.env.NAME%.$env/*e$app/environmentsão aliases obsoletos. $app/storesfoi removido; use$app/state.page.urlé somente leitura; copie comnew URL(...).