Blog >>> Techtalk_

Elixir Phoenix & Tailwind JIT

Tailwinds Just-In-Time Compiler generiert während der lokalen Entwicklung ausschließlich die notwendigen Styles. Dies sorgt für mehr Performance und das Team ist ebenfalls happy :-).
01.09.2021
Simon Hansen
Simon Hansen
Entwickler, Gründer
Elixir Phoenix & Tailwind JIT

Die Struktur eines Projektes besteht aus unterschiedlichsten Komponenten. Da wir ständig neue Erkenntnisse sammeln, verändert sich die Projektstruktur im Laufe der Zeit. Dies können kleinere Änderungen sein, die beispielsweise die DX (Developer Experience) optimieren, manchmal sind es aber auch größere Anpassungen.

Einer unserer aktuellen “Technologie-Stacks” ist der sogenannte PETAL-Stack und besteht aus folgenden Komponenten:

  • Phoenix
  • Elixir
  • Tailwind CSS
  • Alpine.js
  • LiveView

Die neuste Änderung an diesem Stack ist der Tailwind JIT (Just-In-Time) Compiler.

Tailwind JIT

Wie haben wir Tailwind CSS bisher verwendet?

In einer tailwind.config.js können Anpassungen vorgenommen werden, die von der Standard-Konfiguration abweichen. Hier ist ein Ausschnitt aus der tailwind.config.js von unserer Website sourceboat.com zu sehen:

// tailwind.config.js

module.exports = {
  darkMode: false,
  theme: {
    colors: {
      black: '#000000',
      white: '#ffffff',
      graphite: '#2d2e32',
      icegrey: '#f8f8f8',
      concrete: '#b8bcbf',
      azure: '#055fdc',
      blueeye: '#7684aa',
      brick: '#e15639',
      lavender: '#dcd7f5',
      sun: '#ffc300',
      sky: '#d7f0ff'
    },
    fontFamily: {
      'sans': ['IBM Plex Sans', 'Helvetica Neue', 'Arial', 'sans-serif'],
      'serif': ['IBM Plex Serif', 'Georgia', 'Times', 'serif'],
      'mono': ['IBM Plex Mono', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier', 'monospace']
    }
  }
}

Diese Konfiguration wird während der Entwicklung dazu benutzt, eine CSS-Datei im Voraus zu erzeugen. Je nach Konfiguration kann diese CSS-Datei sehr groß werden, weil alle möglichen Style-Kombinationen enthalten sind. Sehr “teure” Optionen in Bezug auf die Dateigröße sind u.A. weitere Breakpoints oder der Dark-Mode. Die Aktivierung des Dark-Modes sorgt beispielsweise dafür, dass es Styles nicht nur in einer, sondern in einer Dark- und Light-Variante gibt.

Eine CSS-Datei kann so schnell eine Größe von 10-20 MB erreichen und sorgt für die folgenden Probleme:

  • Browser kommen an ihre Grenzen.
  • Die Website kann nicht mehr dargestellt werden.
  • Developer-Tools der Browser laufen nicht mehr flüssig.
  • Es dauert lange, die CSS-Dateien zu erstellen.

Dies ist übrigens nur ein Problem während der Entwicklung. In den Produktiv-Umgebungen werden alle nicht benötigten Styles mit PurgeCSS entfernt, um die CSS-Datei klein zu halten.

Die Lösung all unserer Probleme

Seit Tailwind CSS 2.1 gibt es einen JIT Compiler, der nicht mehr alle gegebenenfalls benötigten Styles im Voraus erzeugt – sobald sich etwas am Quellcode ändert, werden ausschließlich die benötigten Styles erzeugt.

Um den JIT Compiler verwenden zu können muss es einen Prozess geben, der auf diese Dateiänderungen reagiert. Bei Elixir Phoenix können für genau diesen Zweck in der Entwicklungsumgebung watchers konfiguriert werden:

# config/dev.exs

config :sourceboat, SourceboatWeb.Endpoint,
  watchers: [
    yarn: ["watch", cd: Path.expand("../assets", __DIR__)]
  ]

Bei Änderungen wird also yarn watch ausgeführt. Dies ist ein in der package.json definiertes Script:

{
  "scripts": {
-    "dev": "mix",
+    "dev": "TAILWIND_MODE=build NODE_ENV=development mix",
-    "watch": "mix watch",
+    "watch": "TAILWIND_MODE=watch NODE_ENV=development mix watch",
-    "prod": "mix --production"
+    "prod": "TAILWIND_MODE=build NODE_ENV=production mix --production"
  }
}

Die Variablen TAILWIND_MODE und NODE_ENV werden nur für den JIT Mode benötigt.

Zu guter Letzt muss nur noch der JIT Mode in der tailwind.config.js aktiviert werden:

// tailwind.config.js

module.exports = {
+  mode: 'jit',
  darkMode: false,
  theme: {
    colors: {
      black: '#000000',
      white: '#ffffff',
      graphite: '#2d2e32',
      icegrey: '#f8f8f8',
      concrete: '#b8bcbf',
      azure: '#055fdc',
      blueeye: '#7684aa',
      brick: '#e15639',
      lavender: '#dcd7f5',
      sun: '#ffc300',
      sky: '#d7f0ff'
    },
      ,
    fontFamily: {
      'sans': ['IBM Plex Sans', 'Helvetica Neue', 'Arial', 'sans-serif'],
      'serif': ['IBM Plex Serif', 'Georgia', 'Times', 'serif'],
      'mono': ['IBM Plex Mono', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier', 'monospace']
    }
  }
}

Durch die Verwendung des JIT Compilers haben wir die Größe der CSS-Datei unserer eigenen Website von 1.9 MB auf 19.6 KB reduziert (natürlich nur während der Entwicklung). :-) Wir sind überzeugt von Tailwinds JIT-Feature und werden es in bestehende sowie neue Projekte einführen.

Teilen @