Despliegue en el edge
Despliega aplicaciones EmberKit en runtimes edge o servidores Node tradicionales. La salida estática pre-renderizada funciona en cualquier CDN; las rutas dinámicas usan el bundle SSR de dist/server/entry-server.js.
Plataformas compatibles
| Plataforma | Runtime | Configuración típica |
|---|---|---|
| CDN estático | — | mode: 'static' o pre-render híbrido → subir dist/ |
| Node.js 18+ | Node | emberkit serve tras emberkit build |
| Cloudflare Workers | Aislamientos V8 | Adaptador @emberkit/edge + Wrangler |
| Deno Deploy | Deno | Adaptador Deno de @emberkit/edge |
| Bun | Bun | Ejecutar entrada SSR o dist/ estático |
Servidor de producción Node
Tras compilar en modo ssr o hybrid:
pnpm build
pnpm exec emberkit serve
serve lee dist/ssr-manifest.json, sirve HTML pre-renderizado y recurre a dist/server/entry-server.js para rutas dinámicas.
Para una comprobación local más ligera:
pnpm preview # emberkit preview
Cloudflare Workers
pnpm add -D wrangler @cloudflare/workers-types @emberkit/edge
// wrangler.jsonc — patrón de producción (sitio Orange Ember)
{
"name": "my-app",
"main": "worker.ts",
"compatibility_date": "2026-04-03",
"compatibility_flags": ["global_fetch_strictly_public", "nodejs_compat"],
"assets": {
"directory": "./dist",
"binding": "ASSETS",
"not_found_handling": "single-page-application"
},
"observability": { "enabled": true }
}
O define los mismos valores por defecto en TypeScript:
import { defineWranglerConfig } from '@emberkit/edge';
export default defineWranglerConfig({
name: 'my-app',
main: 'worker.ts',
});
Entrada del worker (API compartida + dist/ estático):
import { createCloudflareWorker } from '@emberkit/edge';
import { handleApiRequest } from './src/server/api-router';
export default createCloudflareWorker({
handleApi: handleApiRequest,
injectPublicEnv: true, // expone PUBLIC_* en window.__CF_ENV__
});
Scripts: pnpm build && wrangler deploy, pnpm build && wrangler dev para vista previa, wrangler types para bindings Env.
Usa sqlRawPlugin / import sql from './schema.sql' sin más (vía emberkitVitePlugin) para que las migraciones SQL se empaqueten sin sistema de archivos en runtime.
Deno Deploy
Usa el adaptador Deno de @emberkit/edge con una salida dist/ compilada, o sirve solo archivos estáticos pre-renderizados:
deployctl deploy --project=my-app ./dist
Utilidades de tamaño de bundle
@emberkit/edge incluye utilidades para comprobar bundles edge:
import { analyzeBundle, minifyHTML, StaticPage } from '@emberkit/edge';
const stats = analyzeBundle(workerCode);
// stats.size, stats.warnings, stats.errors (límite duro 8KB)
const html = minifyHTML('<div> <p> Hello </p> </div>');
const page = new StaticPage('<html>...</html>');
page.addStyle('/styles/main.css');
page.addScript('/app.js');
const output = page.toHTML();
Constantes: EDGE_BUNDLE_SIZE_WARNING (1KB), MAX_BUNDLE_SIZE (8KB).
Patrones de despliegue
| Tipo de app | Config | Host |
|---|---|---|
| Marketing / docs | static o hybrid | Netlify, Cloudflare Pages, S3 |
| Estático + dinámico | hybrid | CDN para estático + Node/Worker para SSR |
| App autenticada | spa o ssr | Cualquier host estático + API |
Objetivos de rendimiento
La velocidad es el primer principio de EmberKit. Los despliegues edge-friendly combinan:
- HTML pre-renderizado en rutas estáticas — TTFB bajo y First Contentful Paint rápido en el CDN
- SSR en el edge solo donde las rutas necesitan datos por petición
- Hidratación selectiva — bundles cliente pequeños vía
data-ek-bindy JS mínimo en páginas de contenido
Siguientes pasos
- SSR y SSG — Modos de renderizado y salida de build
- Hidratación — Enlaces en el cliente
- SEO y meta — Meta tags y JSON-LD