Erklären Sie mir die ersten 10 Zeilen des Twitter-Quellcodes

Avatar of Anand Chowdhary
Anand Chowdhary am

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

Seit ein paar Wochen stelle ich für mein Möbelvermietungsunternehmen, Pabio, einen erfahrenen Full-Stack JavaScript-Entwickler ein. Da wir ein Remote-Team sind, führen wir unsere Vorstellungsgespräche über Zoom durch, und ich habe beobachtet, dass einige Entwickler bei Live-Coding- oder Whiteboard-Interviews nicht besonders gut sind, auch wenn sie gut in ihrem Job sind. Stattdessen führen wir eine einstündige technische Diskussion, bei der ich ihnen Fragen zu Web Vitals, Barrierefreiheit, dem Browserkrieg und ähnlichen Themen rund um das Web stelle. Eine der Fragen, die ich immer gerne stelle, lautet: „Erklären Sie mir die ersten zehn Zeilen des Twitter-Quellcodes.“

Ich denke, es ist ein einfacher Test, der mir viel über die Tiefe der grundlegenden Front-End-Kenntnisse verrät, die sie haben, und dieser Artikel listet die besten Antworten auf.

Zur Veranschaulichung teile ich meinen Bildschirm, öffne Twitter.com und klicke auf Quelltext anzeigen. Dann bitte ich sie, Zeile für Zeile zu gehen, um mir das HTML zu erklären, und sie können so viel oder so wenig sagen, wie sie möchten. Ich vergrößere auch, um den Text leserlicher zu machen, sodass Sie nicht die gesamte Zeile sehen, aber eine Vorstellung bekommen. So sieht es aus

Screenshot of source code from Twitter.

Beachten Sie, dass unsere technische Diskussion ein Gespräch ist. Ich erwarte von niemandem eine perfekte Antwort. Wenn ich einige richtige Schlüsselwörter höre, weiß ich, dass der Kandidat das Konzept kennt, und ich versuche, ihn in die richtige Richtung zu lenken.

Zeile 1: <!DOCTYPE html>

Die erste Zeile des Quellcodes jedes Dokuments ist perfekt für dieses Vorstellungsgespräch, da sie stark davon abhängt, wie viel ein Kandidat über die DOCTYPE-Deklaration weiß, wie viele Jahre Erfahrung er hat. Ich erinnere mich noch gut an meine Dreamweaver-Zeiten mit der langen XHTML DOCTYPE-Zeile, wie Chris in seinem Artikel „The Common DOCTYPES“ aus dem Jahr 2009 aufgeführt hat.

Perfekte Antwort: Dies ist die Deklaration des Dokumententyps (doc-type), die wir immer als erste Zeile in HTML-Dateien einfügen. Man könnte denken, dass diese Information redundant ist, da der Browser bereits weiß, dass der MIME-Typ der Antwort text/html ist; aber in der Netscape/Internet Explorer-Ära hatten Browser die schwierige Aufgabe, herauszufinden, welchen HTML-Standard sie verwenden sollten, um die Seite aus mehreren konkurrierenden Versionen darzustellen.

Dies war besonders ärgerlich, da jeder Standard ein anderes Layout erzeugte, sodass dieser Tag eingeführt wurde, um es den Browsern zu erleichtern. Zuvor waren DOCTYPE-Tags lang und enthielten sogar den Spezifikationslink (ähnlich wie SVGs heute), aber glücklicherweise wurde das einfache <!doctype html> in HTML5 standardisiert und lebt bis heute fort.

Auch akzeptiert: Dies ist der DOCTYPE-Tag, der dem Browser mitteilt, dass es sich um eine HTML5-Seite handelt und diese entsprechend gerendert werden soll.

Zeile 2: <html dir="ltr" lang="en">

Diese Zeile im Quellcode verrät mir, ob der Kandidat etwas über Barrierefreiheit und Lokalisierung weiß. Überraschenderweise wussten in meinen Vorstellungsgesprächen nur wenige Leute etwas über das dir-Attribut, aber es ist ein guter Einstieg in eine Diskussion über Screenreader. Fast jeder konnte das lang="en"-Attribut erklären, auch wenn er es vorher noch nicht benutzt hatte.

