htmx 2.0.9

Résumé

htmx ajoute des interactions modernes directement dans le HTML. Un élément peut déclencher une requête HTTP, choisir la cible de la réponse et remplacer seulement la portion de DOM nécessaire — sans framework frontend, sans JSON obligatoire et sans étape de build pour l’installation CDN.

Cette fiche couvre le commit 6ff7c482b0879dcd6fa0210aa84155131eef2d02, tagué v2.0.9. Ce commit corrige aussi une coquille dans le changelog de la version 2.0.8; les fonctionnalités décrites sont celles de htmx 2.0.9.

Fonction Description
Requêtes HTTP dans le HTML Utiliser hx-get, hx-post, hx-put, hx-patch et hx-delete sur des éléments HTML.
Réponses HTML partielles Le serveur retourne généralement un fragment HTML plutôt qu’un objet JSON à transformer côté client.
Déclencheurs flexibles Déclencher une requête sur un clic, une frappe, un événement personnalisé, un délai, du polling ou l’entrée dans le viewport.
Cible et stratégie de remplacement Contrôler où la réponse est injectée avec hx-target et comment avec hx-swap.
Progressive enhancement Transformer des liens et formulaires existants avec hx-boost, tout en gardant un fallback HTML normal.
Historique navigateur Pousser ou remplacer des URLs et restaurer les pages avec hx-push-url, hx-replace-url et le cache d’historique.
UX de requête Afficher un indicateur, désactiver des éléments, confirmer une action et synchroniser des requêtes concurrentes.
Événements et extensions Observer le cycle de requête avec les événements htmx:* et ajouter des fonctions via des extensions séparées.
Petite empreinte La distribution est sans dépendance et le build minifié est présenté par le projet comme faisant environ 14 Ko compressés.

Quand utiliser htmx

htmx est particulièrement intéressant quand :

  • le serveur rend déjà du HTML;
  • les interactions sont principalement des formulaires, des listes, des filtres, des modals ou des mises à jour partielles;
  • tu veux éviter de maintenir un gros state client;
  • tu veux garder les URLs, les formulaires et les liens comme primitives de base;
  • tu veux ajouter de l’interactivité progressivement à une application existante.

htmx n’est pas automatiquement le meilleur choix pour une application qui doit maintenir un gros graphe d’état partagé côté navigateur, une expérience offline complexe ou une interface qui dépend fortement d’un rendu canvas/WebGL. Il peut toutefois cohabiter avec du JavaScript ciblé ou un autre outil frontend.

Installation

CDN jsDelivr

Pour une page HTML existante, charge une version précise de htmx dans le <head> :

<script
    src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.9/dist/htmx.min.js"
    integrity="sha384-ESlCao+z/oasnu2Uc/5K1LQTI7YCF2KKO4xakCPQCFuiHhCh8Oa/R5NwHY6guZ3m"
    crossorigin="anonymous"
></script>

Le integrity fourni correspond au build documenté par le dépôt à ce commit. Évite une URL flottante comme @latest pour une application en production.

Pour diagnostiquer plus facilement dans DevTools, tu peux charger le build non minifié :

<script
    src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.9/dist/htmx.js"
    integrity="sha384-cXTCSy4Zn7qemud9yShqFivG9MoMBwLrbVbZ6QPW8lIouC2ZiTekwPrSj2P9Ev0U"
    crossorigin="anonymous"
></script>

Copier le fichier dans l’application

Télécharge dist/htmx.min.js, vend-le avec tes assets et charge-le depuis ton propre domaine :

<script src="/assets/js/htmx.min.js"></script>

Cette approche évite de dépendre d’un CDN au runtime et te permet de contrôler exactement le fichier livré.

npm

Le nom du package officiel est htmx.org, pas htmx :

npm install htmx.org@2.0.9

Le package expose notamment les builds ESM, AMD, CommonJS et browser-loadable dans dist/.

Avec un bundler :

import 'htmx.org'

Si tu as besoin de la variable globale :

import htmx from 'htmx.org'

window.htmx = htmx

La forme exacte de l’import dépend du bundler et du build choisi. Pour une page sans build system, le script CDN ou le fichier copié est plus simple.

Le modèle mental : une requête, une réponse HTML, un swap

Un composant htmx décrit trois choses :

  1. quelle requête partir;
  2. quel événement la déclenche;
  3. où et comment injecter la réponse.
<button
    hx-post="/clicked"
    hx-target="#status"
    hx-swap="innerHTML"
