Changeset 369aa60 in Klonkt


Ignore:
Timestamp:
09/04/2026 11:48:29 AM (4 days ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
aa521c3
Parents:
4425cc2
Message:

Cache-busting reikt nu ook tot wat de modules zelf ophalen (shaer-724)

De bootstrap hing al ?v= aan elke module die hij zelf laadt. Twee soorten
paden ontsnapten daaraan, en /assets wordt buiten ontwikkeling een jaar
gecachet:

een import BINNEN een module is relatief, en zo\x27n specifier erft de
query niet: ./lib.js naast post.js?v=63 wordt gewoon
/assets/js/mod/lib.js. Elf modules importeren lib.js zo, en juist dat
bestand is gedeeld -- een fout erin overleefde elke MOD_V-bump.

een vendorbestand dat een module zelf ophaalt. read.js deed het goed met
?v=VENDOR_V; lib.js (mijn eigen import van gisteren) en de twee
cropper-verwijzingen in post-edit deden het niet.

Een importmap in de head lost het eerste op zonder die elf imports aan te
raken: hij vertaalt de opgeloste URL naar zijn geversioneerde vorm. MOD_V
staat daarvoor nu als EJS-variabele bovenaan de shell, zodat de importmap
en de bootstrap niet twee nummers kunnen worden. VENDOR_V staat in lib.js
en wordt door read.js en post-edit gedeeld, om dezelfde reden.

Drie toetsen die de REGEL bewaken en niet deze ene plek: elke relatieve
import tussen modules heeft een ingang in de importmap, elk vendorpad
draagt een versie, en de twee nummers zijn er een. Tegenbewijs: haal de
ingang weg of de versie eraf en precies die toets valt.

Volle suite 1248 groen.

Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/lib.js

    r4425cc2 r369aa60  
    8383 * aanroepers hebben al een nette terugval voor "geen WebAuthn hier".
    8484 */
     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 */
     99export const VENDOR_V = 1;
     100
    85101export async function loadWebAuthn() {
    86102  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}`); }
    88104  catch (e) { console.warn('[paid] WebAuthn-bibliotheek laadt niet:', e && e.message); }
    89105  return window.SimpleWebAuthnBrowser;
  • src/assets/js/mod/post-edit.js

    r4425cc2 r369aa60  
    55// het houdt een apostrof in een vertaling uit de HTML die hier geplakt wordt.
    66
    7 import { pageData, esc, makeSweeper } from './lib.js';
     7import { pageData, esc, makeSweeper, VENDOR_V } from './lib.js';
    88// Dezelfde regel die de server gebruikt -- zie shared/post-music-type.js voor
    99// waarom hij daar staat en niet twee keer.
     
    173173      if (!document.querySelector('link[data-cropper-css]')) {
    174174        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', '');
    176178        document.head.appendChild(l);
    177179      }
    178180      const s = document.createElement('script');
    179       s.src = '/assets/vendor/cropper.min.js';
     181      s.src = `/assets/vendor/cropper.min.js?v=${VENDOR_V}`;
    180182      s.onload = () => resolve();
    181183      s.onerror = () => reject(new Error('cropper load failed'));
  • src/assets/js/mod/read.js

    r4425cc2 r369aa60  
    3030 * scrollen, en cmd/ctrl-klik hoort de browser zelf af te handelen.
    3131 */
     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.
     35import { VENDOR_V } from './lib.js';
    3236
    3337// ── Paginamodus ─────────────────────────────────────────────────────────────
     
    294298// dan is OP_TOUCH weer false zetten de hele terugweg.
    295299const 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).
    297301
    298302let lenis = null;
  • src/views/shell.ejs

    r4425cc2 r369aa60  
    120120  };
    121121}
     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.
     132const MOD_V = 63;
    122133%><!DOCTYPE html>
    123134<html lang="<%- _e(lang) %>" data-palette="<%- _e((typeof palette !== 'undefined' && palette) ? palette : (safeSite.palette || 'klonkt')) %>">
     
    339350<script src="/assets/js/htmx.min.js"></script>
    340351
     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
    341371<!-- Per-site custom <head> HTML (analytics, verification, etc.) -->
    342372<% if (safeSite.custom_head_html) { %>
     
    505535  // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig
    506536  // 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
    508538
    509539  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note: See TracChangeset for help on using the changeset viewer.