DocsAvancé
Comment fonctionne Nexy
Que se passe-t-il entre un fichier que vous écrivez et la page dans le navigateur : les couches traversées par une requête, qui construit quoi et ce que Nexy laisse à votre application. Vous n'avez pas besoin de cette page pour démarrer ; il répond plus tard aux questions « pourquoi ça marche comme ça ».
Les couches
Browser
│
▼
Uvicorn ───── ASGI transport
│
▼
Middleware ── sessions, CORS, gzip, trusted hosts, your own
│
▼
Router ────── FBR | Modular | Custom ── picks the file that answers
│
▼
Renderer ──── HTML (Jinja2, Markdown, Node) or JSON
│
▼
Response| Couche | Responsabilité | Ne |
|---|---|---|
| Uvicorn | accepter la connexion, parler ASGI | je sais ce qu'est une page |
| Intergiciel | décorez la requête : session, CORS, gzip, hôtes de confiance, redirection HTTPS, la vôtre | choisir un itinéraire |
| Routeur | faire correspondre l'URL à un fichier, avec ses mises en page, ses dépendances et ses pages d'erreur | produire du contenu |
| Moteur de rendu | exécuter la page et transformer son résultat en HTML ou JSON | récupérer vos données |
| Client | Vite et votre framework : bundles, hydratation, navigation client | répondre à une requête du serveur |
Qui construit quoi
| Acteur | Possède | Ne possède pas |
|---|---|---|
| Nexy | routage, rendu serveur, actions, compilation .nexy, une origine |
composants, réactivité, données |
| Vite | bundles clients, serveur de développement, rechargement à chaud | routage, rendu du serveur, Actions |
| Votre cadre | composants, réactivité, écosystème | routage, le document (Nexy demande sa mise en page) |
| Votre candidature | données, authentification, autorisation, règles métier | transport, rendu |
La règle derrière le tableau : Nexy construit ce qu'il possède et ne compile jamais ce que Vite compile.
Le système de routage
Un chemin sous src/routes/ devient une URL selon quatre règles :
| Fichier | URL |
|---|---|
blog/index.nexy |
/blog |
blog/[slug].nexy |
/blog/hello |
blog/[...parts].nexy |
/blog/a/b |
(marketing)/about.nexy |
/about |
L'extension n'apparaît jamais ; index est l'itinéraire de son dossier ; un dossier entre parenthèses regroupe les fichiers sans ajouter de segment.
Lorsque deux éléments peuvent répondre à la même URL, le premier enregistré gagne, et Nexy s'inscrit toujours dans cet ordre :
- le point de terminaison Actions ;
- fichiers statiques :
/public,/assets,/favicon.ico; - un
APIRoutermodulaire (useRouter) ; - les routes de fichiers, les plus spécifiques en premier : les chemins statiques, puis les chemins dynamiques avec les segments les plus fixes, puis les fourre-tout.
Deux itinéraires de fichiers de spécificité égale sont enregistrés par ordre alphabétique des chemins, donc [id].nexy répond avant [slug].nexy. Un itinéraire modulaire bat donc une page avec le même chemin. Il s’agit d’un ordre de priorité sur lequel vous pouvez compter, et non d’une règle de départage : donnez à une URL un fichier.
Le système de visualisation
L'extension d'un fichier décide de ce dont il s'agit et la configuration du projet décide quelles extensions sont actives.
| Rallonge | Actif quand | Compilé par | Servi comme |
|---|---|---|---|
.nexy |
mode serveur | Nexy : le frontmatter devient Python, le balisage devient Jinja2 | une page |
.md |
toujours | Nexy : Markdown à saveur GitHub, identifiants de titre, table des matières | une page, à l'intérieur de la mise en page la plus proche |
.mdx |
toujours | Vite, avec React ou Preact | un itinéraire de composants |
.tsx |
useFF est React, Solid ou Preact |
Vite et le cadre | un itinéraire de composants |
.vue |
useFF est Vue |
Vite et Vue | un itinéraire de composants |
.svelte |
useFF est Svelte |
Vite et Svelte | un itinéraire de composants |
.py |
toujours | Python | un gestionnaire d'API : GET, POST, ... sont les méthodes |
Un fichier dont l'extension n'est pas active est ignoré avec un avertissement, non servi. En mode client, .nexy est rejeté avant le démarrage du serveur. Voir Conventions de fichiers.
Le cycle de vie du rendu
Trois questions décident de tout ce qu'un lecteur remarque :
| Question | Réponse | Pages |
|---|---|---|
| Qui produit le HTML ? | le serveur, ou le navigateur pour une route client | Rendu |
| Quand les données sont-elles lues ? | à chaque requête, à chaque régénération, ou dans le navigateur | RSS, ISR |
| Quand arrive JavaScript ? | uniquement pour une île, ou pour l'ensemble du document | Îles, CSR |
En mode serveur, le serveur restitue chaque page, revalidate met en cache une page par URL et les îles ajoutent JavaScript à un composant. En mode client, le premier document est rendu dans Node et la navigation s'effectue ensuite dans le navigateur.
__nexy__/ contient tout ce qui est généré : les pages compilées, l'entrée client, la sortie de build. Ne le modifiez jamais, ne le validez jamais ; supprimez-le pour forcer une version propre.
L'intégration front-end
Vite ne remplace pas Nexy. Vite regroupe et sert le code client. Il n'achemine pas une requête, n'affiche pas de page .nexy, n'exécute pas d'action et ne possède pas l'origine. Le navigateur communique avec une seule origine - celle de Nexy - et en cours de développement avec les proxys Nexy Les points de terminaison de Vite le traversent, il n'y a donc pas de CORS à configurer.
Nexy ne remplace pas React. Nexy décide quel composant est rendu, quand et avec quels accessoires ; le framework possède le modèle de composants, la réactivité et l'écosystème. Une page .nexy importe un composant sous forme d'îlot ; en mode client, une route est un composant.
Pour une route de composant, Python écrit uniquement un module wrapper léger qui pointe vers le fichier. La compilation et le rendu côté serveur sont le travail de Vite.
Développement et production
nx dev vérifie nexyconfig.py, compile les pages, démarre Vite lorsque le projet dispose d'un framework frontend et redémarre le serveur lorsque vous enregistrez. nx build fait le même travail une fois, à l'avance, et nx start sert le résultat.
nx dev |
nx build puis nx start |
|
|---|---|---|
| Pages | compilé lorsque vous enregistrez | compilé une seule fois, à l'avance |
| Code client | Vite serveur de développement avec rechargement à chaud, derrière la propre origine de Nexy | bundle en __nexy__/client/, HTML pré-rendu |
| Node.js | court à côté de Python | pas besoin de servir |
| Erreurs | superposition dans le navigateur, barre d'outils sur chaque page | pages de statut sans détails |
| Origine | un port, 3000 |
un port |
Ce qui ne change pas : les mêmes règles de routage, les mêmes fichiers de pages, les mêmes nexyconfig.py. Une page qui se comporte différemment entre les deux est un bug, pas un mode.
Ce que Nexy vous laisse
Nexy s'arrête volontairement en bordure de votre application :
| Préoccupation | Ce que propose Nexy | Ce que tu écris |
|---|---|---|
| Authentification | middleware de session, AuthenticationMiddleware lorsqu'il est activé |
la connexion, la recherche d'utilisateur, la politique en matière de cookies |
| Autorisation | dependencies.py, gardes, héritage par dossier |
la règle elle-même |
| Base de données | pas d'ORM propre ; nx new peut échafauder SQLModel, SQLAlchemy ou Tortoise, nx migrate exécute Alembic ou Aerich |
les modèles et les requêtes (Bases de données) |
| Internationalisation | rien pour vos pages ; seule la CLI est traduite | la bibliothèque et les messages (i18n) |
| Travaux en arrière-plan | rien : pas de file d'attente, pas de planificateur | un processus de travail |
| E-mail, paiements, recherche | rien | le service que vous choisissez |
La raison est la même pour les six : un framework qui sélectionne votre ORM ou votre bibliothèque d'authentification décide des choses que seule votre application peut décider. Le coût est explicite : rien n'est câblé pour vous, et les guides liés dans le tableau indiquent où brancher chacun.
Prochaines étapes
- Structure du projet : où chaque partie vit dans un projet
- Routage : les routeurs basés sur fichiers, modulaires et personnalisés
- Rendu : SSR, ISR, CSR et îles
- Frontend : Vite, style et build client