>
    Cliquer
</button>

<div id="status">Pas encore cliqué.</div>

Quand le bouton est cliqué, htmx envoie un POST à /clicked. Le serveur peut répondre avec :

<p class="success">Action complétée.</p>

htmx remplace le contenu de #status avec ce fragment. Le serveur n’a pas besoin de retourner un JSON que le navigateur devra interpréter avec une couche de rendu séparée.

Par défaut, les éléments ont un déclencheur naturel :

  • button, div, a et la plupart des autres éléments : click;
  • form : submit;
  • input, textarea et select : change.

Tu peux toujours rendre le déclencheur explicite avec hx-trigger.

Les verbes HTTP

Les attributs principaux sont :

Attribut Requête
hx-get GET
hx-post POST
hx-put PUT
hx-patch PATCH
hx-delete DELETE

Exemple :

<button hx-delete="/users/42" hx-confirm="Supprimer cet utilisateur?">
    Supprimer
</button>

Dans l’application, le endpoint retourne habituellement le HTML qui doit remplacer la cible. Pour un DELETE, retourne par exemple une ligne vide ou la version mise à jour de la liste selon le hx-target et le hx-swap choisis.

Déclencheurs avec hx-trigger

Événements, délais et debounce

<input
    name="q"
    type="search"
    hx-get="/search"
    hx-trigger="input changed delay:500ms"
    hx-target="#search-results"
    placeholder="Rechercher..."
>

<div id="search-results"></div>

changed évite de refaire une requête si la valeur n’a pas changé. delay:500ms agit comme un debounce : chaque nouvelle frappe remet le délai à zéro.

Modificateurs utiles :

  • once : déclenche une seule fois;
  • changed : déclenche seulement si la valeur a changé;
  • delay:1s : attend avant de déclencher et remet le délai à zéro;
  • throttle:1s : limite la fréquence des déclenchements;
  • from:body : écoute l’événement sur un autre élément;
  • target:button : filtre la cible de l’événement;
  • consume : empêche les requêtes htmx parentes de traiter le même événement;
  • queue:first, queue:last, queue:all ou queue:none : contrôle les événements pendant une requête en cours.

Filtres clavier

Les filtres utilisent une expression JavaScript évaluée contre l’événement :

<input
    hx-get="/search"
    hx-trigger="keyup[ctrlKey&&shiftKey]"
    hx-target="#results"
>

Les filtres sont pratiques, mais ils activent l’évaluation d’expressions. Ne construis pas ces attributs avec du contenu non fiable.

Polling et chargement paresseux

Polling simple :

<div hx-get="/notifications" hx-trigger="every 30s" hx-swap="innerHTML">
    Chargement des notifications...
</div>

Chargement quand l’élément entre dans le viewport :

<section
    hx-get="/dashboard/activity"
    hx-trigger="revealed"
    hx-target="this"
    hx-swap="innerHTML"
>
    Chargement...
</section>

Pour les conteneurs avec overflow: scroll, la documentation recommande plutôt intersect once, avec les options root et threshold au besoin :

<div
    hx-get="/next-page"
    hx-trigger="intersect once"
    hx-swap="afterend"
>
    Chargement de la suite...
</div>

Plusieurs déclencheurs sont séparés par des virgules :

<div hx-get="/news" hx-trigger="load, click delay:1s"></div>

Choisir la cible avec hx-target

Par défaut, la réponse est injectée dans l’élément qui a déclenché la requête. hx-target permet de viser ailleurs :

<div id="messages"></div>

<form hx-post="/messages" hx-target="#messages" hx-swap="beforeend">
    <input name="message" required>
    <button type="submit">Envoyer</button>
</form>

Sélecteurs spéciaux utiles :

  • this : l’élément courant;
  • closest tr : l’ancêtre le plus proche qui correspond;
  • find .error : le premier descendant correspondant;
  • next .error : le prochain élément correspondant;
  • previous .error : le précédent élément correspondant.

Exemple auto-remplaçable :

<a
    hx-post="/links/new"
    hx-target="this"
    hx-swap="outerHTML"
>
    Créer le lien
</a>

hx-target est héritable : tu peux le placer sur un conteneur et le redéfinir sur un enfant lorsque nécessaire.

Contrôler le remplacement avec hx-swap

