Começar do zero
Coloque uma loja deco.cx v2 no ar a partir do zero.
Esta página leva você do zero até uma loja v2 em produção, criando à mão o conjunto mínimo de arquivos que @decocms/start e @decocms/apps precisam para subir.
Um comando de scaffold está a caminho. Um npm create deco@v2 (ou equivalente) dedicado está no roadmap e vai colapsar todos esses passos em um único prompt. Até ele sair, a receita manual abaixo é o caminho suportado.
Pré-requisitos: Node.js 20+, um package manager ( npm , pnpm ou bun ), uma conta Cloudflare e (opcionalmente) uma loja VTEX ou Shopify se você quer commerce.
1. Crie o projeto
mkdir minha-loja && cd minha-loja
npm init -y
git init
2. Instale as dependências
npm install \
@decocms/start \
@decocms/apps \
@tanstack/react-start @tanstack/react-router \
react@^19 react-dom@^19
npm install -D \
vite@^6 \
wrangler@^4 \
typescript \
@cloudflare/workers-types
Os dois pacotes deco têm versões independentes. Fixe nas versões mais recentes publicadas:
@decocms/start ^2.x— framework + ponte para o CMS.@decocms/apps ^1.x— integrações de commerce (VTEX, Shopify, Resend).
3. Adicione os arquivos de build
vite.config.ts :
import { defineConfig } from "vite";
import { cloudflare } from "@cloudflare/vite-plugin";
import { tanstackStart } from "@tanstack/react-start/plugin/vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";
import { decoVitePlugin } from "@decocms/start/sdk/vitePlugin";
export default defineConfig({
plugins: [
cloudflare(),
tanstackStart({ target: "cloudflare-module" }),
react(),
tailwindcss(),
decoVitePlugin(),
],
});
wrangler.jsonc :
{
"name": "minha-loja",
"main": "./src/worker-entry.ts",
"compatibility_date": "2026-02-14",
"compatibility_flags": ["nodejs_compat", "no_handle_cross_request_promise_resolution"]
}
4. Conecte o framework
src/setup.ts — a configuração central. Precisa rodar antes de qualquer módulo importar suas sections, loaders ou matchers:
import { createSiteSetup } from "@decocms/start/setup";
import { autoconfigApps } from "@decocms/start/apps";
export const setup = createSiteSetup({
siteName: "minha-loja",
sectionsGlob: import.meta.glob("./sections/**/*.tsx", { eager: true }),
apps: autoconfigApps(),
});
src/worker-entry.ts — a camada mais externa do Worker. import "./setup" precisa ser a primeiríssima linha:
import "./setup";
import { createDecoWorkerEntry } from "@decocms/start/sdk/workerEntry";
import {
handleMeta,
handleDecofile,
handleRender,
handleInvoke,
} from "@decocms/start/admin";
import serverEntry from "./server";
export default createDecoWorkerEntry(serverEntry, {
admin: { handleMeta, handleDecofile, handleRender, handleInvoke },
});
src/server.ts — o server entry do TanStack Start. Também importa ./setup primeiro:
import "./setup";
import { createServerEntry } from "@tanstack/react-start/server";
import { createRouter } from "./router";
export default createServerEntry({ createRouter });
5. Adicione as rotas do CMS
src/routes/__root.tsx — o shell global:
import { DecoRootLayout } from "@decocms/start/hooks";
import { createRootRouteWithContext, Outlet } from "@tanstack/react-router";
export const Route = createRootRouteWithContext()({
component: () => (
<DecoRootLayout>
<Outlet />
</DecoRootLayout>
),
});
src/routes/index.tsx — a homepage, plugada no CMS:
import { createFileRoute } from "@tanstack/react-router";
import { cmsHomeRouteConfig } from "@decocms/start/routes";
export const Route = createFileRoute("/")(
cmsHomeRouteConfig({ siteName: "minha-loja" }),
);
src/routes/$.tsx — o catch-all para todas as outras URLs do CMS:
import { createFileRoute } from "@tanstack/react-router";
import { cmsRouteConfig } from "@decocms/start/routes";
export const Route = createFileRoute("/$")(
cmsRouteConfig({
siteName: "minha-loja",
ignoreSearchParams: ["skuId"],
}),
);
src/router.ts — conecta a route tree gerada pelo TanStack Router:
import { createRouter as createTanStackRouter } from "@tanstack/react-router";
import { routeTree } from "./routeTree.gen";
export const createRouter = () =>
createTanStackRouter({ routeTree });
6. Conecte ao CMS
Cada site precisa do seu próprio siteName e do conteúdo em .deco/blocks/ . O CMS guarda o conteúdo em dois lugares:
.deco/blocks/*.json— fonte da verdade, commitada. Edite viaadmin.deco.cx, sincronize para disco com o daemon.src/server/cms/blocks.gen.json— bundle gerado que o framework carrega em runtime.
Provisione o site no admin.deco.cx , aponte para o seu dev server local com o daemon e puxe o conteúdo inicial em .deco/blocks/ . Em seguida gere o bundle pela primeira vez:
npx deco generate-blocks
(O nome do comando e o wiring exato ainda estão estabilizando; consulte a referência do framework para os scripts atuais.)
7. Configure commerce (opcional)
Se sua loja usa VTEX ou Shopify, configure o block correspondente no admin (ou direto em .deco/blocks/ ).
- VTEX — precisa de
accountmais os secretsappKey/appToken. - Shopify — precisa de
storeNamemais um Storefront access token.
Veja Visão geral de commerce.
8. Rode o dev server
npx vite dev
O Vite serve a loja em http://localhost:5173 (ou qualquer PORT que você configure). A primeira requisição dispara o tunnel do daemon que mantém admin.deco.cx em sincronia com seu site local.
9. Deploy no Cloudflare Workers
npx vite build
npx wrangler deploy
Configure secrets via wrangler secret put ou pelo painel do Cloudflare. Veja Deployment no Cloudflare Workers para bindings de KV, observabilidade e checklists de produção.
O que vem pronto
Plugando os arquivos acima você ganha:
- O pipeline de build Vite + Cloudflare + TanStack Start.
- Um Worker entry com rotas do admin e cache de borda.
- O setup do site com glob de sections, blocks, matchers e init de plataforma.
- Uma rota catch-all + home via
cmsRouteConfig/cmsHomeRouteConfig. - Os arquivos gerados
blocks.gen.ts,sections.gen.ts,meta.gen.json,loaders.gen.ts(após o primeiro generate).
A partir daí, é trocar peça por peça no seu ritmo.
Veja também
Found an error or want to improve this page?
Edit this page