Moteur CSS Rust
bext comprend un compilateur Tailwind CSS v4 natif Rust optimisé par encre-css. Il remplace le pipeline TypeScript Tailwind par une implémentation pure Rust qui s'exécute à l'intérieur du processus serveur – aucun sous-processus Node.js ou Bun n'est nécessaire pour CSS.
Pourquoi#
Le pipeline de construction Tailwind traditionnel nécessite Bun pour exécuter le package npm tailwindcss. Cela fonctionne mais ajoute de la latence aux builds, nécessite un runtime JS pour CSS et permet aux modifications CSS uniquement de déclencher des reconstructions complètes du bundle.
Le moteur CSS Rust élimine tout cela :
| TypeScript Vent arrière | Moteur CSS Rust | |
|---|---|---|
| Temps de construction CSS | ~200-500 ms (sous-processus Bun) | ~1-30 ms (en cours) |
| Modification de fichier CSS uniquement | Reconstruction complète du chignon | Reconstruction de rouille, pas de chignon |
| CSS par itinéraire | Pas disponible | Automatique (<style> en ligne) |
| Dépendance d'exécution | Chignon + tailwindcss npm | Aucun (compilé en binaire) |
| Rechargement à chaud en mode développement | Observateur de fichiers + Bun | Observateur de fichiers + Rust |
Les modifications de fichiers CSS uniquement (pas de modifications .ts / .tsx) déclenchent une reconstruction rapide uniquement pour Rust qui ignore complètement Bun et envoie un HMR css-update aux navigateurs en mode développement. Si vous modifiez les styles et ne voyez pas les mises à jour en direct, confirmez que route-css apparaît dans bext-server version.
Activation#
La fonctionnalité route-css est incluse dans les versions par défaut. Aucune configuration nécessaire : cela fonctionne automatiquement.
Pour vérifier qu'il est compilé dans :
bext version
# Look for "route-css" in the feature flags
Pour le désactiver explicitement :
cargo build -p bext-server --release \
--no-default-features \
--features v8,tls,nginx-compat
Comment ça marche#
Au démarrage#
Lorsque bext initialise un site PRISM, il construit public/styles.css à partir de Rust avant le démarrage du pool de rendu :
PRISM init → bext_css::build_site_css() → scan src/**/*.{tsx,ts,jsx,css,html}
→ extract class candidates → encre-css generate → write public/styles.css
Le script de construction TypeScript ignore automatiquement sa propre étape Tailwind (via la variable d'environnement BEXT_RUST_CSS=1).
CSS par itinéraire#
Après chaque rendu SSR, bext analyse le HTML rendu pour les attributs class="..." et génère un bloc <style data-bext-css> contenant uniquement les utilitaires Tailwind utilisés sur cette page spécifique. Celui-ci est injecté avant </head>.
<!-- Before: generic styles.css with everything -->
<link rel="stylesheet" href="/styles.css" />
<!-- After: also includes per-route minimal CSS -->
<link rel="stylesheet" href="/styles.css" />
<style data-bext-css>
.flex { display: flex; }
.items-center { align-items: center; }
.gap-4 { gap: 1rem; }
/* only classes used on THIS page */
</style>
Cela fonctionne sur les deux chemins de rendu :
- Mode à la demande : après
renderToString()renvoie HTML - Mode prédéfini : après que
__fetchrenvoie une réponse HTML
Rechargement en direct CSS uniquement#
Lorsque l'observateur de fichiers détecte que seuls les fichiers .css ont été modifiés (pas de .ts / .tsx ), il emprunte un chemin rapide :
- Saute complètement le chignon
- Appelle
bext_css::build_site_css()dans Rust (~ 1 ms) - Efface le cache de réponse ISR
- Envoie HMR
css-updateaux navigateurs connectés
En mode développement, le client HMR échange à chaud les feuilles de style <link> et les blocs <style data-bext-css> en ligne sans recharger la page.
CLI#
Créer du CSS pour un site#
bext css sites/cloud
Construire du CSS pour tous les sites#
bext css sites/ --all
Sortir:
Building CSS for all sites in sites/
main 12.4 KB
registry 8.6 KB
learn 8.4 KB
status 8.4 KB
companion-site 8.3 KB
blog 8.1 KB
docs 7.6 KB
cloud 5.9 KB
8 sites, 66.8 KB total, 280ms
Construire avec bext build#
CSS est construit automatiquement avant le bundle JS :
bext build
# css 12.4 KB (Rust)
# Build complete in 1200ms (bundle: .bext/production.js)
Ignorez CSS si vous souhaitez utiliser un styles.css existant :
bext build --no-css
Thème#
Les jetons de conception bext sont compilés dans le moteur :
Couleurs#
| Jeton | Valeur | Usage |
|---|---|---|
bext-black |
#0a0a0a |
bg-bext-black, text-bext-black |
bext-white |
#fafafa |
bg-bext-white, text-bext-white |
bext-accent-2 |
#10b981 |
bg-bext-accent-2, text-bext-accent-2 |
bext-error |
#ef4444 |
text-bext-error, border-bext-error |
bext-warning |
#f59e0b |
text-bext-warning |
bext-success |
#10b981 |
text-bext-success |
bext-info |
#3b82f6 |
text-bext-info |
bext-cloud |
#8b5cf6 |
Accent du site : tableau de bord cloud |
bext-registry |
#f59e0b |
Accent du site : Registre des plugins |
bext-learn |
#10b981 |
Accent du site : plateforme d'apprentissage |
bext-companion |
#6366f1 |
Accent du site : application compagnon |
Polices#
- Sans :
"Inter", system-ui, -apple-system, sans-serif - Mono :
"JetBrains Mono", "Fira Code", monospace
Mode sombre#
Mode sombre basé sur les classes à l'aide du sélecteur .dark :
<div className="bg-white dark:bg-gray-900 text-black dark:text-white">
Adapts to dark mode
</div>
Points d'arrêt réactifs#
Tous les points d’arrêt standards Tailwind v4 sont disponibles :
<div className="hidden md:flex lg:grid lg:grid-cols-3">
Responsive layout
</div>
Propriétés personnalisées CSS#
Le moteur génère également des propriétés CSS personnalisées (jetons de conception) à utiliser dans les CSS écrits à la main :
:root {
--bext-black: #0a0a0a;
--bext-white: #fafafa;
--bext-accent: #3b82f6;
--bg: var(--bext-white);
--text: var(--bext-black);
--border: #e5e7eb;
--surface: #f9fafb;
}
:root.dark {
--bg: #111827;
--text: #f3f4f6;
--border: #374151;
--surface: #1f2937;
}
Utilisez-les dans les styles de composants :
.card {
background: var(--surface);
border: 1px solid var(--border);
color: var(--text);
}
Architecture#
Le moteur CSS réside dans crates/bext-css/ et dépend de encre-css (compatible MIT, Tailwind v4). Fonctions clés :
| Fonction | But |
|---|---|
bext_css::config() |
Configuration du thème partagé (initialisée une fois via OnceLock) |
bext_css::build_site_css(path) |
Générer public/styles.css pour un site |
bext_css::build_all_sites(path) |
Construction par lots pour tous les sites d'un répertoire |
bext_css::inject_route_css(html) |
Extraire les classes du HTML, injecter <style> |
bext_css::css_for_html(html) |
Générer du CSS pour le rendu HTML (pas d'injection) |
bext_css::is_css_only_change(files) |
Classer les modifications de fichiers pour le chemin rapide de l'observateur |
bext_css::rebuild_if_changed(path) |
Reconstruction compatible Mtime (ignorer si à jour) |
bext_css::content_hash(css) |
Hachage FNV-1a pour le contournement du cache |
Compatibilité avec TypeScript Tailwind#
Les deux moteurs peuvent cohabiter. Lorsque le moteur Rust est actif, il définit BEXT_RUST_CSS=1 avant d'exécuter les scripts de build Bun. Les fonctions TypeScript buildCSS() et ensureCSS() vérifient cette variable et ignorent leur travail :
// In build.ts / serve.ts — automatically skipped
if (process.env.BEXT_RUST_CSS === "1") {
console.log("css (handled by bext-server Rust engine)");
return;
}
Pour forcer le pipeline TypeScript (par exemple, pour le débogage), supprimez la variable :
BEXT_RUST_CSS=0 bext build
En rapport#
- Indicateurs de construction et de fonctionnalités — Indicateur de fonctionnalité
route-csset profils de construction - bext.config.toml — Sources et fichiers supplémentaires
[build.css] - Cadres : vent arrière — utilisation des utilitaires Tailwind dans les itinéraires PRISM
- Architecture : Pipeline de rendu PRISM — où l'injection CSS par route se produit dans la chaîne de rendu
- Variables d'environnement —
BEXT_RUST_CSSet variables de build associées
Links#
- encre-css — le moteur Rust Tailwind v4 bext s'appuie sur