Le défaut est innerHTML. Les stratégies disponibles sont :

  • innerHTML : remplace le contenu interne;
  • outerHTML : remplace l’élément complet;
  • textContent : remplace seulement le texte;
  • beforebegin : insère avant la cible;
  • afterbegin : insère comme premier enfant;
  • beforeend : ajoute comme dernier enfant;
  • afterend : insère après la cible;
  • delete : supprime la cible, peu importe la réponse;
  • none : n’ajoute pas le contenu principal, mais traite quand même les swaps hors bande.
<button
    hx-get="/comments"
    hx-target="#comments"
    hx-swap="beforeend"
>
    Charger plus de commentaires
</button>

Modificateurs fréquents :

<div hx-get="/feed" hx-swap="beforeend swap:300ms settle:200ms scroll:bottom">
    Charger la suite
</div>
  • swap:300ms : délai avant l’insertion;
  • settle:200ms : délai après le swap;
  • scroll:bottom : défile la cible vers le bas;
  • show:top ou show:bottom : rend une position visible;
  • show:none : désactive le défilement automatique;
  • focus-scroll:true : autorise le scroll automatique vers un champ qui reprend le focus;
  • transition:true : utilise l’API View Transitions du navigateur.

Pour les liens et formulaires boostés, htmx utilise généralement show:top afin que la nouvelle page commence en haut.

Réponses hors bande avec hx-swap-oob

Un endpoint peut mettre à jour la cible normale et un autre élément dans la même réponse :

<div id="order-summary">
    Résumé mis à jour
</div>

<div id="flash" hx-swap-oob="true" class="notice">
    Commande sauvegardée.
</div>

L’élément avec hx-swap-oob est recherché par son id dans le document courant et remplacé indépendamment de la cible principale.

Pour les éléments dont la structure HTML est particulière, comme une ligne de tableau, place le fragment dans un <template> :

<template>
    <tr id="row-42" hx-swap-oob="outerHTML">
        <td>42</td>
        <td>Mis à jour</td>
    </tr>
</template>

Utilise hx-select lorsque tu veux sélectionner une partie précise de la réponse principale, et hx-select-oob pour sélectionner des morceaux destinés à des swaps hors bande.

Paramètres et formulaires

Un élément déclencheur inclut sa propre valeur s’il en possède une. Une soumission de formulaire inclut les champs avec un attribut name :

<form hx-post="/profile" hx-target="#profile-result">
    <input name="display_name" value="Vinny">
    <input name="email" type="email" required>
    <button type="submit">Sauvegarder</button>
</form>

Pour inclure des champs hors du formulaire ou hors de l’élément déclencheur :

<button
    hx-post="/search"
    hx-include="[name='filters']"
>
    Appliquer
</button>

<input name="filters" value="active">

hx-include accepte aussi this, closest, find, next et previous. Attention : un sélecteur hérité est évalué à partir de l’élément qui déclenche la requête, pas nécessairement à partir du parent qui porte l’attribut.

Valeurs additionnelles statiques :

<button
    hx-post="/cart/add"
    hx-vals='{"product_id": 42, "quantity": 1}'
>
    Ajouter au panier
</button>

Avec js: ou javascript:, les valeurs sont calculées :

<button
    hx-post="/cart/add"
    hx-vals='js:{product_id: this.dataset.productId}'
    data-product-id="42"
>
    Ajouter
</button>

N’utilise pas les variantes dynamiques avec du contenu utilisateur non contrôlé : elles évaluent du JavaScript et peuvent ouvrir une porte XSS.

Pour un upload :

<form
    hx-post="/documents"
    hx-encoding="multipart/form-data"
    hx-target="#upload-result"
>
    <input type="file" name="document" required>
    <button type="submit">Téléverser</button>
</form>

<div id="upload-result"></div>

UX pendant les requêtes

Indicateur de chargement

Le déclencheur reçoit la classe htmx-request pendant la requête. Un indicateur peut donc être masqué par défaut et affiché avec CSS :

<style>
    .htmx-indicator {
        opacity: 0;
        transition: opacity 200ms ease-in;
    }

    .htmx-request .htmx-indicator,
    .htmx-request.htmx-indicator {
        opacity: 1;
    }
</style>

<button hx-get="/report" hx-indicator="#report-indicator">
    Générer le rapport
    <span id="report-indicator" class="htmx-indicator">Chargement...</span>
</button>

Désactiver des éléments

<form
    hx-post="/checkout"
    hx-disabled-elt="find button"
>
    <button type="submit">Payer</button>
</form>

htmx préserve les éléments qui étaient déjà désactivés dans le HTML source et réactive ceux qu’il a lui-même désactivés à la fin de la requête.

