Static assets get no configurable headers on native Cloudflare deploys of framework apps

Abierto
#647 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@dvkam ya está trabajando en esto.

Desde el 2/11/2026.

  • #670 de @dvkam — abierto

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
50/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
typescript, vite
Área
cloud

Línea de trabajo

Start by tracing uploadAssets, readGeneratedAssetHeaders, and planAssetWorkerBypass for native Cloudflare deploys, then compare their behavior with the TanStack Start asset configuration described here. Check or add coverage for user-authored _headers and fingerprinted assets; done means the reported cache headers are applied to static assets, or the docs accurately describe the limitation.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Summary

A TanStack Start app deployed with void deploy --platform cloudflare serves its static assets without any configurable headers:

  1. A public/_headers file is copied to dist/client/_headers, but it never applies in production. uploadAssets ignores /_headers, and readGeneratedAssetHeaders only sends a file whose first line is Void's generated marker ("A user-authored _headers is not sent on this path").
  2. Void's own immutable caching for fingerprinted bundles never runs either. planAssetWorkerBypass only applies when the built wrangler.json has assets.run_worker_first: ["/**"], and the TanStack Start build has only "assets": { "directory": "../client" }. With the _headers file removed, the build generates no _headers at all.
  3. As a result, hashed files under /assets/ are served with Cloudflare's default Cache-Control: public, max-age=0, must-revalidate. Browsers revalidate every JS and CSS chunk on every page view.

This contradicts two docs pages:

  • guide/edge/static-assets.md ("Native Cloudflare deployments"): "With void deploy --platform cloudflare, generated JavaScript bundles with content fingerprints receive immutable caching."
  • guide/edge/headers.md ("Framework _headers files"): "Void reads _headers files produced by supported frameworks."

Reproduction

  • [email protected], @tanstack/[email protected], Vite 8, deployed with void deploy --platform cloudflare
  • void.config.ts sets cloudflare.cache.enabled, a custom domain route, a D1 binding and no routing options
  • public/_headers:
    /assets/*
      Cache-Control: public, max-age=31536000, immutable
    
  • After deploy, curl -sI https://<site>/assets/<hashed>.js shows cache-control: public, max-age=0, must-revalidate. CSS is the same.

I also tried routing.headers in void.config.ts ('/assets/*': ['Cache-Control: public, max-age=31536000, immutable']). In the local preview (vite preview in workerd), assets still came back with max-age=0, must-revalidate. I didn't deploy that variant, since the assets are served without starting the Worker, so I don't expect the rules to reach them.

Expected

One of these, for framework apps on native Cloudflare deploys:

  • send a user-authored _headers with the asset upload (as Wrangler does),
  • generate the immutable _headers for fingerprinted files even without run_worker_first, or
  • apply routing.headers to static assets.

Failing those, the docs should say framework apps on --platform cloudflare get no asset headers.

Workaround

A Response Header Transform Rule on the zone that sets Cache-Control: public, max-age=31536000, immutable for a 200 under /assets/.

Lenguaje dominante
TypeScript
Estrellas
627
Forks
66
Merge medio
13 h 57 min
PR fusionados (30 d)
194

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de voidzero-dev/void

Todos los issues de voidzero-dev/void

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.