mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-13 00:59:59 +00:00
After a frontend update (e.g. nightly build), browsers could load outdated cached index.html and JS/CSS chunks, causing dynamically imported modules to fail with MIME type errors and vite:preloadError. Hard refresh (Ctrl+Shift+R) was insufficient to fix the issue because Cache-Control: no-cache still allows the browser to cache and revalidate via ETags. aiohttp's FileResponse auto-generates ETags based on file mtime+size, which may not change after pip reinstall, so the browser gets 304 Not Modified and serves stale content. Clearing ALL site data in DevTools did fix it, confirming the HTTP cache was the root cause. The fix changes: - index.html: no-cache -> no-store, must-revalidate - JS/CSS/JSON entry points: no-cache -> no-store no-store instructs browsers to never cache these responses, ensuring every page load fetches the current index.html with correct chunk references. This is a small tradeoff (~5KB re-download per page load) for guaranteed correctness after updates.
54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
"""Cache control middleware for ComfyUI server"""
|
|
|
|
from aiohttp import web
|
|
from typing import Callable, Awaitable
|
|
|
|
# Time in seconds
|
|
ONE_HOUR: int = 3600
|
|
ONE_DAY: int = 86400
|
|
IMG_EXTENSIONS = (
|
|
".jpg",
|
|
".jpeg",
|
|
".png",
|
|
".ppm",
|
|
".bmp",
|
|
".pgm",
|
|
".tif",
|
|
".tiff",
|
|
".webp",
|
|
)
|
|
|
|
|
|
@web.middleware
|
|
async def cache_control(
|
|
request: web.Request, handler: Callable[[web.Request], Awaitable[web.Response]]
|
|
) -> web.Response:
|
|
"""Cache control middleware that sets appropriate cache headers based on file type and response status"""
|
|
response: web.Response = await handler(request)
|
|
|
|
path_filename = request.path.rsplit("/", 1)[-1]
|
|
is_entry_point = path_filename.startswith("index") and path_filename.endswith(
|
|
".json"
|
|
)
|
|
|
|
if request.path.endswith(".js") or request.path.endswith(".css") or is_entry_point:
|
|
response.headers.setdefault("Cache-Control", "no-store")
|
|
return response
|
|
|
|
# Early return for non-image files - no cache headers needed
|
|
if not request.path.lower().endswith(IMG_EXTENSIONS):
|
|
return response
|
|
|
|
# Handle image files
|
|
if response.status == 404:
|
|
response.headers.setdefault("Cache-Control", f"public, max-age={ONE_HOUR}")
|
|
elif response.status in (200, 201, 202, 203, 204, 205, 206, 301, 308):
|
|
# Success responses and permanent redirects - cache for 1 day
|
|
response.headers.setdefault("Cache-Control", f"public, max-age={ONE_DAY}")
|
|
elif response.status in (302, 303, 307):
|
|
# Temporary redirects - no cache
|
|
response.headers.setdefault("Cache-Control", "no-cache")
|
|
# Note: 304 Not Modified falls through - no cache headers set
|
|
|
|
return response
|