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

PlataformaRuntimeConfiguración típica
CDN estáticomode: 'static' o pre-render híbrido → subir dist/
Node.js 18+Nodeemberkit serve tras emberkit build
Cloudflare WorkersAislamientos V8Adaptador @emberkit/edge + Wrangler
Deno DeployDenoAdaptador Deno de @emberkit/edge
BunBunEjecutar 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 appConfigHost
Marketing / docsstatic o hybridNetlify, Cloudflare Pages, S3
Estático + dinámicohybridCDN para estático + Node/Worker para SSR
App autenticadaspa o ssrCualquier 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-bind y JS mínimo en páginas de contenido

Siguientes pasos