📚 Cours SCSS (Sass) 📍 Chapitre 18 / 21

Bonnes pratiques et performances

Écrire du SCSS "qui fonctionne" est une chose. Écrire du SCSS maintenable et produire un CSS performant en est une autre. Dans ce chapitre, on se concentre sur les réflexes professionnels : éviter les pièges courants (spécificité, nesting abusif, duplication), garder un code lisible, et livrer un CSS final raisonnable en taille et en complexité.

Objectifs du chapitre

  • Adopter des conventions SCSS cohérentes (lisibilité, organisation).
  • Limiter la spécificité et éviter les sélecteurs fragiles.
  • Éviter le nesting excessif et les effets de bord.
  • Maîtriser l'impact des mixins, boucles et @extend sur le CSS final.
  • Mettre en place un "design token system" efficace.
À retenir

Les performances ne se gagnent pas avec une astuce magique : elles se gagnent avec de la discipline (moins de CSS généré, moins de complexité, moins de surprises).

Explications théoriques détaillées

Le SCSS doit rester lisible, pas "impressionnant"

Il est tentant d'utiliser toutes les fonctionnalités (boucles, maps imbriquées, conditions partout). Mais un SCSS trop "intelligent" peut devenir illisible.

Conseil terrain

Si un collègue met plus de 30 secondes à comprendre une règle, elle est probablement trop complexe.

Performance côté navigateur : ce qui compte vraiment

  • Taille du CSS : plus c'est gros, plus c'est long à télécharger et parser.
  • Complexité des sélecteurs : des sélecteurs trop profonds peuvent ralentir.
  • Spécificité : plus elle est élevée, plus tu vas créer des overrides (donc du CSS en plus).
À retenir

Les "gros problèmes" viennent souvent d'un CSS qui grossit sans contrôle, pas d'un détail micro-optimisé.

Performance côté SCSS : ce qui gonfle le CSS

  • Mixins incluses partout : duplication de règles.
  • Boucles trop larges : génération massive de classes.
  • Nesting abusif : multiplication de sélecteurs complexes.
  • @extend mal utilisé : sélecteurs fusionnés énormes.

Exemples simples

Nesting : bon usage vs abus

Un nesting léger est lisible. Un nesting profond est fragile.

Bon usage :

SCSS
/* ✅ Bon : nesting peu profond, lié au composant */
.card {
  padding: 16px;

  .card__title {
    font-weight: 800;
  }

  &:hover {
    transform: translateY(-1px);
  }
}

Mauvais usage :

SCSS
/* ❌ Mauvais : nesting trop profond, couplé au HTML */
.page {
  .layout {
    .content {
      .article {
        .title {
          color: red;
        }
      }
    }
  }
}
À retenir

Plus ton nesting est profond, plus tu "cimentes" ton CSS à une structure HTML précise. Le jour où le HTML change, tout casse.

Spécificité : éviter les surcharges inutiles

Si tu écris des sélecteurs trop spécifiques, tu finiras par faire des overrides encore plus spécifiques.

Exemple à éviter :

SCSS
/* ❌ Trop spécifique */
header nav ul li a {
  color: white;
}

/* ✅ Plus simple, plus maintenable */
.nav__link {
  color: white;
}

Exemples concrets et professionnels

Cas pro 1 : maîtriser les mixins (éviter la duplication)

Les mixins sont utiles, mais si elles injectent beaucoup de règles, elles peuvent gonfler ton CSS.

SCSS
/* Mixin "lourde" (beaucoup de styles) */
@mixin card-heavy {
  padding: 16px;
  border-radius: 12px;
  background: rgba(255,255,255,.08);
  box-shadow: 0 10px 30px rgba(0,0,0,.15);
  transition: transform .2s ease, box-shadow .2s ease;

  &:hover {
    transform: translateY(-2px);
    box-shadow: 0 12px 40px rgba(0,0,0,.2);
  }
}

