ADR-001: Eigener E-Mail-Renderer statt MJML
Warum Owlat einen eigenen tabellenbasierten HTML-E-Mail-Renderer gebaut hat, statt MJML zu verwenden, und damit volle Kontrolle über VML, Dark Mode und clientspezifisches Rendering gewinnt.
- Status: Angenommen
- Datum: 2024-06-15
Kontext
Owlat muss eine JSON-Blockstruktur in responsive HTML-E-Mails überführen, die in allen großen E-Mail-Clients (Gmail, Outlook, Apple Mail, Yahoo) korrekt dargestellt werden. MJML ist der Industriestandard dafür und stellt eine Auszeichnungssprache bereit, die zu E-Mail-sicherem HTML kompiliert.
MJML hat für unseren Anwendungsfall allerdings Grenzen:
- Keine feingranulare Kontrolle — MJML abstrahiert das zugrunde liegende tabellenbasierte HTML weg und erschwert damit fortgeschrittene Funktionen wie VML-Hintergründe, bedingte Inhalte oder clientspezifisches Rendering.
- Bundle-Größe — MJML ist eine große Abhängigkeit (~2 MB), die das Serverless-Backend aufblähen würde.
- Nicht passendes Blockmodell — Unser Editor verwendet ein JSON-Blockmodell (ähnlich Notion/Editor.js). Blöcke in MJML-Markup zu konvertieren, nur damit MJML daraus HTML macht, fügt eine unnötige Übersetzungsschicht hinzu.
- Erweiterbarkeit — Eigene Blocktypen in MJML zu ergänzen erfordert MJML-Komponenten, die dessen interner API entsprechen; diese ist schlecht dokumentiert und eng an die Rendering-Pipeline gekoppelt.
Entscheidung
Einen eigenen tabellenbasierten HTML-E-Mail-Renderer (@owlat/email-renderer) bauen, der unser JSON-Blockformat direkt in E-Mail-sicheres HTML überführt.
Konsequenzen
Ermöglicht:
- Direkte Kontrolle über jedes HTML-Attribut und damit VML-Unterstützung für Outlook (bulletproof Buttons, Hintergrundbilder, Verläufe)
- Render-Simulation pro Client (Option
targetClient) für treffsichere Vorschauen - Eigene Block-Registry für Blocktypen von Drittanbietern
- CSS-Inlining mit selektiven Annotationen (
@inline/@head-only) - Dark-Mode-Unterstützung mit Overrides pro Block
- AMP-E-Mail-Ausgabe als erstklassiges Format
- Analyse der E-Mail-Größe und Kompatibilitäts-Scoring
- Kleineres Bundle — der Renderer wiegt ~50 KB gegenüber MJMLs ~2 MB
Trade-offs:
- Wir tragen die volle Komplexität der Eigenheiten von E-Mail-Clients (Outlook-Conditional-Comments, CSS-Stripping in Gmail, Abstandsfehler bei Yahoo)
- Neue Teammitglieder können sich nicht auf die MJML-Dokumentation stützen — sie müssen die API unseres Renderers lernen
- Wir müssen eigene Kompatibilitätsdaten pflegen, statt uns auf die erprobte Ausgabe von MJML zu verlassen