Setup
createSiteSetup — bootstrap em uma chamada que registra tudo que o framework precisa.
createSiteSetup é a função única que faz bootstrap de uma loja v2. Registra suas sections, blocks, matchers e integrações de plataforma em um lugar. Toda loja v2 tem um src/setup.ts que chama ela.
Import
import { createSiteSetup } from "@decocms/start/setup";
Uso mínimo
// src/setup.ts
import "./cache-config"; // opcional: overrides de profile de cache
import { createSiteSetup } from "@decocms/start/setup";
import { applySectionConventions } from "@decocms/start/cms";
import blocks from "./server/cms/blocks.gen";
import sectionsGen from "./server/cms/sections.gen";
import meta from "./server/cms/meta.gen.json";
import "./styles.css?url";
createSiteSetup({
sections: import.meta.glob("./sections/**/*.tsx", { eager: true }),
blocks,
meta: () => meta,
productionOrigins: ["https://minha-loja.com"],
});
applySectionConventions(sectionsGen);
A função não retorna nada útil — o trabalho dela é efeito colateral (preencher registros).
Parâmetros obrigatórios
sections
Um mapa de glob import com todos os arquivos de section. import.meta.glob do Vite produz isso:
sections: import.meta.glob("./sections/**/*.tsx", { eager: true })
Use eager: true para que os imports aconteçam em load do módulo (antes do TanStack dividir server functions). O framework percorre o mapa e monta o registro de sections.
blocks
O bundle de blocks, importado de ./server/cms/blocks.gen.ts (que o Vite plugin substitui pelo fast-path JSON).
meta
Função que retorna o bundle de JSON Schema ( meta.gen.json ). Embrulhada em função para load preguiçoso — o schema é grande e só o endpoint do admin precisa.
meta: () => import("./server/cms/meta.gen.json"),
Parâmetros opcionais
productionOrigins
Whitelist das origens que o admin pode chamar. Usada para validação CORS nos endpoints do admin.
productionOrigins: [
"https://minha-loja.com",
"https://www.minha-loja.com",
],
initPlatform
Bootstrap específico de plataforma. Para VTEX:
import { initVtexFromBlocks } from "@decocms/apps/vtex/client";
createSiteSetup({
// ...
initPlatform: () => initVtexFromBlocks(),
});
Isso lê o block deco-vtex do decofile e chama configureVtex com o resultado.
getCommerceLoaders
Devolve o registro de inline loaders. Conecta os loaders de @decocms/apps/vtex ou @decocms/apps/shopify aos __resolveType do CMS.
import { createVtexCommerceLoaders } from "@decocms/apps/vtex/commerceLoaders";
createSiteSetup({
// ...
getCommerceLoaders: () => createVtexCommerceLoaders(),
});
Veja Inline loaders VTEX.
customMatchers
Mapa nome → função para lógica A/B específica do site.
import { registerBuiltinMatchers } from "@decocms/start/matchers/builtins";
createSiteSetup({
// ...
customMatchers: {
MatchHasCart: matchHasCart,
},
});
css
Caminho para o arquivo CSS de entrada (Tailwind etc.). Importado como ?url para o Vite resolver a URL bundled:
import css from "./styles.css?url";
createSiteSetup({
// ...
css,
});
fonts
Array de hints de preload de fonte. O framework injeta no <head> .
fonts: [
{ href: "/fonts/inter-var.woff2", type: "font/woff2" },
],
errorHandler
Handler customizado para quando sections lançam. Default: log + render fallback.
errorHandler: (error, sectionName) => {
console.error(`[${sectionName}]`, error);
},
Depois do createSiteSetup
Algumas chamadas em sequência são típicas. A ordem importa:
createSiteSetup({/* ... */});
applySectionConventions(sectionsGen); // embrulha sections em error boundary, lazy
registerCommerceLoaders(commerceLoaders); // wire de inline loaders
registerLayoutSections({/* Header, Footer, Theme */}); // cacheia layout entre páginas
setAsyncRenderingConfig({ foldThreshold: 3 }); // tunning de deferred rendering
setVtexFetch(createInstrumentedFetch("vtex")); // fetch instrumentado para VTEX
setInvokeLoaders(invokeLoaders); // cliente tipado de invoke
applySectionConventions e registerLayoutSections são quase sempre chamados. O resto depende do que seu site usa — chame registerCommerceLoaders e setVtexFetch para VTEX, setShopifyFetch para Shopify, e por aí vai.
Por que setup.ts precisa vir primeiro
import "./setup" é a primeira linha de src/server.ts E de src/worker-entry.ts .
A chamada de setup tem efeitos colaterais: popula registros (sections, loaders, matchers). O TanStack Start divide server functions em chunks separados em build time. Se esses chunks carregarem antes do setup.ts , os registros estão vazios e você ganha erros enigmáticos do tipo “section not found” em produção.
Pôr import "./setup" no topo de toda entry server-side garante que os registros existam antes de qualquer coisa tentar usar.
Sections de layout
Header, Footer e Theme são especiais. Aparecem em toda página; re-resolver a cada request é desperdício. Registre como layout sections:
import { registerLayoutSections } from "@decocms/start/cms";
registerLayoutSections({
Header: () => import("~/sections/Header/Header"),
Footer: () => import("~/sections/Footer/Footer"),
Theme: () => import("~/sections/Theme/Theme"),
});
O framework cacheia o layout resolvido entre requests (na mesma versão do decofile) e só re-resolve quando um block de layout muda.
Bootstrap VTEX
Para sites com VTEX, o setup completo típico fica:
import { createSiteSetup } from "@decocms/start/setup";
import { applySectionConventions, registerCommerceLoaders, registerLayoutSections, setAsyncRenderingConfig } from "@decocms/start/cms";
import { createInstrumentedFetch } from "@decocms/start/sdk/instrumentedFetch";
import { initVtexFromBlocks, setVtexFetch } from "@decocms/apps/vtex/client";
import { createVtexCommerceLoaders } from "@decocms/apps/vtex/commerceLoaders";
import { configureWebsite } from "@decocms/apps/website";
import { registerBuiltinMatchers } from "@decocms/start/matchers/builtins";
import blocks from "./server/cms/blocks.gen";
import sectionsGen from "./server/cms/sections.gen";
import meta from "./server/cms/meta.gen.json";
import css from "./styles.css?url";
createSiteSetup({
sections: import.meta.glob("./sections/**/*.tsx", { eager: true }),
blocks,
meta: () => meta,
css,
productionOrigins: ["https://minha-loja.com"],
initPlatform: () => initVtexFromBlocks(),
getCommerceLoaders: () => createVtexCommerceLoaders(),
});
applySectionConventions(sectionsGen);
registerLayoutSections({
Header: () => import("~/sections/Header/Header"),
Footer: () => import("~/sections/Footer/Footer"),
Theme: () => import("~/sections/Theme/Theme"),
});
setAsyncRenderingConfig({ foldThreshold: 3, respectCmsLazy: true });
setVtexFetch(createInstrumentedFetch("vtex"));
configureWebsite({ seo: getSiteSeo() });
registerBuiltinMatchers({ customMatchers: {} });
Veja também
Found an error or want to improve this page?
Edit this page