Diminuer le poids de l’interface d’un client mail via CSS / SVG

Nicolas Hoffmann / @Nico3333fr
We Love Speed 2019
ProtonMail

CSS ?

  • Votre chemin passera forcément par CSS…
  • CSS sera le chemin critique

Et pourtant…

C’est LOURD

Le cercle infernal de CSS

  1. On écrit de la CSS…
  2. … mal, qui ne scale pas.
  3. Il faut en écrire toujours plus… encore et encore…
  4. Goto 1

Ce n’est pas nouveau

Disclaimer !

I ♥ performance :)

I ♥ surtout la penser en amont.

Objectifs

Réduire le poids de manière drastique !

Et réduire aussi le nombre de requêtes.

Chez ProtonMail 🥰

Sur la v3… 😧

600ko de CSS 😨. Minifiés. 😱

110ko gzippés. 😥

Et impossibles à manœuvrer. 😫

C’est beaucoup trop !

Porte qui se ferme

Disclaimer

  • C’est un WIP ¯\_(ツ)_/¯
  • Changement global à plusieurs niveaux
  • Certains points ne sont pertinents à partir d’une certaine échelle

Historique et contexte

Penchons-nous sur les CSS de v3…

alt="Association de malfaiteurs tueurs de performances"

Sass Nesting inferno

Et ses copains ☢️☢️☢️

#pm_composer { /* ! */
  .composer { /* !! */
    h1 { … }
    .flex { … } /* !!!!! */
    .attachmentBar { /* ALERT: inception level 4 */
      i {
        &.embedded { … }
      }
      .previews {
        .preview-close { … }
        .attachment {
          .fa {
            &.embedded {
            /* kill me. Now. */

Méthode RY

RY = Repeat Yourself
Box-sizing en PR
Beaucoup de suppressions

D’autres «copains»

  • 1:1 → 1 contenu = 1 style
  • Mixins utilisés à répétition
  • Etc.

Bref

ça croit trop viiiiiiiiiiiiiiiiiiiite

Penchons-nous sur v4

V4 ProtonMail

Comment faire ?

alt="méthodologiser/ranger/organiser/structurer/réutiliser"

Quelques principes

  • Décorréler la structure des styles
  • Séparer le positionnement d’un composant de son design
  • Un comportement revient ? 1 classe atomique.
  • Cibler efficacement
  • Distinguer les priorités de vos assets

Un exemple

Affichage des emails

Cibler global et spécifique


[class*="badgeLabel"] {
  // global
}
.badgeLabel-success {
  // spécifique
}

Bref

ça doit croitre leeeeeeeeeenteemeeeeeeeeeeeent

Bonus stage : SVG

Les requêtes les plus performantes… sont celles que l’on ne fait pas - Moi (mais pas que)

Des icônes, partout !

V4 ProtonMail

Sur v3… c’est le bazar

Font-icons/SVG/images/formats/viewboxes

Sur v4 : SVG, le seul et l’unique

Sprites SVG inline

<defs>
  <g id="shape-account">
    <path d="…"/>
  </g>
  <g id="shape-add">
    <path d="…"/>
  </g>
  …

Sprites SVG inline

<svg viewBox="0 0 16 16" role="img" aria-hidden="true" focusable="false">
  <use xlink:href="#shape-account"></use>
</svg>

Sprites SVG

<symbol id="symbol-caret"><path d="…" /></symbol>
<use id="css-caret" xlink:href="#symbol-caret" 
  class="black" />
<use id="css-greater" xlink:href="#symbol-caret"
  class="black rotated-right" />
						
background-image: url(sprite-css.svg#css-caret)

SVG, c’est le pied

  • Retina-ready/scalable/skinable
  • Moins de requêtes
  • Léger (25ko/gzippé pour ~160 icônes)
  • Une fois chargé, affichage instantané

Des métriques (v3)

541ko, 98ko gzippé

Des métriques (sur v4)

114ko, 20ko gzippé

D’autres indicateurs

Poids global divisé par 2 (1st load)

D’autres indicateurs

Sensation de vitesse accrue

À retenir

  • CSS n’est PAS un asset comme les autres
  • Soignez vos CSS dès la conception
  • Travaillez au long court
  • N’oubliez pas de vérifier le code généré
  • Intervenez en amont !

Ressources

Merci

Des questions ?

https://www.nicolas-hoffmann.net/CSS-WLS2019

ProtonMail