@astrojs/cloudflare
Un adaptador SSR para usar con los objetivos de las funciones de Cloudflare Pages. Escribe tu código en Astro/Javascript y despliegalo en Cloudflare Pages.
Instalar
Agrega el adaptador de Cloudflare para habilitar el SSR en tu proyecto de Astro con el comando astro add
. Esto instalará el adaptador y realizará los cambios necesarios en tu archivo astro.config.mjs
en un solo paso.
Si prefieres instalar el adaptador manualmente en su lugar, sigue los siguientes dos pasos:
- Agrega el adaptador de Cloudflare como una dependencia de tu proyecto utilizando el gestor de paquetes de tu preferencia. Si estás utilizando npm o no estás seguro, ejecuta el siguiente comando en la terminal:
- Agrega lo siguiente a tu archivo
astro.config.mjs
:
Opciones
modo
mode: "advanced" | "directory"
Por defecto "advanced"
Esta opción de configuración define cómo se despliega tu proyecto de Astro en Cloudflare Pages.
mode:directory
- El modo
advanced
recoge el archivo_worker.js
de la carpetadist
- El modo
directory
recoge los ficheros de la carpetafunctions
, por defecto sólo se genera un fichero[[path]].js
.
Cambiar al modo de directorio te permite añadir manualmente archivos adicionales como plugins de Cloudflare Pages, Cloudflare Pages Middleware o funciones personalizadas utilizando enrutamiento de funciones de Cloudflare Pages.
En el modo directory
, el adaptador compilará la parte del lado del cliente de tu aplicación de la misma manera que en el modo advanced
de forma predeterminada, pero moverá el script del worker a una carpeta functions
en la raíz del proyecto. En este caso, el adaptador solo colocará un archivo [[path]].js
en esa carpeta, lo que te permitirá agregar plugins adicionales y middleware de páginas que pueden ser incluidos en el control de versiones.
Para compilar un paquete separado para cada página, establece la opción functionPerRoute
en la configuración de tu adaptador de Cloudflare. Esta opción requiere un mantenimiento manual de la carpeta functions
. Los archivos emitidos por Astro sobrescribirán los archivos existentes con nombres idénticos en la carpeta functions
, por lo que debes elegir nombres de archivo únicos para cada archivo que añadas manualmente. Además, el adaptador nunca vaciará la carpeta functions
de archivos obsoletos, por lo que deberás limpiar la carpeta manualmente cuando elimines páginas.
Este adaptador no admite el uso de edgeMiddleware
.
routes.strategy
routes.strategy: "auto" | "include" | "exclude"
por defecto "auto"
Determina como routes.json
será generado si no se provee un _routes.json personalizado.
Hay tres opciones disponibles:
-
"auto"
(por defecto): Seleccionará automáticamente la estrategia que genere la menor cantidad de entradas. Esto debería ser casi siempre suficiente, así que elige esta opción a menos que tengas una razón específica para no hacerlo. -
include
: Las páginas y endpoints que no sean pre-renderizados se enumeran como entradasinclude
, indicando a Cloudflare que invoque estas rutas como funciones. Las entradasexclude
solo se utilizan para resolver conflictos. Por lo general, la mejor estrategia cuando tu sitio web tiene principalmente páginas estáticas y solo algunas páginas o endpoints dinámicos.Ejemplo: Para
src/pages/index.astro
(estático),src/pages/company.astro
(estático),src/pages/users/faq.astro
(estático) ysrc/pages/users/[id].astro
(SSR) esto producirá el siguiente_routes.json
:exclude
: Las páginas pre-renderizadas se enumeran como entradasexclude
(indicando a Cloudflare que maneje estas rutas como activos estáticos). Por lo general, la mejor estrategia cuando tu sitio web tiene principalmente páginas o endpoints dinámicos y solo algunas páginas estáticas.Ejemplo: Para las mismas páginas que en el ejemplo anterior, esto producirá el siguiente
_routes.json
:
routes.include
routes.include: string[]
por defecto []
Si quieres usar la generación automática de _routes.json
, pero quieres incluir rutas adicionales (por ejemplo, cuando tienes funciones personalizadas en la carpeta functions
), puedes usar la opción routes.include
para agregar rutas adicionales al array include
.
routes.exclude
routes.exclude: string[]
por defecto []
Si quieres usar la generación automática de _routes.json
, pero quieres excluir rutas adicionales, puedes usar la opción routes.exclude
para agregar rutas adicionales al array exclude
.
El siguiente ejemplo automáticamente genera _routes.json
mientras incluye y excluye rutas adicionales. Ten en cuenta que esto solo es necesario si tienes funciones personalizadas en la carpeta functions
que no son manejadas por Astro.
imageService
imageService: "passthrough" | "cloudflare"
Determina qué servicio de imágenes es utilizado por el adaptador. El adaptador utilizará el modo passthrough
de forma predeterminada cuando se configure un servicio de imágenes incompatible. De lo contrario, utilizará el servicio de imágenes configurado globalmente:
cloudflare
: Usa el servicio de Redimensionamiento de Imagen de Cloudflare.passthrough
: Usa el servicio existentenoop
.
wasmModuleImports
wasmModuleImports: boolean
por defecto: false
Importar o no archivos .wasm
directamente como módulos ES usando la sintaxis de importación .wasm?module
.
Añade wasmModuleImports: true
a astro.config.mjs
para habilitar esta funcionalidad tanto en la compilación de Cloudflare como en el servidor de desarrollo de Astro. Lee más sobre el uso de módulos Wasm
runtime
runtime: { mode: "off" | "local", persistTo: string }
por defecto: { mode: 'off', persistTo: '' }
Determina si y como el Runtime de Cloudflare es añadido a astro dev
.
El Runtime de Cloudflare incluye Cloudflare Bindings, variables de entorno, y el objeto cf. Obtén más información sobre cómo acceder al Runtime de Cloudflare.
La propiedad mode
define como el runtime es agregado a astro dev
:
local
: utiliza simulaciones de bindings y placeholders estáticos locales.off
: no tiene acceso al runtime de Cloudflare usandoastro dev
. Alternativamente, puedes usar Vista previa con Wrangler.
La propiedad persistTo
define donde el runtime local es persistido cuando se usa mode: local
. Este valor es un directorio relativo a la ruta de ejecución de astro dev
.
El valor predeterminado se establece en .wrangler/state/v3
para que coincida con la ruta predeterminada que utiliza Wrangler. Esto significa que ambas herramientas pueden acceder y utilizar el estado local.
Cualquier directorio que se establezca en persistTo
, .wrangler
o tu valor personalizado, debe añadirse a .gitignore
.
Runtime de Cloudflare
Te proporciona acceso a las variables de entorno y bindings de Cloudflare.
Los bindings actualmente admitidos son:
Puedes acceder al runtime desde los componentes de Astro a través de Astro.locals
dentro de cualquier archivo .astro
.
Puedes acceder al runtime desde los endpoints de la API a través de context.locals
:
Tipado
Si has configurado mode: advanced
, puedes escribir el objeto runtime
usando AdvancedRuntime
:
Si has configurado mode: directory
, puedes escribir el objeto runtime
usando DirectoryRuntime
:
Plataforma
Cabeceras
Puedes adjuntar cabeceras personalizadas a tus respuestas añadiendo un archivo _headers
en la carpeta public/
de tu proyecto de Astro. Este archivo se copiará al directorio de salida de tu compilación.
Redirecciones
Puedes declarar redirecciones personalizadas utilizando Cloudflare Pages. Esto te permite redirigir las peticiones a una URL diferente. Puedes añadir un archivo _redirects
en la carpeta public/
de tu proyecto de Astro. Este archivo se copiará en el directorio de salida de tu compilación.
Rutas
Importaciones de módulos Wasm
Puedes definir qué rutas invocan funciones y cuáles son assets estáticos, utilizando el enrutamiento de Cloudflare a través de un archivo _routes.json
. Este archivo es generado automáticamente por Astro.
Rutas personalizadas _routes.json
Por defecto, @astrojs/cloudflare
generará un archivo _routes.json
con reglas include
y exclude
basadas en las rutas dinámicas y estáticas de tu aplicación.
Esto permitirá a Cloudflare servir archivos y procesar redirecciones estáticas sin invocar una función. La creación de un _routes.json
personalizado anulará esta optimización automática. Consulta la documentación de Cloudflare sobre la creación de un routes.json
personalizado para más detalles.
Usar módulos Wasm
El siguiente es un ejemplo de importación de un módulo Wasm que luego responde a las solicitudes sumando los parámetros numéricos de la solicitud.
Mientras que este ejemplo es trivial, Wasm puede ser utilizado para acelerar operaciones computacionalmente intensivas que no involucran operaciones I/O significativas, como incrustar una biblioteca de procesamiento de imágenes.
Compatibilidad con Node.js.
El adaptador de Cloudflare de Astro te permite utilizar cualquier API de tiempo de ejecución Node.js soportada por Cloudflare.
- assert
- AsyncLocalStorage
- Buffer
- Crypto
- Diagnostics Channel
- EventEmitter
- path
- process
- Streams
- StringDecoder
- util
Para usar estas APIs, la página o el endpoint debe ser renderizado en el lado del servidor (no pre-renderizado) y debe utilizar la sintaxis de importación import {} from 'node:*'
.
Además, deberás habilitar la Bandera de Compatibilidad en Cloudflare. La configuración de esta bandera puede variar según donde implementes tu sitio de Astro. Para obtener orientación detallada, consulta la documentación de Cloudflare sobre cómo habilitar la compatibilidad con Node.js.
Soporte de módulos de Cloudflare
Todos los paquetes de Cloudflare del espacio de nombres (por ejemplo, cloudflare:sockets
) están permitidos para su uso. Ten en cuenta que el paquete cloudflare:sockets
no funciona localmente sin utilizar el modo de desarrollo de Wrangler.
Vista previa con Wrangler
Para utilizar wrangler
y ejecutar tu aplicación localmente, actualiza el script de vista previa:
wrangler
te proporciona acceso a Cloudflare Bindings, variables de entorno, y al objeto cf. Conseguir que la recarga en caliente o el servidor astro dev funcionen con Wrangler puede requerir una configuración personalizada. Consulta los ejemplos de la comunidad.
Mensajes de error significativos
Actualmente, los errores que surjan durante la ejecución de tu aplicación en Wrangler no son muy útiles debido a la minificación de tu código. Para una mejor depuración, puedes agregar la configuración vite.build.minify = false
a tu archivo astro.config.mjs
.
Resolución de problemas
Para obtener ayuda, visita el canal #support
en Discord. ¡Nuestros amables miembros del equipo de soporte están aquí para ayudarte!
También puedes consultar nuestra Documentación sobre la integración de Astro para obtener más información sobre las integraciones.
Contribuyendo
Este paquete es mantenido por el equipo de Astro. ¡Estás invitado a abrir una issue o PR!