Blocks
JSON que o CMS produz e o framework resolve em componentes renderizados.
Um block é um documento JSON que o CMS usa para descrever uma peça de conteúdo — uma página, uma instância de section, uma configuração de app ou um matcher. Blocks são a unidade de versionamento de conteúdo, A/B testing e edição no admin.
Anatomia
Todo block tem um campo __resolveType que diz ao framework qual código invocar. Tudo o mais no JSON são as props para esse código.
{
"__resolveType": "site/sections/Hero/HeroBanner.tsx",
"title": "Bem-vinda à nossa loja",
"cta": {
"label": "Comprar agora",
"href": "/produtos"
}
}
Quando o framework vê __resolveType: "site/sections/Hero/HeroBanner.tsx" , ele:
- Procura a section no registro.
- Valida o resto do JSON contra a interface
Propsda section. - Renderiza a section com essas props.
Tipos de block
| Tipo | exemplo __resolveType | O que representa |
|---|---|---|
| Página | $live/pages/Page.ts | Uma página com suas sections em ordem |
| Instância de section | site/sections/Hero/HeroBanner.tsx | Um posicionamento de uma section |
| Configuração de app | deco-vtex | Setup de VTEX, Shopify ou Resend |
| Matcher | site/matchers/MatchUserAgent.ts | Uma regra de flag/AB |
| Instância de loader | vtex/loaders/intelligentSearch/productList.ts | Uma chamada de loader configurada |
Onde os blocks vivem
Fonte: .deco/blocks/*.json
Um arquivo JSON por block, commitado. O admin sincroniza o diretório nos dois sentidos — edições no admin viram arquivos em .deco/blocks/ e vice-versa.
Bundle: src/server/cms/blocks.gen.json
Um único objeto JSON que mapeia IDs de block para seu JSON. Gerado pelo script generate-blocks :
npm run generate:blocks
É o que o framework carrega em runtime. Em lojas em produção, o blocks.gen.json tipicamente fica entre alguns MBs e mais de 10 MB, dependendo do número de páginas e sections no CMS.
Re-export: src/server/cms/blocks.gen.ts
Um módulo fino que o Vite plugin substitui por JSON.parse do .json irmão em load time. Não edite na mão nenhum dos dois.
Não tente chunk manual de @decocms/start ou @decocms/apps no vite.config.ts . O Vite plugin cuida do fast path do JSON, e esses pacotes têm re-exports circulares que crasham se forem divididos em chunks.
Como a resolução funciona
Quando chega uma requisição para /produtos/algum-produto :
- A rota catch-all chama
loadCmsPage({ siteName, pathname }). loadCmsPagechamaresolveDecoPagede@decocms/start/cms, que:- Procura o block da página por padrão de URL.
- Percorre cada referência de section na lista da página.
- Resolve o
__resolveTypede cada section para um componente registrado. - Roda o loader de cada section (se tiver).
- Devolve uma árvore que o renderer percorre.
DecoPageRendererpercorre a árvore e renderiza cada section.
Veja Páginas e rotas para como páginas casam com URLs.
Composabilidade
Blocks referenciam outros blocks. Uma página contém referências de section; uma section pode conter uma referência de loader; um matcher pode conter outros matchers. O CMS resolve o grafo todo de forma preguiçosa.
{
"__resolveType": "$live/pages/Page.ts",
"path": "/produtos/:slug",
"sections": [
{
"__resolveType": "site/sections/Header/Header.tsx"
},
{
"__resolveType": "site/sections/Product/ProductDetail.tsx",
"loader": {
"__resolveType": "vtex/loaders/intelligentSearch/productDetailsPage.ts",
"slug": "{slug}"
}
}
]
}
Parâmetros de URL ( {slug} ) são interpolados em tempo de resolução.
Blocks multivariados
Um block pode referenciar um matcher para fazer A/B ou segmentar conteúdo:
{
"__resolveType": "$live/matchers/MultivariateBlock.ts",
"variants": [
{ "matcher": { "__resolveType": "..." }, "block": { "__resolveType": "..." } },
{ "block": { "__resolveType": "..." } }
]
}
O primeiro variant cujo matcher retornar true ganha. Veja Matchers e flags.
ETag e invalidação de cache
O framework calcula um hash de conteúdo (DJB2) sobre os blocks resolvidos e expõe como header ETag. Quando você edita um block no admin e republica, o ETag muda e os caches de CDN/browser invalidam corretamente.
Não é um hash de tamanho de string — é um hash de conteúdo de verdade, então duas versões com mesmo tamanho mas conteúdo diferente invalidam corretamente.
Veja também
Found an error or want to improve this page?
Edit this page