Guía completa de Cloudflare Pages: despliega React/Vue/Next.js (configuración y errores frecuentes)

Introducción
Terminas tu proyecto React y quieres publicarlo online. Abres la página de configuración de Cloudflare Pages y te quedas mirando «Build Command» y «Build Output Directory». ¿Qué pones en Build Command? ¿npm run build o npm build? ¿El directorio de salida es build o dist? ¿Cómo configuras las variables de entorno?
Este artículo te guía paso a paso para desplegar proyectos React, Vue y Next.js en Cloudflare Pages: checklist completa de configuración, variables de entorno y solución a 5 errores frecuentes (especialmente el error nodejs_compat de Next.js).
¿Por qué elegí Cloudflare Pages?
Seguro te preguntas: si ya existen Vercel y Netlify, ¿para qué Cloudflare Pages?
Yo también empecé con Vercel. No es malo, pero el plan gratuito tiene límites. Con varios proyectos pequeños, el tráfico mensual superó los 100 GB y Vercel empezó a limitar la velocidad.
Comparé las tres plataformas y el plan gratuito de Cloudflare Pages destaca mucho:
El tráfico ilimitado es muy atractivo. Tengo varios proyectos personales en CF Pages y no me preocupo por el tráfico.
Casos ideales para Cloudflare Pages:
- Blog personal, portfolio
- Proyectos frontend medianos (SPA, sitios estáticos)
- Proyectos que necesitan aceleración global
- Proyectos con tráfico impredecible (tráfico ilimitado gratis)
Menos adecuado:
- Apps Next.js grandes con SSR complejo (el soporte de CF Pages para Next.js no es tan maduro como Vercel)
- Proyectos que requieren builds muy frecuentes (límite de 500 builds/mes)
- Proyectos que dependen de funciones exclusivas de Vercel (como Edge Middleware)
Preparación antes del despliegue
Antes de empezar, necesitas:
- Registrar una cuenta en Cloudflare
- Ve a Cloudflare y regístrate (gratis)
- Verifica el correo y ya puedes empezar
- Preparar tu repositorio de código
- Sube el código a GitHub o GitLab
- CF Pages obtiene el código directamente de tu repositorio Git para construir
- Conocer la configuración de build de tu proyecto
- ¿Usas Create React App o Vite?
- ¿Cuál es el comando de build? (normalmente
npm run build) - ¿En qué directorio quedan los artefactos? (CRA:
build, Vite:dist)
Listo. Pasemos al despliegue en la práctica.
Flujo completo de despliegue de aplicaciones React
React es uno de los frameworks frontend más usados. He desplegado varios proyectos React en CF Pages y aquí tienes una checklist fiable.
Crear un proyecto React rápidamente (si aún no tienes uno)
Si quieres seguir el tutorial pero no tienes proyecto, puedes crear uno al vuelo:
# Método 1: Vite (recomendado, build más rápido)
npm create vite@latest my-react-app -- --template react
cd my-react-app
npm install
# Método 2: Create React App (clásico)
npx create-react-app my-react-app
cd my-react-app
Personalmente recomiendo Vite: el build es mucho más rápido. Con CRA, en proyectos grandes el build se vuelve lento.
Checklist de configuración en Cloudflare Pages
Inicia sesión en Cloudflare Dashboard, entra en Pages, haz clic en «Crear proyecto» → «Conectar a Git» y elige tu repositorio de GitHub.
Verás la página de configuración; aquí está lo clave:
Explicación de los campos:
| Campo | Proyecto Vite | Proyecto CRA |
|---|---|---|
| Framework preset | None | Create React App |
| Build command | npm run build | npm run build |
| Build output directory | dist | build |
| Root directory | / (por defecto) | / (por defecto) |
| Environment variables | prefijo VITE_* | prefijo REACT_APP_* |
Notas:
- En Vite, Framework preset «None» basta; CF Pages lo detecta automáticamente
- En CRA, el preset «Create React App» rellena la configuración
- Lo que más se confunde es el directorio de salida: Vite usa
dist, CRA usabuild; no los inviertas
Configuración de variables de entorno
Las variables de entorno en React tienen un requisito especial: deben llevar un prefijo concreto para exponerse al cliente.
Proyecto Vite:
- Prefijo obligatorio:
VITE_ - Ejemplos:
VITE_API_URL,VITE_API_KEY
Proyecto CRA:
- Prefijo obligatorio:
REACT_APP_ - Ejemplos:
REACT_APP_API_URL,REACT_APP_API_KEY
Cómo configurarlas:
- En Cloudflare Pages (recomendado):
- Proyecto → Settings → Environment variables
- Haz clic en «Add variable»
- Elige el entorno: Production o Preview
- Introduce nombre y valor
- Uso en el código:
// Proyecto Vite
const apiUrl = import.meta.env.VITE_API_URL;
// Proyecto CRA
const apiUrl = process.env.REACT_APP_API_URL;
Variables de entorno en desarrollo local:
Crea un archivo .env.local en la raíz del proyecto:
# Proyecto Vite
VITE_API_URL=https://api.example.com
VITE_API_KEY=your-api-key-here
# Proyecto CRA
REACT_APP_API_URL=https://api.example.com
REACT_APP_API_KEY=your-api-key-here
Recordatorio importante:
- ¡No subas
.env.locala Git! Añade.env*.localen.gitignore - Tras modificar variables de entorno, debes volver a desplegar
Resolver el 404 de rutas SPA
Si tu proyecto React usa React Router, tras el despliegue puedes encontrarte con un problema: al refrescar la página aparece 404.
En una SPA todas las rutas deben servir index.html, pero el servidor busca un archivo concreto por defecto.
Solución:
Crea un archivo _redirects en el directorio public:
/* /index.html 200
Una sola línea: le dice al servidor que todas las rutas redirijan a index.html con código 200.
Guarda y vuelve a desplegar; las rutas funcionarán.
Verificar que el despliegue fue exitoso
Tras «Save and Deploy», CF Pages inicia el build. Puedes ver el log en «Deployments».
Señales de éxito:
- El log muestra «Success: Deployed to…»
- Te da un enlace
xxx.pages.dev - Al abrirlo ves tu proyecto
Si el build falla:
- Revisa el log para ver el error
- Causas frecuentes:
- Directorio de salida incorrecto (Vite escrito como build, o CRA como dist)
- Versión de Node demasiado antigua (configura la variable
NODE_VERSION=18) - Fallo al instalar dependencias (revisa package.json)
Flujo completo de despliegue de aplicaciones Vue
El despliegue de Vue es similar al de React, pero con algunos detalles a tener en cuenta.
Crear un proyecto Vue rápidamente (opcional)
# Método 1: Vite (recomendado)
npm create vite@latest my-vue-app -- --template vue
cd my-vue-app
npm install
# Método 2: Vue CLI
vue create my-vue-app
cd my-vue-app
También recomiendo Vite por el rendimiento.
Checklist de configuración en Cloudflare Pages
| Campo | Proyecto Vite | Proyecto Vue CLI |
|---|---|---|
| Framework preset | None | Vue |
| Build command | npm run build | npm run build |
| Build output directory | dist | dist |
| Root directory | / (por defecto) | / (por defecto) |
| Environment variables | prefijo VITE_* | prefijo VUE_APP_* |
Recuerda:
- Vue CLI y Vite usan
distcomo directorio de salida (a diferencia de React) - Los prefijos difieren: Vite usa
VITE_, Vue CLI usaVUE_APP_
Configuración de variables de entorno
Proyecto Vite + Vue:
# .env.local
VITE_API_BASE_URL=https://api.example.com
VITE_APP_TITLE=My Vue App
Proyecto Vue CLI:
# .env.production
VUE_APP_API_BASE_URL=https://api.example.com
VUE_APP_TITLE=My Vue App
Uso en el código:
// Proyecto Vite
const apiUrl = import.meta.env.VITE_API_BASE_URL;
// Proyecto Vue CLI
const apiUrl = process.env.VUE_APP_API_BASE_URL;
Configuración de rutas con Vue Router
Si usas Vue Router, especialmente en modo History, configura la redirección; si no, al refrescar verás 404.
Método 1: archivo _redirects (recomendado)
Crea _redirects en public:
/* /index.html 200
Método 2: configurar en vite.config.js (proyectos Vite)
Si el proyecto no se despliega en la raíz, configura base:
// vite.config.js
export default {
base: '/', // asegúrate de que sea la ruta raíz
}
Solución de problemas frecuentes
Problema 1: recursos estáticos en 404
Revisa publicPath o base en vue.config.js (Vue CLI) o vite.config.js (Vite):
// vue.config.js (Vue CLI)
module.exports = {
publicPath: '/', // asegúrate de que sea la ruta raíz
}
Problema 2: error de build Vite «Unknown file extension»
Suele deberse a una versión de Node demasiado antigua. Añade en las variables de entorno de CF Pages:
NODE_VERSION=18
Luego vuelve a desplegar.
Flujo completo de despliegue de Next.js (¡importante!)
Desplegar Next.js en Cloudflare Pages es, sinceramente, lo más complejo de los tres frameworks. La primera vez me bloqueó medio día el error nodejs_compat; tuve que buscar mucha documentación para resolverlo.
Si tu proyecto Next.js necesita mucho SSR, sigo recomendando Vercel. Pero para sitios estáticos o SSR sencillo, CF Pages basta sobrado, y el tráfico ilimitado gratis es una ventaja enorme.
Particularidades del despliegue de Next.js
Antes de empezar, ten en cuenta estos puntos:
- Cloudflare Pages no está pensado solo para Next.js (a diferencia de Vercel) y requiere configuración extra
- Hay dos formas de despliegue: exportación estática (la más simple) y modo SSR (requiere adaptador)
- Para SSR usa el adaptador
@opennextjs/cloudflare(el antiguo@cloudflare/next-on-pagesestá obsoleto)
Método 1: exportación estática (la más simple, recomendada para empezar)
Si tu proyecto Next.js no necesita SSR, API Routes, ISR, etc., la exportación estática es la forma más sencilla.
Casos de uso:
- Blog personal
- Sitio de documentación
- Sitio de presentación
- Proyectos sin datos dinámicos en servidor
Pasos de configuración:
- Modifica
next.config.js:
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'export', // clave: activa exportación estática
images: {
unoptimized: true, // CF Pages no soporta Image Optimization de Next.js
},
}
module.exports = nextConfig
- Configuración en Cloudflare Pages:
| Campo | Valor |
|---|---|
| Framework preset | Next.js (Static HTML Export) |
| Build command | npm run build |
| Build output directory | out |
| Root directory | / (por defecto) |
- Despliegue:
Guarda la configuración y despliega. Tras un build exitoso tendrás un sitio estático.
Limitaciones:
- ❌ No soporta API Routes
- ❌ No soporta ISR (Incremental Static Regeneration)
- ❌ No soporta Server Components
- ❌ No soporta SSR en rutas dinámicas
Si puedes vivir con estas limitaciones, la exportación estática es suficiente.
Método 2: modo SSR (adaptador OpenNext)
Si necesitas API Routes, SSR, rutas dinámicas, etc., debes usar un adaptador. Es un poco más complejo, pero lo explico con claridad.
Instalar el adaptador:
npm install @opennextjs/cloudflare
Configurar next.config.js:
/** @type {import('next').NextConfig} */
const nextConfig = {
// no configures output: 'export'
images: {
unoptimized: true,
},
}
module.exports = nextConfig
Configuración en Cloudflare Pages:
| Campo | Valor |
|---|---|
| Framework preset | None |
| Build command | npx @opennextjs/cloudflare |
| Build output directory | .worker-next |
| Root directory | / |
¡Importante! Configurar Compatibility Flags (donde más se falla):
Este paso es clave; mucha gente se queda aquí. La primera vez no lo configuré y apareció el error nodejs_compat is not defined.
- Proyecto → Settings → Functions
- Busca la sección Compatibility flags
- Haz clic en Configure Production compatibility flag
- Añade el flag:
nodejs_compat - Configura Compatibility Date: al menos
2024-09-23(o más reciente)
Nota:
- Configura Production y Preview
- Sin este flag, tras el despliegue verás error 500 directamente
Requisito Edge Runtime:
Si usas API Routes o Server Components, debes añadir la declaración Edge Runtime:
// app/api/hello/route.js
export const runtime = 'edge'; // ¡clave! añade esta línea
export async function GET(request) {
return new Response(JSON.stringify({ message: 'Hello from CF Pages' }), {
headers: { 'content-type': 'application/json' },
});
}
// pages/api/hello.js (Pages Router)
export const config = {
runtime: 'edge', // ¡clave! añade esta línea
};
export default function handler(req) {
return new Response(JSON.stringify({ message: 'Hello from CF Pages' }), {
headers: { 'content-type': 'application/json' },
});
}
Todos los archivos que se ejecuten en el servidor deben incluir esta declaración, si no el despliegue fallará.
Variables de entorno en Next.js
Las variables de entorno en Next.js se dividen en dos tipos:
1. Variables de cliente (prefijo obligatorio):
# .env.local
NEXT_PUBLIC_API_URL=https://api.example.com
NEXT_PUBLIC_SITE_NAME=My Next.js Site
2. Variables de servidor (sin prefijo):
# .env.local
DATABASE_URL=postgresql://...
API_SECRET=your-secret-key
Configuración en Cloudflare Pages:
Entra en Settings → Environment variables y añade variables eligiendo el entorno (Production/Preview).
Uso en el código:
// Cliente
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
// Servidor (API Route o Server Component)
const dbUrl = process.env.DATABASE_URL;
Errores frecuentes de Next.js y soluciones (¡importante!)
Aquí recopilo 5 errores que más he visto y cómo resolverlos.
Error 1: nodejs_compat is not defined o error 500
Mensaje de error:
Error: The global scope does not support nodejs_compat
O el despliegue parece exitoso pero al abrir la página hay error 500.
Causa:
Falta el flag de compatibilidad nodejs_compat.
Solución:
- Proyecto → Settings → Functions
- Busca Compatibility flags
- Añade
nodejs_compaten Production y Preview - Vuelve a desplegar
A mí me costó un rato; en cuanto lo configuré, funcionó al instante.
Error 2: despliegue exitoso pero la página muestra 404
Síntomas:
- El log de build indica éxito
- Al visitar
xxx.pages.devaparece 404 - O solo la home funciona y el resto da 404
Causas:
- Edge Runtime mal configurado
- Build output directory incorrecto
Solución:
- Comprueba que todas las API Routes y Server Components tengan
runtime = 'edge' - Confirma que Build output directory sea
.worker-next(con adaptador) uout(exportación estática) - En exportación estática, comprueba si creaste el archivo
_redirects
Error 3: FinalizationRegistry is not defined
Mensaje de error:
ReferenceError: FinalizationRegistry is not defined
Causa:
Compatibility Date demasiado antigua; no soporta características JavaScript recientes.
Solución:
- Settings → Functions
- Actualiza Compatibility Date a
2024-09-23o más reciente - Vuelve a desplegar
Error 4: build demasiado largo o fallido
Síntomas:
- El build tarda más de 10 minutos
- O aparece «Build exceeded maximum duration»
Causas:
- Uso de Turbopack (
next dev --turbo) - Proyecto muy grande con demasiadas dependencias
Solución:
- Comprueba Build command: debe ser
npx @opennextjs/cloudflare, sin parámetro--turbo - Limpia dependencias innecesarias:
npm prune - Valora la exportación estática si te sirve
Error 5: error de Image Optimization
Mensaje de error:
Error: Image Optimization using Next.js' default loader is not compatible with `output: 'export'`.
Causa:
Cloudflare Pages no soporta la API de Image Optimization de Next.js.
Solución:
Desactívala en next.config.js:
module.exports = {
images: {
unoptimized: true,
},
}
Si necesitas optimizar imágenes, puedes usar:
- Cloudflare Images (servicio de pago)
- CDN de terceros (como Cloudinary)
- Procesar imágenes tú mismo (comprimir antes de subir)
Gestión avanzada de variables de entorno
Al principio las variables de entorno me confundían, sobre todo cómo distinguir desarrollo, preview y producción. Con el tiempo encontré un método claro.
Distinguir los tres entornos
Cloudflare Pages soporta tres entornos:
| Entorno | Disparador | Uso |
|---|---|---|
| Production | push a rama principal (ej. main) | Producción, acceso de usuarios |
| Preview | push a otras ramas o PR | Preview, prueba de funciones nuevas |
| Development | desarrollo local | Solo en tu máquina |
Configuración en Cloudflare Dashboard
Proyecto → Settings → Environment variables
Verás dos pestañas:
- Production: variables de producción
- Preview: variables de preview
Configuración recomendada:
- Variables de producción (API Key real, conexión a BD, etc.):
- Tipo Secret (cifrado, no aparece en logs)
- Ejemplo:
API_KEY=prod-key-12345
- Variables de preview (API Key de prueba):
- Puede ser Plain text
- Ejemplo:
API_KEY=test-key-67890
Variables de entorno en desarrollo local
Estructura de archivos recomendada:
my-project/
├── .env.local # variables locales (no subir a Git)
├── .env.example # plantilla (sí subir a Git)
├── .gitignore # ignorar archivos sensibles
Ejemplo de .env.local:
# Configuración API
VITE_API_BASE_URL=http://localhost:3000/api
VITE_API_KEY=local-dev-key
# Interruptores de funciones
VITE_ENABLE_DEBUG=true
VITE_ENABLE_ANALYTICS=false
# Servicios de terceros
VITE_GOOGLE_ANALYTICS_ID=G-XXXXXXXXXX
Ejemplo de .env.example:
# Configuración API
VITE_API_BASE_URL=your-api-url-here
VITE_API_KEY=your-api-key-here
# Interruptores de funciones
VITE_ENABLE_DEBUG=false
VITE_ENABLE_ANALYTICS=true
Recordatorio importante:
- No subas
.env.locala Git - Sí sube
.env.examplepara que el equipo tenga referencia - Añade en
.gitignore:.env*.local
Tabla rápida de prefijos de variables de entorno
Los prefijos varían según el framework; aquí tienes una tabla de referencia:
| Framework/herramienta | Prefijo cliente | Prefijo servidor |
|---|---|---|
| Vite (cualquier framework) | VITE_ | sin prefijo (el cliente no puede acceder) |
| Create React App | REACT_APP_ | sin variables de servidor |
| Vue CLI | VUE_APP_ | sin variables de servidor |
| Next.js | NEXT_PUBLIC_ | sin prefijo |
Truco para recordar:
- Si la variable se lee en el navegador, lleva prefijo
- Si solo se usa en el servidor (API Key, contraseña de BD), no lleva prefijo
¿Cómo depurar variables que no surten efecto?
He tenido varias veces variables configuradas que no funcionaban. Aquí va una checklist:
Pasos de depuración:
- Comprueba el prefijo
- ¿Proyecto Vite con prefijo
REACT_APP_? (debería serVITE_) - ¿Variables de cliente Next.js sin
NEXT_PUBLIC_?
- ¿Proyecto Vite con prefijo
- Confirma que redeployaste
- Tras modificar variables debes lanzar un nuevo despliegue
- Haz un push pequeño a Git o pulsa «Retry deployment» en el Dashboard
- Verifica el entorno correcto
- ¿Modificaste Production pero accedes al enlace Preview?
- ¿O al revés?
- Revisa los logs de build
- Busca el nombre de la variable
- Confirma que se lee correctamente (las Secret no muestran el valor)
- Comprueba la referencia en el código
// ❌ Incorrecto (proyecto Vite)
const apiUrl = process.env.VITE_API_URL;
// ✅ Correcto (proyecto Vite)
const apiUrl = import.meta.env.VITE_API_URL;
Técnicas avanzadas y buenas prácticas
Desplegar con éxito es solo el primer paso; estas técnicas harán tu proyecto más profesional.
Vincular un dominio personalizado
El dominio xxx.pages.dev no transmite mucha confianza; vincular tu propio dominio es sencillo.
Pasos:
- Añadir dominio en Cloudflare Pages:
- Proyecto → Custom domains
- Haz clic en Set up a custom domain
- Introduce tu dominio (ej.
blog.example.com)
- Configurar registro DNS:
- Si el dominio ya está en Cloudflare, se añade el CNAME automáticamente
- Si el dominio está en otro proveedor, añádelo manualmente:
CNAME blog your-project.pages.dev
- Esperar la generación del certificado SSL:
- Cloudflare solicita un certificado SSL gratuito
- Suele tardar 5-10 minutos
Después podrás acceder con tu dominio y HTTPS automático.
Preview Deployments (despliegues de preview)
Esta función encaja muy bien con el trabajo en equipo. Cada push a una rama distinta de la principal o cada Pull Request crea un entorno de preview automáticamente.
Cómo usarlo:
- Crea una rama nueva:
git checkout -b feature/new-button
- Modifica el código y haz push:
git add .
git commit -m "Add new button"
git push origin feature/new-button
- CF Pages construye y genera un enlace de preview:
https://abc123.your-project.pages.dev
- Revisa el enlace de preview en el PR y prueba la función nueva
- Al fusionar a la rama principal, se despliega automáticamente a producción
Ventajas:
- Cada rama de funcionalidad tiene su propio entorno de preview
- Product managers y diseñadores pueden ver el resultado directamente
- No afecta al entorno de producción
Optimización de caché de build
Si cada build tarda mucho, prueba optimizar la caché.
Añadir configuración de caché en el proyecto:
Cloudflare Pages cachea node_modules automáticamente, pero puedes ir más allá:
- Usar pnpm (más rápido que npm):
# Añade .npmrc al proyecto
echo "package-manager=pnpm" > .npmrc
- Configurar en CF Pages:
- Cambia Build command a:
pnpm install && pnpm build
- Cambia Build command a:
- Eliminar dependencias innecesarias:
npm prune
Mi experiencia:
Tras cambiar a pnpm, el tiempo de build bajó de 5 minutos a 2; la diferencia se nota.
Configurar headers personalizados
Si quieres añadir HTTP headers personalizados (política de seguridad, control de caché), crea un archivo _headers en la raíz del proyecto:
# Ejemplo de archivo _headers
/*
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
/static/*
Cache-Control: public, max-age=31536000, immutable
/api/*
Cache-Control: no-cache
Guarda y vuelve a desplegar; los headers entrarán en vigor.
Resumen
En resumen, todo se reduce a tres puntos:
1. Entiende la configuración de build de tu proyecto
- ¿Cuál es el Build command? (normalmente
npm run build) - ¿Dónde está el directorio de salida? (Vite:
dist, CRA:build, Next.js según el modo) - ¿Qué variables de entorno necesitas? (atención a los prefijos)
2. Cuidado con las trampas frecuentes
- Flag
nodejs_compaten Next.js (sin él, error 500) - Prefijos de variables de entorno (Vite usa
VITE_, Next usaNEXT_PUBLIC_) - 404 en rutas SPA (recuerda el archivo
_redirects)
3. Aprovecha el entorno Preview
- No pruebes directamente en producción
- Crea un entorno Preview con una rama
- Fusiona a la rama principal solo cuando todo funcione
Cloudflare Pages no es tan difícil; la primera configuración lleva tiempo, pero una vez lista basta con git push para desplegar automáticamente.
Y el tráfico ilimitado gratis es una ventaja enorme: tengo varios proyectos personales en CF Pages sin ansiedad por el tráfico.
Si tienes problemas:
- Revisa la sección de errores frecuentes; la mayoría ya las he pisado yo
- Mira los logs de build; el mensaje de error suele indicar qué falló
- La documentación oficial está en inglés pero es detallada: Cloudflare Pages Docs
Próximos pasos:
- Despliega tu primer proyecto en Cloudflare Pages
- Prueba a vincular un dominio personalizado
- Experimenta con Preview Deployments
Si tienes dudas, déjalas en los comentarios; las revisaré. ¡Buen despliegue!
Flujo completo para desplegar React/Vue/Next.js en Cloudflare Pages
Desde la preparación hasta la configuración del despliegue, variables de entorno y solución a errores frecuentes, con enfoque en nodejs_compat para Next.js
Estimated time: PT30M
-
1
Step 1: Preparación y por qué elegir Cloudflare Pages
Registrar cuenta en Cloudflare: -
2
Step 2: Desplegar aplicaciones React (Vite y CRA)
Checklist de Cloudflare Pages: -
3
Step 3: Desplegar aplicaciones Vue (Vite y Vue CLI)
Checklist de Cloudflare Pages: -
4
Step 4: Desplegar Next.js (exportación estática y modo SSR)
Particularidades de Next.js: -
5
Step 5: Resolver errores frecuentes de Next.js y gestión de variables
Errores frecuentes de Next.js: -
6
Step 6: Gestión avanzada de variables y buenas prácticas
Tres entornos:
FAQ
¿Por qué elegir Cloudflare Pages en lugar de Vercel o Netlify? ¿Qué ventajas tiene el plan gratuito?
Comparativa de funciones:
• Tráfico ilimitado gratis (Vercel y Netlify solo 100 GB/mes)
• 500 builds/mes (Vercel 6000 minutos/mes, Netlify 300 minutos/mes)
• Soporte para proyectos comerciales (Vercel con limitaciones, Netlify sí)
• Más de 300 nodos CDN (distribución global, HTTPS automático)
El tráfico ilimitado es muy atractivo: tengo varios proyectos personales en CF Pages y no me preocupo por el tráfico.
Casos ideales para Cloudflare Pages:
• Blog personal, portfolio
• Proyectos frontend medianos (SPA, sitios estáticos)
• Proyectos que necesitan aceleración global
• Proyectos con tráfico impredecible
Menos adecuado:
• Apps Next.js grandes con SSR complejo (el soporte de CF Pages para Next.js no es tan maduro como Vercel)
• Proyectos que requieren builds muy frecuentes (límite de 500 builds/mes)
• Proyectos que dependen de funciones exclusivas de Vercel (como Edge Middleware)
¿Qué diferencias hay en la configuración de build entre React/Vue/Next.js? ¿Cuál es el directorio de salida?
Proyecto Vite:
• Framework preset: None (CF Pages lo detecta automáticamente)
• Build command: npm run build
• Build output directory: dist
• Root directory: / (por defecto)
• Environment variables: prefijo VITE_*
Proyecto CRA:
• Framework preset: Create React App (la configuración se rellena sola)
• Build command: npm run build
• Build output directory: build
• Root directory: / (por defecto)
• Environment variables: prefijo REACT_APP_*
Atención: el directorio de salida es lo que más se confunde — Vite usa dist, CRA usa build; no los inviertas.
Configuración Vue:
Proyecto Vite:
• Framework preset: None
• Build command: npm run build
• Build output directory: dist
• Root directory: / (por defecto)
• Environment variables: prefijo VITE_*
Proyecto Vue CLI:
• Framework preset: Vue
• Build command: npm run build
• Build output directory: dist
• Root directory: / (por defecto)
• Environment variables: prefijo VUE_APP_*
Recuerda: Vue CLI y Vite usan dist (a diferencia de React); solo cambian los prefijos (Vite VITE_, Vue CLI VUE_APP_).
Configuración Next.js:
Exportación estática:
• Framework preset: Next.js (Static HTML Export)
• Build command: npm run build
• Build output directory: out
• Root directory: / (por defecto)
Modo SSR:
• Framework preset: None
• Build command: npx @opennextjs/cloudflare
• Build output directory: .worker-next
• Root directory: /
¿Qué prefijos requieren las variables de entorno? ¿En qué se diferencian los frameworks?
React:
• Vite: prefijo obligatorio VITE_ (ej.: VITE_API_URL, VITE_API_KEY)
• CRA: prefijo obligatorio REACT_APP_ (ej.: REACT_APP_API_URL, REACT_APP_API_KEY)
Vue:
• Vite+Vue: prefijo obligatorio VITE_ (ej.: VITE_API_BASE_URL, VITE_APP_TITLE)
• Vue CLI: prefijo obligatorio VUE_APP_ (ej.: VUE_APP_API_BASE_URL, VUE_APP_TITLE)
Next.js:
• Variables de cliente (prefijo obligatorio NEXT_PUBLIC_, ej.: NEXT_PUBLIC_API_URL, NEXT_PUBLIC_SITE_NAME)
• Variables de servidor (sin prefijo, ej.: DATABASE_URL, API_SECRET)
Tabla rápida de prefijos:
• Vite (cualquier framework): cliente VITE_, servidor sin prefijo (pero el cliente no puede acceder)
• Create React App: cliente REACT_APP_, sin variables de servidor
• Vue CLI: cliente VUE_APP_, sin variables de servidor
• Next.js: cliente NEXT_PUBLIC_, servidor sin prefijo
Truco para recordar:
• Si la variable se usa en el navegador, lleva prefijo
• Si solo se usa en el servidor (API Key, contraseña de BD), no lleva prefijo
Uso en código:
• Vite: import.meta.env.VITE_API_URL
• CRA: process.env.REACT_APP_API_URL
• Vue CLI: process.env.VUE_APP_API_BASE_URL
• Next.js cliente: process.env.NEXT_PUBLIC_API_URL
• Next.js servidor: process.env.DATABASE_URL
¿Cuál es la configuración clave para desplegar Next.js en Cloudflare Pages? ¿Cómo resolver el error nodejs_compat?
• Cloudflare Pages no está diseñado solo para Next.js (a diferencia de Vercel) y requiere configuración extra
• Dos formas de despliegue: exportación estática (la más simple) y modo SSR (requiere adaptador)
• Para SSR usa el adaptador @opennextjs/cloudflare (@cloudflare/next-on-pages está obsoleto)
Exportación estática:
• Modifica next.config.js:
- output: 'export' (clave: activa exportación estática)
- images: { unoptimized: true } (CF Pages no soporta Image Optimization de Next.js)
• Configuración Cloudflare Pages:
- Framework preset: Next.js (Static HTML Export)
- Build command: npm run build
- Build output directory: out
Limitaciones:
• No soporta API Routes
• No soporta ISR
• No soporta Server Components
• No soporta SSR en rutas dinámicas
Modo SSR:
• Instala el adaptador: npm install @opennextjs/cloudflare
• Configura next.config.js (sin output: 'export', con images: { unoptimized: true })
• Configuración Cloudflare Pages:
- Framework preset: None
- Build command: npx @opennextjs/cloudflare
- Build output directory: .worker-next
¡Importante! Compatibility Flags (donde más se falla):
• Proyecto → Settings → Functions
• Compatibility flags → Configure Production compatibility flag
• Añade el flag nodejs_compat
• Compatibility Date al menos 2024-09-23 (o más reciente)
Nota: configura Production y Preview; sin este flag, tras el despliegue verás error 500.
Requisito Edge Runtime:
• Si usas API Routes o Server Components, añade la declaración Edge Runtime:
- App Router: export const runtime = 'edge'
- Pages Router: export const config = { runtime: 'edge' }
• Todos los archivos que se ejecuten en el servidor deben incluirla, si no el despliegue fallará
¿Cómo resolver el 404 de rutas SPA? ¿Qué hacer si Next.js muestra 404 tras el despliegue?
• Con React Router, al refrescar la página puede aparecer 404: el servidor busca un archivo en lugar de index.html
Solución:
• Crea un archivo _redirects en public con: /* /index.html 200
• Una sola línea: todas las rutas redirigen a index.html con código 200
• Guarda y vuelve a desplegar; las rutas funcionarán
Configuración Vue Router:
• Con Vue Router, especialmente en modo History, configura la redirección; si no, al refrescar verás 404
Método 1: archivo _redirects (recomendado)
• Crea _redirects en public con: /* /index.html 200
Método 2: vite.config.js (proyectos Vite)
• Si el proyecto no se despliega en la raíz, configura base: '/'
Next.js muestra 404 tras despliegue:
• Error 2: despliegue exitoso pero la página muestra 404
• Síntomas: el log de build indica éxito, xxx.pages.dev muestra 404, o solo la home funciona
• Causas: Edge Runtime mal configurado o Build output directory incorrecto
Soluciones:
• Comprueba que todas las API Routes y Server Components tengan runtime = 'edge'
• Confirma que Build output directory sea .worker-next (adaptador) u out (exportación estática)
• En exportación estática, comprueba si creaste el archivo _redirects
¿Cómo depurar variables de entorno que no funcionan? ¿Cómo distinguir desarrollo, preview y producción?
1) Comprueba el prefijo:
• ¿Proyecto Vite con prefijo REACT_APP_? Debería ser VITE_
• ¿Variables de cliente Next.js sin NEXT_PUBLIC_?
2) Confirma que redeployaste:
• Tras modificar variables de entorno debes lanzar un nuevo despliegue
• Haz un push pequeño a Git o pulsa Retry deployment en el Dashboard
3) Verifica el entorno correcto:
• ¿Modificaste Production pero accedes al enlace Preview? ¿O al revés?
4) Revisa los logs de build:
• Busca el nombre de la variable en el log de build
• Las variables tipo Secret no muestran el valor
5) Comprueba cómo las referencias en el código:
• Error Vite: process.env.VITE_API_URL
• Correcto Vite: import.meta.env.VITE_API_URL
Tres entornos:
• Cloudflare Pages soporta tres entornos:
- Production (push a rama principal como main, acceso de usuarios)
- Preview (otras ramas o PR, pruebas de funciones nuevas)
- Development (desarrollo local, solo en tu máquina)
En Cloudflare Dashboard:
• Proyecto → Settings → Environment variables
• Verás dos pestañas: Production y Preview
Configuración recomendada:
• Production (API Key real, conexión a BD): tipo Secret (cifrado, no aparece en logs), ej.: API_KEY=prod-key-12345
• Preview (API Key de prueba): puede ser Plain text, ej.: API_KEY=test-key-67890
Variables locales:
• Estructura recomendada:
- .env.local (variables locales, no subir a Git)
- .env.example (plantilla, sí subir a Git)
- .gitignore (ignorar archivos sensibles)
Recordatorio:
• No subas .env.local a Git
• Sí sube .env.example para que el equipo tenga referencia
• Añade .env*.local en .gitignore
16 min de lectura · Publicado el: 1 dic 2025 · Actualizado el: 21 ago 2026
Cloudflare Full Stack
Si llegaste desde búsqueda, lo más rápido es ir al artículo anterior o siguiente de esta misma serie.
Anterior
Guía completa para desplegar blogs estáticos en Cloudflare Pages: 5 frameworks sin errores
Despliega blogs estáticos Astro, Hugo, Hexo, Gatsby y Eleventy desde Git: comandos de build, directorios de salida y solución a páginas en blanco y fallos de compilación. En línea en 10 minutos.
Parte 2 de 23
Siguiente
¿Falló el build de CF Pages? 8 problemas comunes y soluciones para ahorrarte medio día de depuración
Guía sistemática de 8 escenarios frecuentes de fallo de build en Cloudflare Pages: instalación de dependencias, versión de Node, timeouts, resolución de módulos y más. Incluye soluciones verificadas y medidas preventivas para localizar el problema rápido y ahorrar tiempo de depuración.
Parte 4 de 23



Comentarios
Inicia sesión con GitHub para dejar un comentario