Java Is Fast. Your Code Might Not Be. | Jonathan Vogel
(Permalink)
µJS est une bibliothèque JavaScript open source (licence MIT) qui permet de rendre un site web dynamique sans recourir à un framework frontend lourd. Elle s’inspire de pjax, Turbo et HTMX, avec pour objectif d’être plus simple et plus légère.
µJS intercepte les clics sur les liens et les soumissions de formulaires pour charger les pages via AJAX, au lieu de déclencher un rechargement complet du navigateur. Le contenu récupéré remplace tout ou partie de la page courante. Le résultat : une navigation fluide, sans rechargement visible, sans écrire une seule ligne de JavaScript.
Aucune étape de build, aucune dépendance, compatible avec n’importe quel backend (PHP, Python, Go, Ruby…).
mu-patch-target dans la réponse HTML du serveurVia CDN :
<script src="https://cdn.jsdelivr.net/npm/@digicreon/mujs/dist/mu.min.js"></script>
<script>mu.init();</script>
Via npm :
npm install @digicreon/mujs
Par défaut, tous les liens internes sont interceptés automatiquement. Le <body> de la page cible remplace le <body> courant.
<!DOCTYPE html>
<html>
<head>
<title>Mon site</title>
</head>
<body>
<nav>
<a href="/">Accueil</a>
<a href="/articles">Articles</a>
<a href="/contact">Contact</a>
</nav>
<main id="contenu">
<p>Contenu de la page.</p>
</main>
<script src="https://cdn.jsdelivr.net/npm/@digicreon/mujs/dist/mu.min.js"></script>
<script>mu.init();</script>
</body>
</html>
Aucun attribut supplémentaire. Les boutons retour/avant du navigateur fonctionnent, l’URL est mise à jour, le titre de la page aussi.
Pour ne remplacer qu’un fragment de la page plutôt que le <body> entier :
<a href="/articles" mu-target="#contenu" mu-source="#contenu">Articles</a>
Dans ce cas, µJS va récupérer la page /articles, va extraire l’élément #contenu de la réponse, et remplace l’élément #contenu courant avec.
Si tous les changements de pages se font dans l’élément #contenu, on peut généraliser dans la configuration (pour éviter d’avoir à mettre des attributs mu-target et mu-source sur tous les liens) :
<script>
mu.init({
target: "#contenu",
source: "#contenu"
});
</script>
<input type="text" name="q"
mu-trigger="change"
mu-debounce="300"
mu-url="/recherche"
mu-target="#resultats"
mu-source="#resultats"
mu-mode="update">
<div id="resultats"></div>
Le serveur reçoit une requête GET vers /recherche?q=... et retourne un fragment HTML. µJS l'injecte dans #resultats. Aucun JavaScript à écrire côté client.
Côté HTML :
<form action="/commentaire/ajouter" method="post" mu-mode="patch">
<textarea name="contenu"></textarea>
<button type="submit">Envoyer</button>
</form>
<ul id="commentaires">
<!-- liste des commentaires -->
</ul>
<span id="compteur">3 commentaires</span>
Le serveur retourne plusieurs fragments HTML dans une seule réponse. Chaque fragment indique sa cible via mu-patch-target :
<!-- Ajoute le nouveau commentaire à la liste -->
<li class="commentaire" mu-patch-target="#commentaires" mu-patch-mode="append">
<p>Le nouveau commentaire</p>
</li>
<!-- Met à jour le compteur -->
<span mu-patch-target="#compteur">4 commentaires</span>
<!-- Réinitialise le formulaire -->
<form action="/commentaire/ajouter" method="post" mu-patch-target="form">
<textarea name="contenu"></textarea>
<button type="submit">Envoyer</button>
</form>
Une seule requête HTTP, trois fragments mis à jour simultanément. Le serveur garde le contrôle total sur ce qui est mis à jour et comment.
Commentaires : voir le flux Atom ouvrir dans le navigateur