Confirmation

<button
    hx-delete="/account"
    hx-confirm="Es-tu certain de vouloir supprimer ce compte?"
>
    Supprimer le compte
</button>

Le comportement par défaut utilise window.confirm(). Pour une boîte de dialogue asynchrone ou une librairie UI, intercepte htmx:confirm, appelle preventDefault(), puis lance evt.detail.issueRequest() quand l’utilisateur a confirmé.

Synchroniser des requêtes avec hx-sync

Un cas fréquent : un champ valide son contenu pendant que le formulaire parent est soumis. Sans synchronisation, les deux requêtes peuvent se battre et appliquer leurs réponses dans le mauvais ordre.

<form hx-post="/store" hx-sync="this:replace">
    <input
        name="email"
        hx-post="/validate-email"
        hx-trigger="change"
        hx-sync="closest form:abort"
    >

    <button type="submit">Sauvegarder</button>
</form>

Stratégies courantes :

  • abort : abandonner la requête courante;
  • drop : ignorer une nouvelle requête;
  • replace : remplacer la requête en cours;
  • queue first, queue last, queue all : mettre en file les événements.

Choisis la stratégie selon le contrat métier. replace n’est pas toujours correct : pour une recherche, queue:last peut être plus approprié; pour une sauvegarde, abort peut éviter qu’une validation tardive écrase le résultat.

Boosting des liens et formulaires

hx-boost="true" transforme des liens et formulaires HTML normaux en navigation AJAX :

<nav hx-boost="true">
    <a href="/accueil">Accueil</a>
    <a href="/produits">Produits</a>
    <a href="/contact">Contact</a>
</nav>

Pour un lien, htmx fait un GET, remplace normalement le contenu du body et pousse l’URL dans l’historique. Pour un formulaire, il respecte sa méthode GET ou POST; l’URL n’est pas poussée automatiquement pour les formulaires.

Le fallback est important : si JavaScript est désactivé, les liens et formulaires continuent d’utiliser leur comportement HTML normal. C’est une forme de progressive enhancement.

Tu peux désactiver le boost sur un enfant :

<div hx-boost="true">
    <a href="/internal">Navigation AJAX</a>
    <a href="/download" hx-boost="false">Télécharger normalement</a>
</div>

Le boost ne s’applique pas automatiquement aux liens externes ni aux ancres locales. Côté serveur, le header HX-Boosted permet de détecter qu’une requête vient d’un élément boosté.

Historique et URLs

Pour pousser une URL après un swap :

<a
    href="/products?page=2"
    hx-get="/products?page=2"
    hx-push-url="true"
    hx-target="#product-list"
>
    Page suivante
</a>

Tu peux aussi fournir directement une URL avec hx-push-url="/products?page=2", ou remplacer l’entrée courante avec hx-replace-url.

htmx conserve un snapshot pour restaurer l’historique côté client. Pour éviter de mettre des données sensibles en cache :

<div hx-history="false">
    Contenu qui ne doit pas être sauvegardé dans le cache d’historique.
</div>

Le serveur doit savoir répondre correctement à une navigation normale et à une requête htmx. Le header HX-Request vaut true pour une requête htmx et peut aider à choisir entre une page complète et un fragment.

Contrat serveur : headers utiles

Les réponses htmx sont souvent des fragments HTML avec des headers de contrôle :

Header Effet
HX-Redirect Demande une redirection côté navigateur.
HX-Location Demande une navigation htmx vers une autre URL.
HX-Refresh Force un refresh complet.
HX-Push-Url Pousse une URL dans l’historique.
HX-Replace-Url Remplace l’URL courante dans l’historique.
HX-Trigger Déclenche un événement côté client.
HX-Reswap Remplace la stratégie hx-swap pour la réponse.
HX-Retarget Remplace la cible du swap pour la réponse.
HX-Reselect Remplace le sélecteur choisi pour la réponse.
HX-Request Header envoyé par le client pour identifier une requête htmx.
HX-Boosted Indique qu’elle vient d’un élément boosté.
HX-Current-URL URL courante connue par htmx.
HX-Target Identifiant de la cible demandée.
HX-Trigger Identifiant de l’élément qui a déclenché la requête.
HX-Trigger-Name Attribut name du déclencheur, s’il existe.

Ne mets pas les headers de réponse htmx dans une réponse HTTP 3xx en t’attendant à ce que htmx les traite normalement : retourne plutôt une réponse que htmx peut inspecter ou utilise un header adapté comme HX-Redirect.

