内容提要
Vercel 现在会在构建时将 FastAPI 的前端和 StaticFiles 静态资源提升至 CDN,请求不再调用函数。路由声明顺序优先级保持不变,被依赖或中间件保护的资源仍保留在函数中。可通过 pyproject.toml 配置排除源目录,或强制启用、禁用 CDN。
延伸解读
CDN 提升对性能的影响
将 FastAPI 前端和 StaticFiles 静态资源提升至 Vercel CDN 后,对这些路径的请求不再调用 Vercel Function,而是直接从 CDN 返回。这可以减少函数调用次数,可能降低延迟并节省资源。但文章未提供具体性能数据,实际效果取决于资源类型和访问模式。
路由优先级与 CDN 的交互
FastAPI 按声明顺序评估路由。在 StaticFiles 挂载之前声明的路由会优先于该路径下的任何 CDN 文件,这一优先级在 CDN 提升后仍然保留。因此,如果应用中有自定义路由需要覆盖静态文件,必须确保其声明在挂载之前,否则可能被 CDN 直接服务。
依赖与中间件保护资源的处理
受依赖保护的前端和受中间件保护的静态文件不会被提升到 CDN,因为 CDN 无法执行依赖检查或中间件逻辑。这些资源仍由函数处理。可以通过 pyproject.toml 中的 tool.vercel.fastapi.static.cdn 设置为 true 强制提升,或设置为 false 完全禁用 CDN。
源目录排除与配置选项
提升的源目录默认保留在函数包中,以便应用在运行时读取。若希望仅从 CDN 提供这些资源,可以在 pyproject.toml 中设置 tool.vercel.fastapi.static.exclude = true 来排除它们。这有助于减小函数包体积,但需确保应用不再依赖这些目录中的文件。
Q&A
FastAPI 应用中的前端和静态文件现在是如何被 Vercel 处理的?
在构建时,通过 app.frontend() 或 StaticFiles 提供的前端和静态文件会被提升到 Vercel CDN,对这些路径的请求将直接从 CDN 提供,而不会调用 Vercel Function。
路由声明顺序对 CDN 提供的静态文件有什么影响?
FastAPI 按声明顺序评估路由。如果某个路由声明在 StaticFiles 挂载之前,那么该路由的优先级高于该路径下的任何 CDN 文件,这个优先级规则保持不变。
如何配置让静态文件只从 CDN 提供,而不保留在函数包中?
在 pyproject.toml 中设置 tool.vercel.fastapi.static.exclude = true,即可排除源目录,使其仅从 CDN 提供。
哪些情况下静态文件或前端不会被提升到 CDN?
受依赖保护的前端以及位于中间件之后的静态文件会保留在函数中,因为 CDN 无法执行依赖检查或中间件逻辑。
如何强制启用或禁用 CDN 提升?
在 pyproject.toml 中设置 tool.vercel.fastapi.static.cdn = true 可强制始终提升到 CDN;设置为 false 则完全退出 CDN。
提升到 CDN 后,源目录还会保留在函数包中吗?
默认情况下,被提升的源目录仍会保留在函数包中,以便应用在运行时读取。若想排除,需设置 tool.vercel.fastapi.static.exclude = true。