Perfekte Antwort: Dies ist das Wurzelelement eines HTML-Dokuments, und alle anderen Elemente sind darin enthalten. Hier hat es zwei Attribute: Richtung und Sprache. Das Richtungsattribut hat den Wert links nach rechts, um Benutzeragenten mitzuteilen, in welcher Richtung der Inhalt ist; andere Werte sind rechts nach links für Sprachen wie Arabisch oder einfach auto, was es dem Browser überlässt, dies herauszufinden.

Das Sprachattribut sagt uns, dass der gesamte Inhalt innerhalb dieses Tags auf Englisch ist; Sie können diesen Wert auf jeden Sprach-Tag setzen, sogar um en-us und en-gb zu unterscheiden, zum Beispiel. Dies ist auch nützlich für Screenreader, um zu wissen, in welcher Sprache sie vorlesen sollen.

Zeile 3: <meta charset="utf-8">

Perfekte Antwort: Das Meta-Tag im Quellcode dient zur Bereitstellung von Metadaten über dieses Dokument. Das Zeichencodierungsattribut (char-set) teilt dem Browser mit, welche Zeichencodierung verwendet werden soll, und Twitter verwendet die Standard-UTF-8-Codierung. UTF-8 ist großartig, da es viele Zeichenpunkte hat, sodass Sie alle möglichen Symbole und Emojis in Ihrem Quellcode verwenden können. Es ist wichtig, dieses Tag früh im Code zu platzieren, damit der Browser nicht bereits zu viel Text geparst hat, wenn er auf diese Zeile stößt; ich glaube, die Regel ist, es in das erste Kilobyte des Dokuments zu stellen, aber ich würde sagen, die beste Praxis ist, es ganz oben im <head> zu platzieren.

Nebenbei bemerkt: Twitter lässt das <head>-Tag aus Performance-Gründen (weniger Code zu laden) weg, aber ich mag es trotzdem explizit zu machen, da es ein klarer Ort für alle Metadaten, Stile usw. ist.

Zeile 4: <meta name="viewport" content="width=device-...

Perfekte Antwort: Dieses Meta-Tag im Quellcode dient dazu, die Webseite auf kleinen Bildschirmen, wie z. B. Smartphones, richtig zu dimensionieren. Wenn Sie sich an die ursprüngliche Keynote des iPhones erinnern, zeigte Steve Jobs die gesamte New York Times-Website auf diesem winzigen 4,5-Zoll-Bildschirm; damals war es eine erstaunliche Funktion, dass man zoomen musste, um tatsächlich lesen zu können.

Da Websites jetzt von Natur aus responsiv sind, weist width=device-width den Browser an, 100 % der Gerätebreite als Viewport zu verwenden, sodass keine horizontale Scrollung entsteht. Sie können jedoch auch spezifische Pixelwerte für die Breite angeben. Die standardmäßige Best Practice ist, die anfängliche Skalierung auf 1 und die Breite auf device-width zu setzen, damit die Leute trotzdem zoomen können, wenn sie möchten.

Der Screenshot des Quellcodes zeigt diese Werte nicht, aber es ist gut zu wissen: Twitter wendet auch user-scalable=0 an, was, wie der Name schon sagt, die Zoom-Möglichkeit deaktiviert. Das ist nicht gut für die Barrierefreiheit, aber es lässt die Webseite mehr wie eine native App wirken. Es setzt auch maximum-scale=1 aus demselben Grund (Sie können minimale und maximale Skalierung verwenden, um die Zoom-Fähigkeit zwischen diesen Werten einzuschränken). Im Allgemeinen reichen die volle Breite und die anfängliche Skalierung aus.

Zeile 5: <meta property="og:site_name" content="Twitt...

Etwa 50 % aller Kandidaten kannten Open-Graph-Tags, und eine gute Antwort auf diese Frage zeigt, dass sie etwas über SEO wissen.