Événements et hooks JavaScript

Les événements htmx:* couvrent le cycle d’une requête :

document.body.addEventListener('htmx:beforeRequest', (event) => {
    console.log('Requête vers', event.detail.requestConfig.path)
})

document.body.addEventListener('htmx:afterSwap', (event) => {
    console.log('DOM mis à jour', event.detail.target)
})

document.body.addEventListener('htmx:responseError', (event) => {
    console.error('Erreur HTTP', event.detail.xhr.status)
})

Événements souvent utiles :

  • htmx:beforeRequest : annuler ou inspecter avant la requête;
  • htmx:configRequest : modifier paramètres et headers;
  • htmx:beforeSend : juste avant l’envoi, sans annulation possible;
  • htmx:afterRequest : requête terminée;
  • htmx:beforeSwap : modifier shouldSwap, la cible ou la stratégie;
  • htmx:afterSwap : contenu inséré;
  • htmx:afterSettle : cycle DOM terminé;
  • htmx:load : nouveau nœud initialisé par htmx;
  • htmx:confirm : remplacer la confirmation par défaut;
  • htmx:sendError, htmx:responseError et htmx:swapError : erreurs.

Pour déclencher manuellement un événement htmx :

htmx.trigger('#orders', 'orders:refresh')

Et pour écouter cet événement dans le HTML :

<section
    id="orders"
    hx-get="/orders"
    hx-trigger="orders:refresh from:body"
>
    Commandes
</section>

hx-on: et logique locale

htmx 2.x préfère la syntaxe hx-on: pour écouter un événement directement sur un élément :

<button
    hx-get="/status"
    hx-on::after-request="this.classList.add('done')"
>
    Actualiser
</button>

La forme hx-on::after-request est un raccourci pour un événement htmx nommé htmx:afterRequest. Pour un événement personnalisé, utilise par exemple hx-on:my-event.

Garde cette logique courte. Quand le comportement devient partagé ou complexe, déplace-le dans un module JavaScript ou une extension plutôt que de créer un gros script inline difficile à tester.

Extensions et WebSockets/SSE

Depuis htmx 2.0, les extensions ne font plus partie du package principal. Les extensions sont maintenues séparément et sont disponibles depuis le site officiel des extensions htmx.

Cela concerne notamment les intégrations WebSockets et Server-Sent Events. Le cœur 2.0 ne fournit plus les anciens attributs SSE/WS dépréciés de htmx 1.x. Installe l’extension correspondant à ton besoin et charge-la explicitement avec hx-ext.

<script src="/assets/js/htmx.min.js"></script>
<script src="/assets/js/ws.js"></script>

<body hx-ext="ws">
    <div ws-connect="/chat"></div>
</body>

Vérifie la documentation de l’extension et sa version séparément du commit du cœur htmx. Ne mélange pas silencieusement une extension 1.x avec htmx 2.x.

Sécurité

htmx ne remplace pas les protections du backend. Les règles importantes :

  • valide toujours les permissions côté serveur;
  • protège les requêtes mutantes contre la CSRF;
  • échappe le HTML rendu côté serveur;
  • limite les URLs et sélecteurs construits avec des données utilisateur;
  • évite js: et javascript: dans hx-vals ou hx-headers avec du contenu non fiable;
  • configure une CSP compatible avec les expressions que tu utilises;
  • traite les réponses htmx comme du HTML, donc avec les mêmes exigences d’échappement qu’une page normale.

Pour les requêtes avec un cookie de session, une stratégie CSRF courante consiste à injecter un token dans les paramètres ou headers, puis à le valider dans le backend. La mécanique exacte dépend du framework serveur.

Gotchas et troubleshooting

Rien ne se passe

Vérifie :

  1. que le script htmx est chargé;
  2. que la console navigateur ne montre pas une erreur JavaScript;
  3. que l’élément possède un attribut hx-get, hx-post, etc.;
  4. que l’événement naturel ou hx-trigger correspond à ton interaction;
  5. que le endpoint répond et que l’URL est correcte;
  6. que hx-target pointe vers un élément réel;
  7. que la réponse contient le fragment HTML attendu.

La réponse remplace le mauvais élément

Commence par expliciter hx-target et hx-swap :

<button
    hx-get="/panel"
    hx-target="#panel"
    hx-swap="outerHTML"
>
    Recharger
</button>

Inspecte aussi l’héritage : un hx-target ou hx-swap sur un parent peut influencer l’enfant.

La requête part trop souvent

