Changeset 369aa60 in Klonkt
- Timestamp:
- 09/04/2026 11:48:29 AM (4 days ago)
- Branches:
- main
- Children:
- aa521c3
- Parents:
- 4425cc2
- Files:
-
- 1 added
- 4 edited
-
src/assets/js/mod/lib.js (modified) (1 diff)
-
src/assets/js/mod/post-edit.js (modified) (2 diffs)
-
src/assets/js/mod/read.js (modified) (2 diffs)
-
src/views/shell.ejs (modified) (3 diffs)
-
test/asset-cache-busting.test.js (added)
Legend:
- Unmodified
- Added
- Removed
-
src/assets/js/mod/lib.js
r4425cc2 r369aa60 83 83 * aanroepers hebben al een nette terugval voor "geen WebAuthn hier". 84 84 */ 85 /** 86 * De cache-buster voor alles in /assets/vendor (shaer-724). 87 * 88 * Die map valt onder dezelfde max-age van een jaar als de rest van /assets, en 89 * een vendorbestand heeft geen versie in zijn naam. Zonder query houdt een 90 * browser die hem ooit zag hem dus een jaar vast, ook na een update van de 91 * bibliotheek. 92 * 93 * EEN nummer voor de hele map, hier, en niet drie losse per module: read.js had 94 * er al een en lib.js en post-edit.js hadden er geen, en dan is "ophogen als de 95 * bibliotheek wijzigt" een opdracht die je op drie plekken moet onthouden. Dat 96 * kost read.js wel een import van dit bestand op de leespagina; die is klein en 97 * staat na de eerste pagina in de cache. 98 */ 99 export const VENDOR_V = 1; 100 85 101 export async function loadWebAuthn() { 86 102 if (window.SimpleWebAuthnBrowser) return window.SimpleWebAuthnBrowser; 87 try { await import( '/assets/vendor/simplewebauthn-browser.umd.min.js'); }103 try { await import(`/assets/vendor/simplewebauthn-browser.umd.min.js?v=${VENDOR_V}`); } 88 104 catch (e) { console.warn('[paid] WebAuthn-bibliotheek laadt niet:', e && e.message); } 89 105 return window.SimpleWebAuthnBrowser; -
src/assets/js/mod/post-edit.js
r4425cc2 r369aa60 5 5 // het houdt een apostrof in een vertaling uit de HTML die hier geplakt wordt. 6 6 7 import { pageData, esc, makeSweeper } from './lib.js';7 import { pageData, esc, makeSweeper, VENDOR_V } from './lib.js'; 8 8 // Dezelfde regel die de server gebruikt -- zie shared/post-music-type.js voor 9 9 // waarom hij daar staat en niet twee keer. … … 173 173 if (!document.querySelector('link[data-cropper-css]')) { 174 174 const l = document.createElement('link'); 175 l.rel = 'stylesheet'; l.href = '/assets/vendor/cropper.min.css'; l.setAttribute('data-cropper-css', ''); 175 // Met versie, net als het script eronder (shaer-724): /assets wordt een 176 // jaar gecachet en deze twee bestanden dragen geen versie in hun naam. 177 l.rel = 'stylesheet'; l.href = `/assets/vendor/cropper.min.css?v=${VENDOR_V}`; l.setAttribute('data-cropper-css', ''); 176 178 document.head.appendChild(l); 177 179 } 178 180 const s = document.createElement('script'); 179 s.src = '/assets/vendor/cropper.min.js';181 s.src = `/assets/vendor/cropper.min.js?v=${VENDOR_V}`; 180 182 s.onload = () => resolve(); 181 183 s.onerror = () => reject(new Error('cropper load failed')); -
src/assets/js/mod/read.js
r4425cc2 r369aa60 30 30 * scrollen, en cmd/ctrl-klik hoort de browser zelf af te handelen. 31 31 */ 32 33 // VENDOR_V komt uit lib.js: een nummer voor de hele vendormap (shaer-724), 34 // zodat 'ophogen als de bibliotheek wijzigt' op een plek staat. 35 import { VENDOR_V } from './lib.js'; 32 36 33 37 // ── Paginamodus ───────────────────────────────────────────────────────────── … … 294 298 // dan is OP_TOUCH weer false zetten de hele terugweg. 295 299 const OP_TOUCH = window.matchMedia('(hover: none) and (pointer: coarse)'); 296 const VENDOR_V = 1; // ophogen als de bestanden in /assets/js/vendor wijzigen 300 // VENDOR_V komt uit lib.js: een nummer voor de hele vendormap (shaer-724). 297 301 298 302 let lenis = null; -
src/views/shell.ejs
r4425cc2 r369aa60 120 120 }; 121 121 } 122 %> 123 <% 124 // De cache-buster voor alles onder assets/js/mod (en de gedeelde bestanden die 125 // die modules importeren). Stond alleen in de bootstrap onderaan; hij staat nu 126 // hier omdat de importmap in de <head> hem OOK nodig heeft, en twee losse 127 // nummers lopen gegarandeerd een keer uit elkaar. 128 // 129 // Ophogen bij ELKE wijziging in assets/js/mod -- /assets wordt buiten 130 // ontwikkeling een jaar gecachet, dus zonder bump bereikt een reparatie 131 // iedereen behalve wie de fout al heeft. 132 const MOD_V = 63; 122 133 %><!DOCTYPE html> 123 134 <html lang="<%- _e(lang) %>" data-palette="<%- _e((typeof palette !== 'undefined' && palette) ? palette : (safeSite.palette || 'klonkt')) %>"> … … 339 350 <script src="/assets/js/htmx.min.js"></script> 340 351 352 <%# De cache-buster reikt ook tot wat de modules ONDERLING importeren (shaer-724). 353 De bootstrap hangt ?v= aan elke module die hij zelf laadt, maar een import 354 BINNEN een module is relatief, en een relatieve specifier erft de query 355 niet: `./lib.js` naast `post.js?v=63` wordt gewoon `/assets/js/mod/lib.js`. 356 Dat bestand wordt met max-age van een jaar geserveerd, dus het bleef bij 357 terugkerende bezoekers staan terwijl de modules eromheen ververst werden -- 358 en juist lib.js is gedeeld, dus een fout daarin overleeft elke MOD_V-bump. 359 360 Een importmap lost dat op zonder die elf imports aan te raken: hij vertaalt 361 de OPGELOSTE URL naar zijn geversioneerde vorm. Hij moet in de head staan, 362 voor de eerste module-import. De toets bij dit bestand bewaakt dat elke 363 relatieve import onder assets/js hier een ingang heeft. %> 364 <script type="importmap"> 365 {"imports":{ 366 "/assets/js/mod/lib.js": "/assets/js/mod/lib.js?v=<%= MOD_V %>", 367 "/assets/js/shared/post-music-type.js": "/assets/js/shared/post-music-type.js?v=<%= MOD_V %>" 368 }} 369 </script> 370 341 371 <!-- Per-site custom <head> HTML (analytics, verification, etc.) --> 342 372 <% if (safeSite.custom_head_html) { %> … … 505 535 // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig 506 536 // bumpen kost een bugfix die nooit aankomt. 507 var MOD_V = 63;537 var MOD_V = <%= MOD_V %>; // uit de EJS-variabele bovenaan; zie de importmap in de head 508 538 509 539 // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)