Sass, Myth .... cssnext

Publié le 26 août 2014 par Guillaume DEMESY
cssnext sass myth postprocesseur preprocesseur css

Les pré-processeurs CSS

Depuis leurs créations les pré-processeurs ont été très critiqués et le sont toujours pour diverses raisons. On peut comparer cette bataille à celle qui oppose Vanilla JS et jQuery.

Toujours est-il que ce type d'outil est très utile et simplifie grandement l'écriture, la maintenance et l'intégration de code CSS. Il va de soi qu'il est nécessaire de maîtriser un minimum la syntaxe CSS et ses bonnes pratiques.

Il y a environ de deux ans, et suite à plusieurs tweet de @_victa et @kaelig j'ai décidé d'utiliser Sass avec le framework Compass.

Pourquoi utiliser Sass et Compass ?

Les @import :

@import "layout/body.css";
@import "layout/header.css";
@import "layout/footer.css";

Sass permet de créer plusieurs fichiers et ainsi organiser de façon plus cohérente son projet.

Les préfixes :

input.css

a:hover {
    @include transition (color .2s linear)
}

output.css

a:hover {
    -webkit-transition: color .2s linear;
        -moz-transition:color .2s linear;
            -o-transition:color .2s linear;
              transition: color .2s linear;
}

Grâce à ce mixin on obtient l'ensemble de la propriété préfixée.

La compilation et la minification.

# Environnement de production : compass compile/watch sass/index.scss -e production

if environment == :production
      output_style = :compressed
      line_comments = false
      sass_options = { :debug_info => false }      

# Environnement de developpement : compass compile/watch sass/index.scss

else
    output_style = :expanded
    sass_options = { :debug_info => true }
    line_comments    = true
end

On automatise ainsi la mise en production de ses feuilles de styles CSS.

Par la suite, j'ai été amené à créer des functions et des mixins pour "faciliter", par exemple, l'intégration des media queries https://gist.github.com/magsout/5978325.

Les erreurs

L'apprentissage de nouveaux procédés de développement rime souvent avec erreurs de débutants, à savoir des sélecteurs trop long pour coller au DOM mais aussi une utilisation abusive des @extend, ou cette volonté de tout Sassifier (function et mixin inutiles).

Ma migration vers Myth

Force est de constater que même si Sass apporte beaucoup d'avantages, sa syntaxe reste très différente de celle du CSS natif.

Il y a quelques temps j'ai testé Myth utilisant l'API Rework. J'avais été très critique à sa sortie, à tort, car l'idéologie derrière cet outil est très intéressante: utiliser du CSS moderne sans se soucier de la compatibilité des navigateurs. Voici une citation qui résume à elle seule tout l’intérêt de Myth :

Some of the features in CSS require runtime calculations, 
which neither Myth nor preprocessors handle, 
but what Myth does is let you write your code today in the future syntax, 
so that your code is future-proof. 
When browsers finally support these features you won't need to rewrite anything, 
just remove Myth and start using the cascade!

Concrètement, il est tout à fait possible d'utiliser la syntaxe des variables telle que proposée par le W3C, et ce malgré la faible compatibilité des navigateurs

input.css

:root {
    --base-link-color: #000;
    --base-link-color-hover: color(var(--base-link-color) lightness(+10%));
}
a:hover {
    color : var(--base-link-color-hover);
}

output.css

a:hover {
    color: rgb(255, 51, 51);
}

Un autre exemple relativement séduisant les : Custom media queries. Aucun navigateur ne supporte cette syntaxe actuellement, mais grâce à Myth rien ne vous empêche de l'utiliser dès aujourd’hui:

input.css

@custom-media --viewport-max-s (max-width: 30em);
@custom-media --viewport-min-s (min-width: 30.01em);

@media ( --viewport-max-s) {
    .block {
        width:50%;
    }
}

output.css

@media and (max-width:30em) {
    .block {
        width:50%;
    }
}

Grâce à l'option browser qui liste la compatibilité des navigateurs que vous voulez supporter, Myth va compiler la feuille de style.

Myth embarque Autoprefixer pour la gestion automatique des préfixes. On y retrouve également les @import et une liste impressionnante de plugins facilitant l'intégration.

Un petit nouveau

Dernièrement, j'ai également suivi le développement de cssnext. Il garde la même philosophie que Myth mais en plus avancé.

Comme on peut le voir sur cette issue https://github.com/segmentio/myth/issues/100, cssnext est plus rapide puisqu'il n'utilise qu'un moteur (postcss) et non 2 comme le fait actuellement Myth. Il corrige également certaines lacunes rencontrées avec Myth dont voici quelques exemples : https://gist.github.com/MoOx/091143e99c6c87fa6d13.

Conclusion

J'ai donc débuté depuis la semaine dernière la migration de notre boilerplate basé sur Sass et Compass vers cssnext. Pour éviter de perdre trop de temps j'ai placé l'ensemble de notre micro framework dans un répertoire legacy. Ce qui me permet de ne pas avoir à modifier tout le code sous Sass et de développer le projet avec cette nouvelle technologie.

Cela étant, et comme le dirais notre ami Benjamin Parker :

Un grand pouvoir implique de grandes responsabilités.

Tous ces outils sont puissants mais ils doivent être maîtrisés car les dérives possibles peuvent aller à l'inverse de l’objectif premier.

Quelques liens

A propos de l'auteur
Guillaume DEMESY

Co-fondateur de Splitfire et Développeur front-end

Partager cet article sur les réseaux sociaux