Vercel Functions: i file statici FastAPI ora passano dalla CDN
Con Vercel, i file statici idonei di FastAPI passano dalla CDN senza invocare Functions: ecco cosa cambia per costi, sicurezza e metriche reali.

Vercel ha modificato una voce di costo per le app FastAPI il 10 settembre 2026. Ora le richieste idonee per frontend e file statici passano dalla CDN di Vercel direttamente al visitatore, senza più generare invocazioni di Vercel Functions né consumo di capacità di calcolo. Le richieste CDN e il trasferimento dati restano: si riduce quindi l'uso delle Function, ma la distribuzione statica non diventa gratuita.
Ora la richiesta evita Vercel Functions
Un file statico è un contenuto che il server può inviare così com'è, per esempio un file HTML, un foglio di stile, un bundle JavaScript, un font o un'immagine. Una Vercel Function è il processo FastAPI in esecuzione che gestisce le richieste dinamiche. La CDN è il livello di distribuzione vicino al visitatore.
Prima di questa modifica, anche un file montato tramite FastAPI poteva seguire il percorso della Function. La richiesta arrivava alla rete Vercel, invocava la Function FastAPI e lasciava a Python il compito di restituire il file.
Ora, durante la build, Vercel individua i file idonei dietro app.frontend() e StaticFiles di FastAPI. Li porta sulla CDN e le richieste corrispondenti vengono servite senza invocare la Function.
Il percorso passa da questo:
visitor → CDN → FastAPI Function → file → visitor
a questo:
visitor → CDN file → visitor
L'API dinamica non diventa statica: si spostano soltanto i file corrispondenti. Quelli nella directory public/ a livello di progetto erano già serviti dalla CDN, quindi le app che vi collocano tutte le risorse pubbliche non ottengono un nuovo risparmio da questa release.
Per impostazione predefinita, le directory portate sulla CDN restano anche nel bundle della Function. L'impostazione tool.vercel.fastapi.static.exclude = true elimina questa copia duplicata, ma riguarda il bundle ed è una decisione separata. Non serve per attivare il percorso della richiesta via CDN.

