Tofu/libs/README.md
2026-09-18 01:41:02 +02:00

2.7 KiB

libs/ — les dépendances, versionnées et autonomes

Trois fichiers, aucun accès réseau au runtime. Ils sont commités tels quels : c'est le prix à payer pour qu'un python3 -m http.server suffise à servir l'appli, et pour qu'elle fonctionne encore dans dix ans sans npm, sans bundler et sans CDN debout.

Fichier Module exposé Origine
preact.js preact https://esm.sh/preact@10.27.2/es2022/preact.bundle.mjs
preact-hooks.js preact/hooks https://esm.sh/preact@10.27.2/X-ZXByZWFjdA/es2022/hooks.bundle.mjs
htm-preact.js htm/preact https://esm.sh/htm@3.1.1/X-ZXByZWFjdA/es2022/preact.bundle.mjs

Versions : preact 10.27.2, htm 3.1.1.

Pourquoi l'URL profonde et pas esm.sh/preact?bundle

L'URL courte ne renvoie pas la librairie : c'est un shim de 88 octets qui se contente de ré-exporter depuis le CDN.

/* esm.sh - preact@10.27.2 */
export * from "https://esm.sh/preact@10.27.2/es2022/preact.mjs"

Enregistrer ce fichier dans libs/ donnerait l'illusion d'une dépendance locale alors que le navigateur irait chercher le vrai code sur esm.sh à chaque chargement : dépendance réseau au runtime, donc inacceptable ici. L'URL profonde …/es2022/<nom>.bundle.mjs est le bundle autonome, tout le code inclus.

Pourquoi le segment X-ZXByZWFjdA

C'est l'encodage esm.sh des drapeaux de build : X- suivi de base64("epreact"), c'est-à-dire e (external) appliqué à preact. Il demande à esm.sh de ne pas inliner preact dans le bundle et de laisser le specifier preact nu dans les imports :

/* esm.sh - preact@10.27.2/hooks */
import { options as V } from "preact";

Ce specifier nu est alors résolu par l'import map de index.html vers notre ./libs/preact.js. C'est ce qui garantit une seule instance de Preact partagée par les hooks et par htm — sans ce drapeau, chaque bundle embarquerait sa propre copie, et les hooks cesseraient de fonctionner (deux registres d'options distincts).

preact.js lui-même n'a pas de dépendance à externaliser : son URL n'a donc pas de segment X-.

Régénérer

curl -fsSL https://esm.sh/preact@10.27.2/es2022/preact.bundle.mjs             -o libs/preact.js
curl -fsSL https://esm.sh/preact@10.27.2/X-ZXByZWFjdA/es2022/hooks.bundle.mjs -o libs/preact-hooks.js
curl -fsSL https://esm.sh/htm@3.1.1/X-ZXByZWFjdA/es2022/preact.bundle.mjs     -o libs/htm-preact.js

Après régénération, vérifier que les fichiers font plusieurs kilo-octets (un fichier de ~100 octets est un shim, voir plus haut) et que preact-hooks.js et htm-preact.js importent bien depuis "preact" nu :

wc -c libs/*.js
head -n 2 libs/preact-hooks.js libs/htm-preact.js