Sollte ich Source Maps in der Produktion verwenden?

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Das ist eine berechtigte Frage. Eine „Source Map“ ist eine spezielle Datei, die eine minimierte/entstellte Version eines Assets (CSS oder JavaScript) mit der ursprünglichen Autorenversion verbindet. Nehmen wir an, Sie haben eine Datei namens _header.scss, die in global.scss importiert wird, welches zu global.css kompiliert wird. Diese endgültige CSS-Datei wird im Browser geladen. Wenn Sie beispielsweise ein Element in den Entwicklertools inspizieren, wird Ihnen möglicherweise mitgeteilt, dass die <nav> display: flex; ist, weil es in Zeile 387 in global.css so steht.

In Zeile 528 von page.css können wir feststellen, dass .meta position: relative; hat.

Da diese endgültige CSS-Datei jedoch wahrscheinlich minimiert ist (alle Leerzeichen entfernt), wird uns in den Entwicklertools wahrscheinlich mitgeteilt, dass wir die gesuchte Deklaration in Zeile 1 finden! Unglücklich und nicht hilfreich für die Entwicklung.

Hier kommen Source Maps ins Spiel. Wie ich eingangs sagte, sind Source Maps spezielle Dateien, die die endgültige Ausgabedatei, die der _Browser_ tatsächlich verwendet, mit den Autoren-Dateien verbinden, mit denen _Sie_ tatsächlich arbeiten und Code in Ihrem Dateisystem schreiben.

Normalerweise sind Source Maps eine Konfigurationsoption des Präprozessors. Hier sind die Optionen von Babel. Ich glaube, dass Sie bei Sass nicht einmal ein Flag dafür in der Befehlszeile oder so übergeben müssen, da es standardmäßig Source Maps erzeugt.

Diese Source Maps sind also _für Entwickler_. Sie sind besonders nützlich für Sie und Ihr Team, da sie enorm bei der Fehlersuche und bei der täglichen Arbeit helfen. Ich benutze sie wahrscheinlich fast täglich. Ich würde sagen, _im Allgemeinen_ werden sie für die lokale Entwicklung verwendet. Sie könnten sie sogar mit .gitignore versehen oder sie im Bereitstellungsprozess überspringen, um weniger Assets in der Produktion zu liefern und zu speichern. Aber es gab kürzlich einige Diskussionen darüber, ob sie nicht auch in die Produktion gehen sollten.

David Heinemeier Hansson:

Aber Source Maps wurden lange Zeit nur als Werkzeug für die lokale Entwicklung angesehen. Nichts, was man in die Produktion schickt, obwohl die Leute das auch getan haben, damit das Live-Debugging einfacher ist. Das allein ist schon ein guter Grund, Source Maps zu versenden. [...]

Zusätzlich hat Rails 6 gerade zugestimmt, Source Maps standardmäßig in der Produktion zu versenden, ebenfalls dank Webpack. Sie können diese Funktion deaktivieren, aber ich hoffe, das tun Sie nicht. Das Web ist ein besserer Ort, wenn wir anderen erlauben, aus unserer Arbeit zu lernen.

Sehen Sie sich diesen Issue-Thread an, um weitere interessante Gespräche über das Versenden von Source Maps in die Produktion zu finden. Die Vorteile lassen sich auf diese beiden Punkte reduzieren:

  1. Sie können Ihnen helfen, Bugs in der Produktion leichter zu finden.
  2. Sie helfen anderen Leuten, leichter aus Ihrer Website zu lernen.

Beides ist gut. Persönlich wäre ich dagegen, performanceoptimierten Code allein zu Lernzwecken zu versenden. Darüber habe ich letztes Jahr geschrieben.

Ich möchte meinen Quellcode nicht menschenlesbar haben, nicht aus Schutzgründen, sondern weil mir die Web-Performance wichtiger ist. Ich möchte, dass meine Website mit Lichtgeschwindigkeit auf einem winzigen Staubkorn eines magischen Netzwerkpakets ankommt und sich zu einer vollständigen Website entfaltet. Oder was auch immer die Informatik als den absolut schnellsten Weg ansieht, Websitedaten zwischen Computern zu senden. Ich mache mir mehr Sorgen um den Zustand der Web-Performance als um die Web-Bildung. Aber selbst wenn ich mir große Sorgen um die Web-Bildung machen würde, glaube ich nicht, dass es die Aufgabe des Netzwerks ist, Lehrbarkeit zu liefern.

Das Versenden von Source Maps in die Produktion ist ein guter Mittelweg. Es gibt keine Auswirkungen auf die Performance (Source Maps werden nur geladen, wenn Sie die Entwicklertools geöffnet haben, was meiner Meinung nach für eine echte Performance-Diskussion irrelevant ist) mit dem Vorteil, Debugging- und Lernvorteile zu bieten.

Die Nachteile, die in der jüngsten Diskussion angesprochen wurden, lassen sich auf Folgendes reduzieren:

  1. Sourcemaps erfordern Kompilierungszeit.
  2. Es erlaubt Leuten, ich weiß nicht, Ihren Code zu stehlen oder so etwas.

Auf #2 lege ich keinen Wert (tut mir leid), und #1 scheint für eine kleine oder das, was wir als durchschnittliche Website betrachten, im Allgemeinen vernachlässigbar zu sein, obwohl ich befürchte, dass ich für Mega-Websites keine Aussage treffen kann.

Eine Sache, die ich noch hinzufügen sollte, ist, dass Source Maps sogar für CSS-in-JS-Tooling generiert werden können. Für diejenigen, die Stile buchstäblich in das DOM für Sie einfügen, werden diese Source Maps auch eingefügt. Ich habe in diesen Situationen _deutliche Verlangsamungen_ gesehen, daher würde ich sagen, dass Sie Source Maps definitiv _nicht_ in die Produktion versenden sollten, wenn Sie sie nicht aus Ihren Haupt-Bundles auslagern können. Andernfalls würde ich stark dafür stimmen, dass Sie es tun.