Perfekte Antwort: Dieses Tag ist ein Open-Graph (OG) Meta-Tag für den Seitennamen, Twitter. Das Open Graph-Protokoll wurde von Facebook entwickelt, um das Entfalten von Links zu erleichtern und deren Vorschauen in einem schönen Kartenlayout anzuzeigen; Entwickler können alle Arten von Autoreninformationen und Titelbildern für die schicke Freigabe hinzufügen. Tatsächlich ist es heutzutage sogar üblich, das Open-Graph-Bild mit etwas wie Puppeteer automatisch zu generieren. (CSS-Tricks verwendet ein WordPress-Plugin, das dies tut.)

Eine weitere interessante Nebenbemerkung ist, dass Meta-Tags normalerweise das name-Attribut haben, aber OG verwendet das nicht standardmäßige property-Attribut. Ich nehme an, das ist einfach Facebook, das Facebook ist? Die Titel-, URL- und Beschreibung-Open-Graph-Tags sind irgendwie redundant, da wir bereits reguläre Meta-Tags dafür haben, aber die Leute fügen sie zur Sicherheit hinzu. Die meisten Websites verwenden heutzutage eine Kombination aus Open Graph und anderen Metatags sowie den Inhalt einer Seite, um Rich-Previews zu generieren.

Zeile 6: <meta name="apple-mobile-web-app-title" cont...

Die meisten Kandidaten kannten das nicht, aber erfahrene Entwickler können darüber sprechen, wie man eine Website für Apple-Geräte optimiert, wie apple-touch-icons und Safari-Pinned-Tab-SVGs.

Perfekte Antwort: Sie können eine Website auf dem Homescreen eines iPhones anpinnen, um sie wie eine native App wirken zu lassen. Safari unterstützt keine Progressive Web Apps und Sie können unter iOS keine anderen Browser-Engines verwenden. Daher haben Sie keine anderen Optionen, wenn Sie dieses native Erlebnis wünschen, das Twitter natürlich mag. Deshalb fügen sie dies hinzu, um Safari mitzuteilen, dass der Titel dieser App Twitter ist. Die nächste Zeile ist ähnlich und steuert, wie die Statusleiste aussehen soll, wenn die App gestartet wurde.

Zeile 8: <meta name="theme-color" content="#ffffff"...

Perfekte Antwort: Dies ist das ordnungsgemäße web-standards-ähnliche Äquivalent des Apple-Statusleistenfarb-Meta-Tags. Es weist den Browser an, die umliegende Benutzeroberfläche zu thematisieren. Chrome unter Android und Brave unter Desktop machen beide einen ziemlich guten Job damit. Sie können jede CSS-Farbe im Inhalt angeben und sogar das media-Attribut verwenden, um diese Farbe nur für eine bestimmte Medienabfrage anzuzeigen, zum Beispiel zur Unterstützung eines dunklen Themas. Sie können dies und zusätzliche Eigenschaften auch in der Web-App-Manifestdatei definieren.

Zeile 9: <meta http-equiv="origin-trial" content="...

Niemand, den ich interviewt habe, kannte das. Ich nehme an, man kennt das nur, wenn man tiefgreifende Kenntnisse über alle neuen Dinge hat, die auf dem Standardisierungsweg geschehen.

Perfekte Antwort: Origin Trials ermöglichen es uns, neue und experimentelle Funktionen auf unserer Website zu nutzen, und das Feedback wird vom User Agent verfolgt und der Web-Standards-Community gemeldet, ohne dass sich Benutzer für ein Feature-Flag entscheiden müssen. Zum Beispiel hat Edge eine Origin Trial für Dual-Screen- und faltbare Geräte-Primitive, was ziemlich cool ist, da Sie interessante Layouts erstellen können, je nachdem, ob ein faltbares Telefon geöffnet oder geschlossen ist.

Auch akzeptiert: Das weiß ich nicht.

