- Change the build process to allow cache busting - Optimisations to the build process - Several improvements of UI geared towards mobile experience -
5.3 KiB
5.3 KiB
Cache busting, builds en distributie (Parcel v2 + manifest)
Dit document beschrijft hoe cache busting nu structureel is geïmplementeerd met Parcel v2 (filename hashing) en hoe je builds en distributie uitvoert in de verschillende omgevingen.
Overzicht van de aanpak
- Parcel v2 bouwt de frontend bundles met content-hashes in de bestandsnamen (bijv.
/static/dist/chat-client.abcd123.js). - We bouwen via minimale HTML entries (frontend_src/entries/*.html) die de JS importeren; dit dwingt Parcel tot consistente hashing en CSS-extractie.
- Na de build schrijven we een
manifest.jsoninnginx/static/dist/met een mapping van logische namen naar gehashte paden. - Templates gebruiken nu
asset_url('dist/chat-client.js|css')om automatisch naar de juiste gehashte bestanden te verwijzen. - Nginx (DEV/TEST) is ingesteld om voor
/static/dist/lange cache headers te sturen:Cache-Control: public, max-age=31536000, immutable. - HTML krijgt geen agressieve caching via Nginx; de browser ontdekt bij volgende request de nieuwe gehashte asset-URLs.
- In STAGING/PROD (Ingress + Bunny) volg je dezelfde principes; CDN ziet unieke URLs en cachet langdurig, zonder purges te vereisen.
Relevante bestanden die zijn aangepast/toegevoegd
nginx/package.json- DevDependency:
@parcel/reporter-bundle-manifesttoegevoegd. postbuildscript toegevoegd (optioneel; puur informatief).
- DevDependency:
nginx/.parcelrc- Parcel reporter geconfigureerd zodat
manifest.jsonwordt weggeschreven.
- Parcel reporter geconfigureerd zodat
common/utils/template_filters.py- Nieuwe Jinja global
asset_url(logical_path)geregistreerd.
- Nieuwe Jinja global
eveai_chat_client/asset_manifest.py- Hulpfuncties om manifest in te lezen en paden te resolven met caching.
eveai_chat_client/templates/base.htmlentemplates/scripts.html- CSS/JS referenties omgezet naar
{{ asset_url('dist/chat-client.css|js') }}.
- CSS/JS referenties omgezet naar
nginx/nginx.conf- Extra location voor
/static/dist/met lange cache headers.
- Extra location voor
Build uitvoeren (lokaal of in CI)
- Ga naar de
nginxdirectory. - Installeer dependencies (eenmalig of na wijzigingen):
npm install
- Run build:
npm run cleannpm run build
Resultaat:
- Bundles met content-hash in
nginx/static/dist/ nginx/static/dist/manifest.jsonaanwezig
Tip: De build wordt ook aangeroepen door het bestaande script docker/rebuild_chat_client.sh.
rebuild_chat_client.sh
Script: docker/rebuild_chat_client.sh
- Kopieert client images naar
nginx/static/assets/img. - Voert vervolgens
npm run cleanennpm run builduit innginx/. - Bouwt en pusht daarna de
nginxcontainer.
Door de nieuwe Parcel configuratie zal de build automatisch manifest.json genereren en gehashte assets outputten. Er zijn geen extra stappen nodig in dit script.
Hoe de templates de juiste bestanden vinden
- De Jinja global
asset_url()zoekt inmanifest.jsonde gehashte bestandsnaam op basis van een logische naam. - Voorbeelden in templates:
- CSS:
{{ asset_url('dist/chat-client.css') }} - JS:
{{ asset_url('dist/chat-client.js') }}
- CSS:
- Als het manifest onverhoopt ontbreekt (bijv. in een edge-case), valt
asset_urlautomatisch terug naar het on-gehashte pad onder/static/zodat de pagina niet breekt.
Nginx (DEV/TEST)
In nginx/nginx.conf is toegevoegd:
location ^~ /static/dist/ {
alias /etc/nginx/static/dist/;
add_header Cache-Control "public, max-age=31536000, immutable" always;
}
- Hiermee krijgen gehashte assets lange caching. Omdat de URL wijzigt bij iedere inhoudswijziging, halen browsers/CDN de nieuwe versie zonder problemen op.
- HTML wordt niet agressief gecachet door Nginx; wil je volledig no-cache afdwingen voor HTML, dan kun je dat ook applicatie‑zijde doen (Flask) of via extra Nginx rules voor specifieke HTML routes.
Ingress (STAGING/PROD) en Bunny.net
- Ingress: Zet (indien nog niet aanwezig) voor het pad dat
/static/dist/serveert een configuration snippet met dezelfde header:add_header Cache-Control "public, max-age=31536000, immutable" always;
- HTML/endpoints laat je kort/no-cache of standaard; belangrijk is dat templates met nieuwe gehashte URLs snel door de clients worden opgepakt.
- Bunny.net (pull zone): CDN cachet op basis van volledige URL. Door de content-hash in de bestandsnaam zijn purges normaliter niet nodig.
Troubleshooting / Tips
- Controleer na build of
manifest.jsonbestaat:ls nginx/static/dist/manifest.json
- Inspecteer headers in DEV:
curl -I http://<host>/static/dist/chat-client.<hash>.js- Moet
Cache-Control: public, max-age=31536000, immutabletonen.
- Als een client toch oude CSS/JS toont:
- Check of de geleverde HTML naar de nieuwste gehashte bestandsnaam verwijst (View Source / Network tab).
- Zorg dat de HTML niet op CDN langdurig wordt gecachet.
Samenvatting workflow per omgeving
-
DEV/TEST (Nginx):
docker/rebuild_chat_client.shdraaien (of handmatignpm run buildinnginx/).- Nginx container wordt vernieuwd met nieuwe
static/distinclusief manifest en gehashte bundles.
-
STAGING/PROD (Ingress + Bunny):
- Zelfde build, gehashte bundles en manifest worden gedeployed via container image.
- Ingress dient
/static/dist/met lange cache headers. - Bunny.net cachet de nieuwe URLs automatisch; purgen niet nodig.
Met deze setup combineren we maximale performance (lange caching) met directe updates (nieuwe URL bij wijziging).