@madojs/mado 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +291 -0
- package/CHANGELOG.md +23 -0
- package/LICENSE +21 -0
- package/README.md +371 -0
- package/ROADMAP.md +52 -0
- package/dist/src/component.d.ts +48 -0
- package/dist/src/component.js +140 -0
- package/dist/src/component.js.map +1 -0
- package/dist/src/context.d.ts +40 -0
- package/dist/src/context.js +67 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/css.d.ts +54 -0
- package/dist/src/css.js +137 -0
- package/dist/src/css.js.map +1 -0
- package/dist/src/devtools.d.ts +22 -0
- package/dist/src/devtools.js +63 -0
- package/dist/src/devtools.js.map +1 -0
- package/dist/src/diagnostics.d.ts +11 -0
- package/dist/src/diagnostics.js +28 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/each.d.ts +39 -0
- package/dist/src/each.js +35 -0
- package/dist/src/each.js.map +1 -0
- package/dist/src/forms.d.ts +71 -0
- package/dist/src/forms.js +161 -0
- package/dist/src/forms.js.map +1 -0
- package/dist/src/head.d.ts +19 -0
- package/dist/src/head.js +97 -0
- package/dist/src/head.js.map +1 -0
- package/dist/src/html/bindings.d.ts +78 -0
- package/dist/src/html/bindings.js +304 -0
- package/dist/src/html/bindings.js.map +1 -0
- package/dist/src/html/parser.d.ts +64 -0
- package/dist/src/html/parser.js +521 -0
- package/dist/src/html/parser.js.map +1 -0
- package/dist/src/html/template-types.d.ts +27 -0
- package/dist/src/html/template-types.js +8 -0
- package/dist/src/html/template-types.js.map +1 -0
- package/dist/src/html/template.d.ts +45 -0
- package/dist/src/html/template.js +119 -0
- package/dist/src/html/template.js.map +1 -0
- package/dist/src/html.d.ts +16 -0
- package/dist/src/html.js +16 -0
- package/dist/src/html.js.map +1 -0
- package/dist/src/index.d.ts +35 -0
- package/dist/src/index.js +39 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lazy.d.ts +38 -0
- package/dist/src/lazy.js +73 -0
- package/dist/src/lazy.js.map +1 -0
- package/dist/src/lifecycle.d.ts +45 -0
- package/dist/src/lifecycle.js +66 -0
- package/dist/src/lifecycle.js.map +1 -0
- package/dist/src/page.d.ts +161 -0
- package/dist/src/page.js +38 -0
- package/dist/src/page.js.map +1 -0
- package/dist/src/persisted.d.ts +47 -0
- package/dist/src/persisted.js +119 -0
- package/dist/src/persisted.js.map +1 -0
- package/dist/src/resource.d.ts +120 -0
- package/dist/src/resource.js +275 -0
- package/dist/src/resource.js.map +1 -0
- package/dist/src/router/manifest.d.ts +56 -0
- package/dist/src/router/manifest.js +302 -0
- package/dist/src/router/manifest.js.map +1 -0
- package/dist/src/router/match.d.ts +62 -0
- package/dist/src/router/match.js +117 -0
- package/dist/src/router/match.js.map +1 -0
- package/dist/src/router/navigation.d.ts +89 -0
- package/dist/src/router/navigation.js +263 -0
- package/dist/src/router/navigation.js.map +1 -0
- package/dist/src/router.d.ts +13 -0
- package/dist/src/router.js +13 -0
- package/dist/src/router.js.map +1 -0
- package/dist/src/signal.d.ts +67 -0
- package/dist/src/signal.js +238 -0
- package/dist/src/signal.js.map +1 -0
- package/docs/README.md +12 -0
- package/docs/en/00-the-mado-way.md +106 -0
- package/docs/en/01-routing.md +204 -0
- package/docs/en/02-project-layout.md +58 -0
- package/docs/en/03-static-bake.md +251 -0
- package/docs/en/04-ide-setup.md +162 -0
- package/docs/en/05-why-mado.md +193 -0
- package/docs/en/06-for-backenders.md +422 -0
- package/docs/en/07-llm-pitfalls.md +486 -0
- package/docs/en/08-llm-zero-history-test.md +56 -0
- package/docs/en/09-shadow-vs-light-dom.md +122 -0
- package/docs/en/README.md +16 -0
- package/docs/fr/00-the-mado-way.md +108 -0
- package/docs/fr/01-routing.md +202 -0
- package/docs/fr/02-project-layout.md +58 -0
- package/docs/fr/03-static-bake.md +290 -0
- package/docs/fr/04-ide-setup.md +162 -0
- package/docs/fr/05-why-mado.md +193 -0
- package/docs/fr/06-for-backenders.md +432 -0
- package/docs/fr/07-llm-pitfalls.md +487 -0
- package/docs/fr/08-llm-zero-history-test.md +60 -0
- package/docs/fr/09-shadow-vs-light-dom.md +121 -0
- package/docs/fr/README.md +16 -0
- package/docs/ru/00-the-mado-way.md +93 -0
- package/docs/ru/01-routing.md +194 -0
- package/docs/ru/02-project-layout.md +57 -0
- package/docs/ru/03-static-bake.md +251 -0
- package/docs/ru/04-ide-setup.md +144 -0
- package/docs/ru/05-why-mado.md +193 -0
- package/docs/ru/06-for-backenders.md +422 -0
- package/docs/ru/07-llm-pitfalls.md +485 -0
- package/docs/ru/08-llm-zero-history-test.md +56 -0
- package/docs/ru/09-shadow-vs-light-dom.md +122 -0
- package/docs/ru/README.md +14 -0
- package/docs/uk/00-the-mado-way.md +54 -0
- package/docs/uk/01-routing.md +82 -0
- package/docs/uk/02-project-layout.md +46 -0
- package/docs/uk/03-static-bake.md +49 -0
- package/docs/uk/04-ide-setup.md +26 -0
- package/docs/uk/05-why-mado.md +34 -0
- package/docs/uk/06-for-backenders.md +50 -0
- package/docs/uk/07-llm-pitfalls.md +82 -0
- package/docs/uk/08-llm-zero-history-test.md +31 -0
- package/docs/uk/09-shadow-vs-light-dom.md +40 -0
- package/docs/uk/README.md +16 -0
- package/llms.txt +155 -0
- package/package.json +81 -0
- package/scripts/bake.mjs +406 -0
- package/scripts/bundle.mjs +146 -0
- package/scripts/cli.mjs +382 -0
- package/scripts/new.mjs +80 -0
- package/scripts/preview.mjs +176 -0
- package/scripts/release-notes.mjs +66 -0
- package/scripts/showcase-regression.mjs +392 -0
- package/server/serve.mjs +292 -0
- package/starters/crud/README.md +21 -0
- package/starters/crud/index.html +20 -0
- package/starters/crud/package.json +17 -0
- package/starters/crud/src/components/app-shell.ts +51 -0
- package/starters/crud/src/components/ticket-detail.ts +33 -0
- package/starters/crud/src/components/ticket-form.ts +69 -0
- package/starters/crud/src/components/ticket-list.ts +66 -0
- package/starters/crud/src/lib/api.ts +76 -0
- package/starters/crud/src/main.ts +12 -0
- package/starters/crud/src/pages/home.ts +18 -0
- package/starters/crud/src/pages/not-found.ts +12 -0
- package/starters/crud/src/pages/ticket-detail.ts +6 -0
- package/starters/crud/src/pages/ticket-new.ts +6 -0
- package/starters/crud/src/pages/tickets.ts +6 -0
- package/starters/crud/src/routes.ts +9 -0
- package/starters/crud/src/styles/global.ts +155 -0
- package/starters/crud/tsconfig.json +15 -0
- package/starters/minimal/README.md +19 -0
- package/starters/minimal/index.html +20 -0
- package/starters/minimal/package.json +17 -0
- package/starters/minimal/src/components/app-counter.ts +31 -0
- package/starters/minimal/src/main.ts +9 -0
- package/starters/minimal/src/pages/home.ts +18 -0
- package/starters/minimal/src/pages/not-found.ts +14 -0
- package/starters/minimal/src/routes.ts +6 -0
- package/starters/minimal/src/styles/global.ts +60 -0
- package/starters/minimal/tsconfig.json +15 -0
- package/templates/page-detail.ts +63 -0
- package/templates/page-form.ts +94 -0
- package/templates/page-list.ts +79 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Support IDE pour `html\`\`` et `css\`\``
|
|
2
|
+
|
|
3
|
+
Par défaut, `html\`...\`` et `css\`...\`` ne sont que des tagged-template strings.
|
|
4
|
+
TypeScript ne les connaît pas, l'IDE ne les colore pas. C'est un **compromis délibéré**
|
|
5
|
+
en faveur de zéro dépendances runtime et pas de plugins de build.
|
|
6
|
+
|
|
7
|
+
La bonne nouvelle : Mado utilise les mêmes conventions que [lit](https://lit.dev), donc les
|
|
8
|
+
outils IDE **prêts à l'emploi** de l'écosystème lit fonctionnent directement.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## VS Code (configuration recommandée)
|
|
13
|
+
|
|
14
|
+
### 1. Installer [lit-plugin](https://marketplace.visualstudio.com/items?itemName=runem.lit-plugin)
|
|
15
|
+
|
|
16
|
+
VS Code → Extensions → chercher **"lit-plugin"** (par runem) → Installer.
|
|
17
|
+
|
|
18
|
+
Ce que vous obtenez :
|
|
19
|
+
|
|
20
|
+
- Coloration HTML à l'intérieur de `html\`\``.
|
|
21
|
+
- Coloration CSS à l'intérieur de `css\`\``.
|
|
22
|
+
- Auto-complétion pour les tags HTML, attributs et événements.
|
|
23
|
+
- Vérification des fautes de frappe dans les attributs.
|
|
24
|
+
- Aller à la définition pour les custom elements (si décrits via `customElements.json` ou JSDoc).
|
|
25
|
+
- Diagnostics sur les bindings invalides.
|
|
26
|
+
|
|
27
|
+
### 2. Spécifier les noms de tags
|
|
28
|
+
|
|
29
|
+
`lit-plugin` cherche les identifiants `html` et `css` dans les imports. Si vous ne les
|
|
30
|
+
renommez pas à l'import — la configuration est nulle, tout fonctionne :
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { html, css } from "@madojs/mado";
|
|
34
|
+
|
|
35
|
+
const tpl = html`<button @click=${fn}>${label}</button>`;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 3. (Optionnel) Votre propre `customElements.json`
|
|
39
|
+
|
|
40
|
+
Si vous voulez l'auto-complétion pour vos propres composants `<x-*>`, décrivez-les via
|
|
41
|
+
[Custom Elements Manifest](https://github.com/webcomponents/custom-elements-manifest) :
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm install --save-dev @custom-elements-manifest/analyzer
|
|
45
|
+
npx cem analyze --globs "src/components/**/*.ts"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Cela crée `custom-elements.json`, que `lit-plugin` récupère automatiquement.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## WebStorm / IntelliJ
|
|
53
|
+
|
|
54
|
+
WebStorm comprend `html\`\`` et `css\`\`` **nativement** — support natif des template literals
|
|
55
|
+
de style lit depuis 2021. Pas de plugins nécessaires.
|
|
56
|
+
|
|
57
|
+
Si la coloration n'apparaît pas :
|
|
58
|
+
|
|
59
|
+
- Settings → Languages & Frameworks → JavaScript → vérifiez que "Use types from server" est activé
|
|
60
|
+
- Redémarrer le serveur TS : ⌘+⇧+P → "Restart TypeScript Server"
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Neovim / Helix
|
|
65
|
+
|
|
66
|
+
Utilisez [`lit-html-server`](https://github.com/runem/lit-analyzer/tree/master/packages/lit-html-server)
|
|
67
|
+
(serveur LSP du même auteur que lit-plugin) :
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm install -g lit-html-server
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`init.lua` (pour `lspconfig`) :
|
|
74
|
+
|
|
75
|
+
```lua
|
|
76
|
+
require('lspconfig').lit_html.setup{
|
|
77
|
+
cmd = { 'lit-html-server', '--stdio' },
|
|
78
|
+
filetypes = { 'typescript', 'javascript' },
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Ce qui ne fonctionne PAS (limitations connues)
|
|
85
|
+
|
|
86
|
+
- **Vérification de type des bindings de signal.** `html\`<input .value=${count}>\`` — `lit-plugin`
|
|
87
|
+
attend une string, mais `count` est un `Signal<number>`. Supprimez avec `// @ts-expect-error`
|
|
88
|
+
ou `<!-- @ts-ignore -->`. Sera amélioré en Phase 3+.
|
|
89
|
+
- **Les directives personnalisées (`each`)** sont reconnues comme des fonctions ordinaires — sans
|
|
90
|
+
sémantique spéciale dans le plugin.
|
|
91
|
+
- **Les attributs avec préfixes `@`, `.`, `?`** sont parfois signalés comme des erreurs si
|
|
92
|
+
`lit-plugin` a `"no-unknown-attribute": false` désactivé. Dans `.vscode/settings.json` :
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"lit-plugin.rules": {
|
|
97
|
+
"no-unknown-attribute": "off",
|
|
98
|
+
"no-incompatible-type-binding": "off"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Typage JSDoc pour les composants
|
|
106
|
+
|
|
107
|
+
Pour que l'IDE récupère les custom elements à l'intérieur de `html\`\``, annotez la
|
|
108
|
+
définition `component()` via JSDoc :
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
/**
|
|
112
|
+
* @element x-counter
|
|
113
|
+
* @attr {number} initial - valeur de départ
|
|
114
|
+
* @fires {CustomEvent<number>} change - à chaque changement
|
|
115
|
+
*/
|
|
116
|
+
component("x-counter", () => {
|
|
117
|
+
/* ... */
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`lit-plugin` le reconnaît et suggère des attributs quand vous tapez `<x-counter ...>`.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Prettier / formatage
|
|
126
|
+
|
|
127
|
+
Prettier 3.0+ formate `html\`\`` via [`@prettier/plugin-xml`](https://github.com/prettier/plugin-xml)
|
|
128
|
+
ou le mode intégré. `.prettierrc` minimal :
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"semi": true,
|
|
133
|
+
"singleQuote": false,
|
|
134
|
+
"embeddedLanguageFormatting": "auto"
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`embeddedLanguageFormatting: "auto"` (par défaut) formate le contenu des tagged-template
|
|
139
|
+
literals avec des tags connus (`html`, `css`).
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## ESLint
|
|
144
|
+
|
|
145
|
+
Si vous utilisez ESLint, le plugin [`eslint-plugin-lit`](https://github.com/43081j/eslint-plugin-lit)
|
|
146
|
+
fournit des règles spécifiques au HTML en tagged-template, et
|
|
147
|
+
[`eslint-plugin-wc`](https://github.com/43081j/eslint-plugin-wc) couvre les Web Components
|
|
148
|
+
en général. La configuration est à votre discrétion, elle n'est pas obligatoire.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## TL;DR
|
|
153
|
+
|
|
154
|
+
| Éditeur | Configuration | Niveau DX |
|
|
155
|
+
|---|---|---|
|
|
156
|
+
| **VS Code** | installer `lit-plugin` | ★★★★ |
|
|
157
|
+
| **WebStorm** | rien | ★★★★ |
|
|
158
|
+
| **Neovim/Helix** | `lit-html-server` via LSP | ★★★ |
|
|
159
|
+
| **Vim sans LSP** | manuel | ★ |
|
|
160
|
+
|
|
161
|
+
Mado fonctionne aussi sans plugin IDE : `html\`\`` reste du code TS valide, tout se
|
|
162
|
+
compile et s'exécute. La string à l'intérieur est juste colorée comme une string.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Pourquoi Mado (et pourquoi pas Lit / Solid / Alpine / htmx)
|
|
2
|
+
|
|
3
|
+
> Si vous choisissez un stack frontend pour un nouveau projet, cette page est pour vous.
|
|
4
|
+
> Si vous avez déjà quelque chose qui fonctionne — **ne migrez pas pour le plaisir de migrer**, ça coûte toujours plus cher qu'il n'y paraît.
|
|
5
|
+
|
|
6
|
+
Mado n'est pas un "tueur" de React/Vue/Svelte. C'est un outil spécialisé. J'explique ici honnêtement **dans quels cas Mado est vraiment meilleur que les alternatives**, et dans lesquels il ne l'est pas.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## TL;DR — un seul tableau
|
|
11
|
+
|
|
12
|
+
| Si vous vous souciez de… | Choisissez |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Meilleure infrastructure d'apprentissage / grand écosystème | **React** ou **Vue** |
|
|
15
|
+
| Design system de composants pour l'intégration dans n'importe quel framework | **Lit** |
|
|
16
|
+
| Top performance sur les grandes listes, "proche du vanilla" avec JSX | **Solid** ou **Svelte 5** |
|
|
17
|
+
| Amélioration progressive d'apps classiques rendues côté serveur | **htmx** + votre backend |
|
|
18
|
+
| "Saupoudrer" de la réactivité sur un site statique | **Alpine.js** |
|
|
19
|
+
| Outillage minimal, maximum de plateforme, tout dans une boîte (router + data + forms + SEO), lisible en une soirée | **Mado** ✓ |
|
|
20
|
+
|
|
21
|
+
Si votre cas ne tombe pas dans le dernier point — Mado n'est probablement pas le meilleur choix. C'est normal.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Mado vs Lit
|
|
26
|
+
|
|
27
|
+
**Lit** est l'alternative la plus proche dans l'esprit. Même approche : Web Components + tagged templates + magie minimale.
|
|
28
|
+
|
|
29
|
+
| | Lit | Mado |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Taille | ~6 Ko | ~16 Ko |
|
|
32
|
+
| Âge / support | ~10 ans, Google | 6 mois, auteur unique |
|
|
33
|
+
| Réactivité | décorateurs `@property` + `requestUpdate` manuel | signals (`signal`/`computed`/`effect`) intégrés |
|
|
34
|
+
| Router | aucun, vous devez en trouver un (`@lit-labs/router`, etc.) | inclus : `routes()` + nested + prefetch + sync-cache |
|
|
35
|
+
| Chargement de données | aucun, vous devez l'assembler | `resource()` + `mutation()` + invalidation glob |
|
|
36
|
+
| Forms | aucun | `useForm()` sur validation HTML5 native |
|
|
37
|
+
| SEO / statique | complexe (`@lit-labs/ssr`) | `bake` (linkedom) + edge-prerender |
|
|
38
|
+
| Build | nécessite esbuild/rollup/webpack | `tsc` suffit |
|
|
39
|
+
| Style de code | classes + décorateurs | fonctions + tagged templates |
|
|
40
|
+
| Écosystème | réel (Shoelace, Material Web, etc.) | aucun |
|
|
41
|
+
| Quand choisir | écrire un design system / bibliothèque Web Components pour l'intégration | écrire une application complète, vouloir tout dans une boîte |
|
|
42
|
+
|
|
43
|
+
**Pitch honnête :** *"Lit est meilleur si vous écrivez un design system de composants. Mado est meilleur si vous écrivez une application et voulez des batteries incluses sans assembler 8 packages."*
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Mado vs Solid
|
|
48
|
+
|
|
49
|
+
**Solid** est une bibliothèque réactive de premier plan construite sur les signals. Techniquement très impressionnant.
|
|
50
|
+
|
|
51
|
+
| | Solid | Mado |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| Taille | ~7 Ko | ~16 Ko |
|
|
54
|
+
| Performance | top-3 sur js-framework-benchmark | bonne, mais pas au top |
|
|
55
|
+
| Réactivité | signals (même classe d'idées) | signals |
|
|
56
|
+
| Templates | JSX (compilé en expressions réactives) | tagged template `html\`\`` |
|
|
57
|
+
| Modèle de composant | fonctions, nœuds virtuels Solid | Web Components |
|
|
58
|
+
| Build | Vite + babel-plugin-solid requis | `tsc` uniquement |
|
|
59
|
+
| Router | `@solidjs/router` | inclus |
|
|
60
|
+
| Données | `createResource` | `resource()` |
|
|
61
|
+
| SSR | sérieusement supporté (SolidStart) | intentionnellement absent |
|
|
62
|
+
| Écosystème | en croissance, ~50 packages | aucun |
|
|
63
|
+
| Quand choisir | besoin de top performance + JSX + prêt à configurer le build | vouloir tourner sans build / infrastructure minimale |
|
|
64
|
+
|
|
65
|
+
**Pitch honnête :** *"Solid est techniquement plus rapide et plus mature. Mais Solid nécessite Vite + un plugin babel. Mado ne nécessite rien d'autre que `tsc` — c'est 'ouvrir VS Code, F5, et travailler'. Si cette différence n'est pas critique — allez avec Solid."*
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Mado vs Svelte 5
|
|
70
|
+
|
|
71
|
+
**Svelte 5** avec les runes — aussi un modèle signal, aussi minimaliste.
|
|
72
|
+
|
|
73
|
+
| | Svelte 5 | Mado |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| Taille runtime | ~3 Ko | ~16 Ko |
|
|
76
|
+
| Compilateur | requis (.svelte → JS) | aucun |
|
|
77
|
+
| Syntaxe | format .svelte personnalisé | TS + tagged templates |
|
|
78
|
+
| Réactivité | `$state`/`$derived` (runes) | `signal`/`computed` |
|
|
79
|
+
| SSR / SvelteKit | complet, mature | intentionnellement absent |
|
|
80
|
+
| Écosystème | large, excellents dev-tools | aucun |
|
|
81
|
+
| Quand choisir | nouveau projet de production avec une équipe | outil privé/interne, besoin de simplicité |
|
|
82
|
+
|
|
83
|
+
**Pitch honnête :** *"Svelte est un choix produit. Mado est un choix ingénierie. Si vous avez une équipe et une app de production — Svelte. Si vous êtes seul et voulez le contrôle — Mado."*
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Mado vs htmx
|
|
88
|
+
|
|
89
|
+
**htmx** est une autre école : des fragments HTML sur le fil.
|
|
90
|
+
|
|
91
|
+
| | htmx | Mado |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| Architecture | HTML du serveur, mis à jour via des fragments | SPA : JS charge les données, se rend lui-même |
|
|
94
|
+
| Dépendance backend | forte (le backend doit pouvoir servir du HTML) | faible (le backend est une API JSON) |
|
|
95
|
+
| État client | minimal (cookies, localStorage) | complet (signal, persisted) |
|
|
96
|
+
| Mises à jour optimistes | difficiles | faciles (mutation + invalidates) |
|
|
97
|
+
| Offline / PWA | faible | correct |
|
|
98
|
+
| Taille | ~14 Ko | ~16 Ko |
|
|
99
|
+
| Quand choisir | app classique rendue côté serveur (Rails, Django, Phoenix), besoin de "revitaliser" | expérience SPA requise, backend est REST/GraphQL |
|
|
100
|
+
|
|
101
|
+
**Pitch honnête :** *"htmx — si le backend est solide et peut servir du HTML. Mado — si le backend sert du JSON et que vous avez besoin d'une expérience SPA complète."*
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Mado vs Alpine.js
|
|
106
|
+
|
|
107
|
+
**Alpine** — attributs réactifs directement dans le HTML.
|
|
108
|
+
|
|
109
|
+
| | Alpine | Mado |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| Objectif | améliorer du HTML statique | SPA complet |
|
|
112
|
+
| Taille | ~7 Ko | ~16 Ko |
|
|
113
|
+
| Gestion d'état | `x-data` localement | signals + context + persisted |
|
|
114
|
+
| Routage | aucun | inclus |
|
|
115
|
+
| TypeScript | faible | première classe |
|
|
116
|
+
| Quand choisir | sites statiques, landing pages, besoin de 5 boutons interactifs | app complète : pages, navigation, forms, données |
|
|
117
|
+
|
|
118
|
+
**Pitch honnête :** *"Alpine — pour l'interactivité sur les sites statiques. Mado — pour une application complète."*
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Mado vs React + écosystème
|
|
123
|
+
|
|
124
|
+
Je ne vais pas m'étendre là-dessus longtemps, car React est dans une **catégorie différente** en termes d'écosystème et de maturité. Mais si vous comparez sérieusement :
|
|
125
|
+
|
|
126
|
+
**React gagne :**
|
|
127
|
+
- écosystème massif : milliers de kits UI, milliers d'articles, tutoriels infinis ;
|
|
128
|
+
- les assistants IA (ChatGPT, Copilot) connaissent React mieux que tout ;
|
|
129
|
+
- meilleur marché de l'emploi ;
|
|
130
|
+
- meilleur support SSR (Next.js).
|
|
131
|
+
|
|
132
|
+
**Mado gagne :**
|
|
133
|
+
- taille de bundle des dizaines de fois plus petite ;
|
|
134
|
+
- zéro infrastructure (pas de Vite, pas de Babel, pas de 200 packages) ;
|
|
135
|
+
- lisible en une soirée — si quelque chose casse, ouvrez `src/` ;
|
|
136
|
+
- signals au lieu de hooks (pas de règles "ne peut pas être utilisé dans un if", pas de pièges de stale-closure) ;
|
|
137
|
+
- pas besoin de migrer entre les versions majeures.
|
|
138
|
+
|
|
139
|
+
**Quand choisir Mado plutôt que React :**
|
|
140
|
+
- projet de 1–3 personnes, pour des années à venir ;
|
|
141
|
+
- la taille du bundle est critique ;
|
|
142
|
+
- vous êtes fatigué du React fatigue et prêt à sacrifier l'écosystème pour la simplicité.
|
|
143
|
+
|
|
144
|
+
**Quand choisir React :**
|
|
145
|
+
- équipe de 5 personnes ou plus ;
|
|
146
|
+
- vous avez besoin de kits UI, vous avez besoin de l'écosystème ;
|
|
147
|
+
- un projet qui recrutera de nouvelles personnes sur le marché ;
|
|
148
|
+
- vous avez besoin de SSR avec hydratation (Next.js).
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## L'argument le plus fort de Mado
|
|
153
|
+
|
|
154
|
+
Pas la taille, pas la performance, pas les signals — tout a de meilleurs concurrents.
|
|
155
|
+
|
|
156
|
+
> **"Ouvrez le source et lisez-le en une soirée. ~3500 lignes, 12 modules. Si quelque chose casse — vous n'allez pas sur une issue avec 3000 commentaires. Vous allez dans `src/router.ts` et lisez 500 lignes."**
|
|
157
|
+
|
|
158
|
+
C'est ce qu'on appelle la **propriété** — vous possédez le code, plutôt que de dépendre de celui de quelqu'un d'autre.
|
|
159
|
+
|
|
160
|
+
Pour les développeurs backend habitués aux petites bibliothèques compréhensibles (chi en Go, axum en Rust, FastAPI en Python), c'est un **sentiment familier**. Pour ceux à qui ça n'importe pas — prenez ce qui est plus grand et plus mature.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Qu'en est-il de la performance ?
|
|
165
|
+
|
|
166
|
+
Honnêtement : **Mado n'est pas le plus rapide**. Le top-3 sur js-framework-benchmark sont Solid, Inferno et Svelte. Mado est plus proche de Lit / Preact en termes de caractéristiques.
|
|
167
|
+
|
|
168
|
+
Ce que Mado fait pour la performance par défaut :
|
|
169
|
+
- **`computed` lazy** (dirty-flag, pas eager) ;
|
|
170
|
+
- **planificateur de microtâche par batch** pour `signal.set` ;
|
|
171
|
+
- **réconciliation par clé** dans `each()` avec réutilisation réelle du DOM ;
|
|
172
|
+
- **rendu synchrone** pour les pages en cache dans le router ;
|
|
173
|
+
- **hover-prefetch** pour les chunks lazy ;
|
|
174
|
+
- **View Transitions API** pour des transitions fluides ;
|
|
175
|
+
- **`adoptedStyleSheets` partagés** pour le CSS ;
|
|
176
|
+
- **hints `modulepreload`** sur le serveur de développement.
|
|
177
|
+
|
|
178
|
+
C'est suffisant pour la plupart des applications. Si vous construisez Excel dans le navigateur ou une visualisation WebGL à 60fps — ce n'est pas ici (c'est Solid ou du JS natif).
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Résumé
|
|
183
|
+
|
|
184
|
+
Mado est un outil **ciblé** avec un positionnement honnête. Il est le plus fort quand :
|
|
185
|
+
|
|
186
|
+
1. Vous voulez **posséder** le code et le lire en entier.
|
|
187
|
+
2. La **simplicité d'infrastructure** est critique (pas de Vite/Webpack/Babel).
|
|
188
|
+
3. Vous avez besoin de **batteries dans une boîte** (router + données + forms + SEO).
|
|
189
|
+
4. Vous n'êtes pas junior et n'avez pas peur des Web Components.
|
|
190
|
+
|
|
191
|
+
Si même un seul point ne s'applique pas à vous — prenez une alternative du tableau ci-dessus. Ne vous battez pas avec un outil qui ne convient pas.
|
|
192
|
+
|
|
193
|
+
— L'auteur de Mado, ex-développeur React passé au backend qui maintenant colle des frontends dans ses temps libres.
|