La fattura perde il compute, non la distribuzione
Vercel misura una richiesta su più livelli. Function Invocations conteggia le richieste che raggiungono il codice. Active CPU e Provisioned Memory misurano il lavoro e le risorse di runtime associati a tali invocazioni. Fast Origin Transfer misura il traffico tra la CDN e la Function.
Le metriche della distribuzione esterna sono distinte. La voce CDN Requests, visualizzata come Edge Requests nella dashboard, si applica sia alle risorse statiche sia al traffico delle Function. Fast Data Transfer misura i byte inviati tra la CDN e il visitatore.
Ecco il prospetto per un milione di richieste a risorse altrimenti identiche, che prima del deployment raggiungevano la Function e dopo il deployment risultano idonee alla promozione:
La tariffa Pro pubblicata è di $0.60 per un milione di invocazioni della Function. Un milione di richieste a file che prima raggiungevano la Function elimina quindi $0.60 di utilizzo lordo per le invocazioni prima del credito mensile, oltre al consumo effettivo di Active CPU, Provisioned Memory e Fast Origin Transfer prodotto da quelle richieste.
Quest'ultima parte va ricavata dai dati di Usage. Se la risposta di un file impegnava appena Python, la CPU eliminata sarà poca. Una risposta di grandi dimensioni può invece ridurre maggiormente il trasferimento dall'origine. La release offre un nuovo percorso, non una percentuale di risparmio universale.
L'utilizzo della CDN rimane dall'altra parte del prospetto. L'attuale pagina dei prezzi CDN di Vercel include nel piano Pro con fatturazione on demand i primi 10 milioni di Edge Requests e 1 TB iniziale di Fast Data Transfer; oltre queste soglie si applicano tariffe basate sulla regione. I team che usano Flat Rate CDN consumano invece la capacità di richieste e trasferimento prevista da quel piano. L'approfondimento su Flat Rate CDN tratta separatamente questa scelta di budget.
Per il piano Hobby, il vantaggio può tradursi in più margine operativo anziché in una fattura più bassa. Hobby include un milione di invocazioni della Function, quattro ore di Active CPU e 360 GB-hours di Provisioned Memory. Il traffico dei file pubblici che non raggiunge più la Function smette di consumare queste quote, mentre la distribuzione tramite CDN continua a essere conteggiata dove previsto.
L'idoneità dipende dalle route e dalle regole di sicurezza
Per StaticFiles, Vercel rispetta l'ordine di dichiarazione di FastAPI. Una route dichiarata prima di un mount statico prevale sullo stesso percorso e raggiunge la Function. Se è dichiarata dopo il mount, prevale il file sulla CDN.
app.frontend() si comporta in modo leggermente diverso. Le route API hanno sempre la precedenza sui file del frontend, indipendentemente dall'ordine di dichiarazione. In questo modo, un frontend montato su / non intercetta un vero endpoint API.
Anche la sicurezza cambia il comportamento predefinito. Un file sulla CDN non entra mai in Python, quindi il middleware FastAPI e i controlli Depends() non possono essere eseguiti. Per questo Vercel mantiene sulla Function, per impostazione predefinita, i percorsi seguenti:
- Tutti i mount statici e i frontend quando l'app ha middleware di primo livello.
- I mount statici di una sotto-app quando quella sotto-app ha un middleware.
- Un frontend protetto da dipendenze FastAPI.
L'impostazione cdn = false fa la scelta opposta: disattiva la promozione e mantiene sulla Function tutte le richieste corrispondenti. È la soluzione corretta quando il codice dell'applicazione deve esaminare ogni richiesta.
Resta un caso limite più piccolo: il percorso radice senza slash di un mount StaticFiles raggiunge comunque la Function, così FastAPI può reindirizzarlo alla forma con slash finale. Non bisogna quindi aspettarsi uno zero assoluto nell'utilizzo della Function se i client continuano a richiedere quel percorso senza slash.
Dove cambia il lavoro quotidiano
Un founder SaaS con un solo repository FastAPI
Chi serve una web app in bundle tramite app.frontend() può lasciare dinamica l'API e togliere dal percorso della Function il traffico pubblico di HTML, CSS e JavaScript. Il risultato è una baseline di compute più pulita: il traffico del prodotto può crescere senza far sembrare backend ogni richiesta di risorse del browser.
Un engineer di agenzia con file pubblici e riservati ai clienti
Un engineer di agenzia può mettere la shell pubblica sulla CDN e dichiarare una route sensibile prima del mount statico. Il vantaggio non è soltanto un minore utilizzo della Function: la mappa delle route rende esplicito quali file dei clienti richiedono una decisione di accesso in Python e quali no.
Un responsabile backend al lavoro con il team finance
Il responsabile backend può fornire al team finance due previsioni separate: il traffico dinamico FastAPI per la voce Function e tutto il traffico dei visitatori per la voce CDN. Così, una diminuzione di Function Invocations non viene scambiata per un calo equivalente di Edge Requests o del trasferimento.
Un team con middleware globale
Un team che usa middleware di primo livello per logging, risoluzione del tenant o autenticazione deve aspettarsi che i mount statici restino sulla Function per impostazione predefinita. La scelta utile consiste nel capire se un'area di risorse chiaramente pubblica può bypassare quel middleware. Se la risposta è no, questa modifica non offre alcun risparmio sicuro da mettere a budget.
Verificare un deployment
Si parte dall'inventario reale delle route, non dall'ipotesi che ogni file con un'estensione sia pubblico.
Distinguere i percorsi pubblici da quelli protetti
Elencare ogni directory di
app.frontend()e ogni mountStaticFiles. Contrassegnare i file che possono essere restituiti a qualunque visitatore. Separatamente, identificare tutto ciò la cui risposta dipende da utente, tenant, ruolo, cookie o esito del middleware al momento della richiesta.Controllare l'ordine di dichiarazione
Mantenere una route della Function prima di un mount
StaticFilesquando deve avere la precedenza. Questo è il pattern documentato da Vercel:Pythonfrom fastapi import FastAPI from fastapi.staticfiles import StaticFiles app = FastAPI() # Declared before the mount, so this route wins over any CDN file at this path. @app.get("/static/protected.json") def protected(): return {"access": "denied"} app.mount("/static", StaticFiles(directory="static"))Lasciare i percorsi protetti sulla Function
Controllare middleware di primo livello, middleware delle sotto-app e dipendenze del frontend prima di modificare la configurazione. Non impostare
cdn = truesoltanto per far scendere un grafico, a meno che ogni file interessato sia davvero pubblico. Usarecdn = falsequando tutto il traffico corrispondente deve passare da FastAPI.Decidere se alleggerire il bundle
Se l'app in esecuzione non legge mai i file promossi, le directory di origine possono essere escluse dal bundle della Function con l'impostazione documentata:
TOML[tool.vercel.fastapi.static] exclude = trueMantenere il valore predefinito se il codice a runtime ha ancora bisogno di quei file.
Eseguire il deployment e verificare la separazione
Eseguire
vc deploy. Provare un file pubblico, un file protetto e una route API. Verificare che la risposta protetta continui a comportarsi correttamente, quindi confrontare in Usage le metriche Function Invocations, Active CPU, Provisioned Memory, Fast Origin Transfer, Edge Requests e Fast Data Transfer del progetto. Il campione pubblico deve uscire dal percorso della Function senza scomparire dai totali CDN.
Il limite reale del risparmio
Il prezzo diretto delle invocazioni è di appena $0.60 per milione nel piano Pro. Per un'app piccola, il risparmio può essere di pochi centesimi o venire assorbito dal credito mensile. Il vantaggio maggiore può essere eliminare il rumore delle risorse dall'utilizzo della Function e conservare margine di compute per il vero lavoro dell'API.
Il risparmio aumenta quando il traffico delle risorse pubbliche è elevato, il vecchio percorso della Function manteneva occupata la memoria abbastanza a lungo da incidere o le risposte generavano un Fast Origin Transfer rilevante. Rimane contenuto se i file erano già in public/, il traffico è basso o le regole di sicurezza mantengono correttamente i percorsi sulla Function.
La modifica non sostituisce neppure l'ottimizzazione delle risorse. Lo stesso bundle JavaScript, la stessa immagine o lo stesso font di grandi dimensioni devono comunque attraversare la CDN per raggiungere il visitatore. Ridurre quei file resta l'intervento che abbassa il Fast Data Transfer.
Cosa fare lunedì
Conviene intervenire questa settimana se app.frontend() o StaticFiles serve file pubblici e tali richieste compaiono nell'utilizzo della Function. Meglio aspettare se i file sono protetti e le relative regole di accesso non sono ancora state separate. La modifica non ha effetti se i file interessati provengono già da public/ o da un altro percorso supportato da CDN.
Lunedì, inventariare i percorsi delle risorse pubbliche e protette, preservare tutte le route e i controlli che devono essere eseguiti, quindi verificare un deployment con una richiesta per ciascuna classe. Inserire a budget la riduzione misurata nell'utilizzo della Function, mantenendo nel prospetto le richieste CDN e il trasferimento.
Per altre analisi in linguaggio chiaro sui cambiamenti delle piattaforme che incidono sui costi operativi, iscriviti alla newsletter.
- Ultimo aggiornamento
- 13 set 2026
- Categoria
- Explained