Utilise changed, delay, throttle, once ou un hx-trigger plus précis. Pour une recherche en direct, input changed delay:300ms est habituellement un meilleur point de départ qu’un keyup sans délai.

L’état d’un widget disparaît

Un swap détruit et recrée du DOM. Utilise hx-preserve pour un élément identifiable qui doit survivre, ou réinitialise ton widget sur htmx:load/htmx:afterSwap. Pour un lecteur vidéo ou un composant tiers, vérifie que l’élément possède un id stable.

Une page boostée ne fonctionne pas comme une navigation normale

Retourne une structure HTML complète pour une navigation complète et assure-toi que le fragment rendu pour htmx contient la cible attendue. Utilise HX-Request ou HX-Boosted côté serveur pour distinguer les deux chemins.

Erreur de cible hors bande

Chaque élément hx-swap-oob doit avoir une cible correspondante dans le DOM. En htmx 2.0.9, l’événement htmx:oobErrorNoTarget expose aussi le sélecteur fautif, ce qui facilite le diagnostic.

Les extensions ne se chargent plus après une migration 1.x → 2.x

Les extensions ont été séparées du cœur en 2.0. Installe le package ou le fichier de l’extension, charge-le après htmx et déclare hx-ext au bon niveau.

Fonctionnalités plus avancées

API JavaScript

Pour les cas où le HTML seul ne suffit pas, htmx expose notamment :

htmx.ajax('GET', '/users', {
    target: '#users',
    swap: 'innerHTML',
})

Utilise l’API pour intégrer htmx à une logique JavaScript existante, pas comme prétexte pour déplacer toute l’interface dans du code impératif.

Requête configurable

Le hook htmx:configRequest permet d’ajouter un token ou une valeur calculée :

document.body.addEventListener('htmx:configRequest', (event) => {
    event.detail.headers['X-CSRF-Token'] = readCsrfToken()
    event.detail.parameters.locale = 'fr-CA'
})

Le token doit venir d’une source contrôlée et être validé par le serveur.

View Transitions

La stratégie hx-swap="innerHTML transition:true" peut envelopper le swap dans l’API View Transitions lorsqu’elle est disponible. Prévois un fallback visuel normal pour les navigateurs qui ne supportent pas cette API.

Scripts dans les fragments

Le HTML retourné peut contenir des scripts, mais il faut traiter ça comme une surface de sécurité et de maintenance importante. Préfère des événements htmx:load, des composants idempotents et des modules chargés une seule fois.

Architecture du dépôt au commit documenté

Le dépôt officiel est un package npm orienté navigateur :

src/htmx.js                 # source principale
src/htmx.test.ts            # tests et types côté source
dist/htmx.js                # build browser-readable
dist/htmx.min.js            # build minifié
dist/htmx.esm.js            # build ESM
dist/htmx.amd.js            # build AMD
dist/htmx.cjs.js            # build CommonJS
www/content/                # documentation du projet
www/content/attributes/     # référence des attributs
www/content/examples/       # exemples pratiques

Les scripts importants déclarés dans package.json sont :

npm run dist
npm run lint
npm run types-check
npm run test:chrome
npm run test:firefox
npm run test:webkit
npm run test:all
npm run test:ci

Pour utiliser htmx dans une application, tu n’as normalement pas besoin d’exécuter ces scripts : installe le package ou charge le build distribué. Ces commandes servent surtout aux contributeurs qui modifient le dépôt.

Sources

  • Dépôt officiel : https://github.com/bigskysoftware/htmx
  • Commit documenté : https://github.com/bigskysoftware/htmx/commit/6ff7c482b0879dcd6fa0210aa84155131eef2d02
  • Tag : https://github.com/bigskysoftware/htmx/tree/v2.0.9
  • Documentation officielle : https://htmx.org/docs/
  • Référence des attributs : https://htmx.org/reference/
  • Exemples officiels : https://htmx.org/examples/
  • Extensions : https://htmx.org/extensions/
  • Historique des changements : https://github.com/bigskysoftware/htmx/blob/v2.0.9/CHANGELOG.md
  • Installation jsDelivr : https://htmx.org/docs/#installing

Cette fiche a été rédigée à partir du dépôt officiel cloné au commit indiqué, de son README, de son changelog, de sa documentation et de ses fichiers de référence. Les exemples htmx sont dérivés de ces sources; ils n’ont pas été exécutés comme une suite de tests applicatifs. La validation effectuée ici porte sur le build MkDocs.