Zeile 10: html{-ms-text-size-adjust:100%;-webkit-text...

Fast niemand kannte das auch; nur wenn man sich mit CSS-Randfällen und Optimierungen auskennt, kann man diese Zeile entschlüsseln.

Perfekte Antwort: Stellen Sie sich vor, Sie haben keine mobile responsive Website und öffnen sie auf einem kleinen Bildschirm, sodass der Browser den Text vergrößern könnte, um ihn besser lesbar zu machen. Die CSS-Eigenschaft text-size-adjust kann diese Funktion entweder mit dem Wert none deaktivieren oder einen Prozentsatz angeben, bis zu dem der Browser den Text vergrößern darf.

In diesem Fall gibt Twitter an, dass das Maximum 100 % beträgt, sodass der Text nicht größer als die tatsächliche Größe sein sollte; sie tun dies nur, weil ihre Website bereits responsiv ist und sie nicht riskieren möchten, dass ein Browser das Layout mit einer größeren Schriftgröße beschädigt. Dies wird auf das Stammelement HTML angewendet, sodass es für alles darin gilt. Da dies eine experimentelle CSS-Eigenschaft ist, sind Vendor-Präfixe erforderlich. Außerdem fehlt ein <style> vor diesem CSS, aber ich vermute, dass es in der vorherigen Zeile minimiert ist und wir es nicht sehen.

Auch akzeptiert: Ich kenne diese Eigenschaft nicht im Detail, aber -ms und -webkit- sind Vendor-Präfixe, die von Internet Explorer und WebKit-basierten Browsern bzw. für nicht standardmäßige Eigenschaften benötigt werden. Wir benötigten diese Präfixe früher, als CSS3 herauskam, aber wenn Eigenschaften von experimentell zu stabil werden oder in den Standardisierungsprozess übernommen werden, verschwinden diese Präfixe zugunsten einer standardisierten Eigenschaft.

Bonus — Zeile 11: body{margin:0;}

Diese Zeile aus Twitters Quellcode ist besonders unterhaltsam, da man anschließend eine Frage nach dem Unterschied zwischen dem Zurücksetzen und Normalisieren einer Webseite stellen kann. Fast jeder kannte eine Version der richtigen Antwort.

Perfekte Antwort: Da verschiedene Browser unterschiedliche Standardstile (User Agent Stylesheet) haben, möchten Sie diese überschreiben, indem Sie Eigenschaften zurücksetzen, damit Ihre Website auf verschiedenen Geräten gleich aussieht. In diesem Fall teilt Twitter dem Browser mit, den Standardrand des Body-Tags zu entfernen. Dies dient nur dazu, Browserinkonsistenzen zu reduzieren, aber ich bevorzuge es, die Stile zu normalisieren, anstatt sie ganz zurückzusetzen, d. h. die gleichen Standardeinstellungen über Browser hinweg anzuwenden, anstatt sie ganz zu entfernen. Leute haben sogar früher * { margin: 0 } verwendet, was völlig übertrieben und schlecht für die Performance ist, aber jetzt ist es üblich, etwas wie normalize.css oder reset.css zu importieren (oder sogar etwas neueres) und von dort aus zu beginnen.

Mehr Zeilen!

Ich genieße es immer, mit dem Browser-Inspector-Tool herumzuspielen, um zu sehen, wie Websites erstellt werden, und so kam mir diese Idee. Auch wenn ich mich selbst als Experten für semantisches HTML betrachte, lerne ich jedes Mal etwas Neues, wenn ich diese Übung mache.

Da Twitter hauptsächlich eine clientseitige React-App ist, gibt es im Quellcode nur ein paar Dutzend Zeilen. Selbst damit gibt es so viel zu lernen! Es gibt noch ein paar interessantere Zeilen im Twitter-Quellcode, die ich Ihnen, dem Leser, als Übung überlasse. Wie viele davon könnten Sie in einem Vorstellungsgespräch erklären?

<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Twitter">

…weist Browser an, dass Benutzer Twitter als Suchmaschine hinzufügen können.

<link rel="preload" as="script" crossorigin="anonymous" href="https://abs.twimg.com/responsive-web/client-web/polyfills.cad508b5.js" nonce="MGUyZTIyN2ItMDM1ZC00MzE5LWE2YmMtYTU5NTg2MDU0OTM1" />

…hat viele interessante Attribute, die diskutiert werden können, insbesondere nonce.

<link rel="alternate" hreflang="x-default" href="https://twitter.com/" />

…für internationale Landingpages.

:focus:not([data-focusvisible-polyfill]){outline: none;}

…zum Entfernen der Fokus-Umrandung, wenn keine Tastaturnavigation verwendet wird (der CSS-Selektor :focus-visible wird hier polyfilled).