/* ⚠️ Inclure partout peut dupliquer énormément de CSS */
.card-a { @include card-heavy; }
.card-b { @include card-heavy; }
.card-c { @include card-heavy; }
Approche recommandée

Si tu as un "style de base" identique, utilise plutôt un placeholder + @extend (ou un composant unique) pour mutualiser, et garde les mixins pour les variantes paramétrables.

Cas pro 2 : boucles et utilitaires (contrôler la taille)

Générer des utilitaires est pratique, mais il faut limiter le scope.

SCSS
$space-unit: 8px;
$levels: 0, 1, 2, 3, 4, 5; // ✅ bornes raisonnables

@each $i in $levels {
  .m-#{$i} { margin: $space-unit * $i; }
  .p-#{$i} { padding: $space-unit * $i; }
}

Si tu passes à 0..50, tu crées des dizaines (voire centaines) de classes inutiles.

Cas pro 3 : tokens (maps) pour éviter les valeurs "magiques"

Les tokens améliorent la cohérence et réduisent la duplication.

SCSS
$tokens: (
  radius: (
    sm: 6px,
    md: 12px,
    lg: 20px
  ),
  space: (
    1: 8px,
    2: 16px,
    3: 24px
  )
);

@function token($group, $key) {
  @return map-get(map-get($tokens, $group), $key);
}

.card {
  border-radius: token(radius, md);
  padding: token(space, 2);
}
Conseil terrain

Les tokens sont aussi une "documentation vivante" : ils montrent comment le design est censé fonctionner.

Cas pro 4 : éviter @extend sur des sélecteurs complexes

Comme vu au chapitre 13, @extend peut produire des sélecteurs énormes. La bonne pratique est d'étendre des placeholders simples.

SCSS
%btn-base {
  padding: 10px 16px;
  border-radius: 12px;
  font-weight: 700;
}

.btn {
  @extend %btn-base;
}

.btn--primary {
  @extend %btn-base;
  background: #7aa7ff;
  color: white;
}

Bonnes pratiques

  • Limiter le nesting à 2-3 niveaux maximum (en général).
  • Préférer des classes (BEM ou autre convention) à des sélecteurs très longs.
  • Centraliser les valeurs (tokens) au lieu de disperser des "magic numbers".
  • Contrôler les boucles : générer uniquement le nécessaire.
  • Garder les mixins paramétrables et raisonnablement petites.
  • Relire le CSS généré régulièrement (surtout après refactor).
À retenir

Le SCSS est un outil. La vraie qualité se voit dans le CSS final : taille, lisibilité, cohérence.

Erreurs courantes

Erreur 1 : nesting profond "par confort"

Tu as l'impression d'être "bien organisé" parce que tout est imbriqué, mais tu crées des sélecteurs fragiles et difficiles à surcharger proprement.

Erreur 2 : duplication via mixins

Les mixins sont parfois utilisées comme un copier-coller élégant. Si tu inclues un gros bloc partout, tu gonfles ton CSS.

Erreur 3 : système d'utilitaires illimité

Un "mini Tailwind maison" mal contrôlé peut exploser la taille du CSS. Il faut des limites et une vraie raison.

Erreur 4 : ignorer la spécificité

Plus tu augmentes la spécificité, plus tu augmentes la dette CSS (overrides, exceptions).

Résumé du chapitre

Ce que vous avez appris
Un SCSS pro est lisible, cohérent et pensé pour durer.
Les performances viennent d'un CSS final maîtrisé (taille, complexité, spécificité).
Nesting, mixins, boucles et @extend doivent être utilisés avec discipline.
Les tokens (maps) réduisent la duplication et augmentent la cohérence.

Prochain chapitre : Compilation, minification et sourcemaps

Dans le prochain chapitre, nous verrons la compilation, minification et les sourcemaps : comment passer de SCSS à CSS dans un workflow propre (dev vs prod), et comprendre le lien entre SCSS et CSS en debug.

  • Configuration des environnements dev vs prod
  • Minification et compression du CSS
  • Utilisation des sourcemaps pour le débogage
  • Workflows de compilation automatisés