ENbext.dev
DocumentationConfiguration

Traduction automatique depuis l’anglais. Consulter l’original.

Sur cette page

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
Conseil

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 :

bash
bext version
# Look for "route-css" in the feature flags

Pour le désactiver explicitement :

bash
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 :

code
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>.

html
<!-- 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 __fetch renvoie 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 :

  1. Saute complètement le chignon
  2. Appelle bext_css::build_site_css() dans Rust (~ 1 ms)
  3. Efface le cache de réponse ISR
  4. Envoie HMR css-update aux 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#

bash
bext css sites/cloud

Construire du CSS pour tous les sites#

bash
bext css sites/ --all

Sortir:

code
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 :

bash
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 :

bash
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 :

tsx
<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 :

tsx
<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 :

css
: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 :

css
.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 :

typescript
// 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 :

bash
BEXT_RUST_CSS=0 bext build

En rapport#

  • encre-css — le moteur Rust Tailwind v4 bext s'appuie sur
Modifier cette page ↗Besoin d’aide ? ↗
Rechercher dans la documentation

Saisissez un sujet, une commande ou une question.