Was sind die Nachteile beim Senden von XML an Browser und beim Anwenden von XSLT?

14

Kontext

Als freiberuflicher Entwickler habe ich oft Websites erstellt, die vollständig auf XSLT basieren. Mit anderen Worten, bei jeder Anforderung wird eine XML-Datei generiert, die alles enthält, was wir über den Seiteninhalt wissen müssen: den Namen des aktuell angemeldeten Benutzers, die obersten Menüeinträge, wenn dieses Menü dynamisch / konfigurierbar ist, den Text zu Anzeige in einem bestimmten Bereich der Seite usw. Anschließend wird sie von XSL-Prozessen (Caches usw.) an HTML / XHTML-Seiten gesendet, um sie an den Browser zu senden.

Es hat einen guten Grund, die Erstellung kleinerer Websites zu vereinfachen, insbesondere mit PHP. Es ist eine Art Template-Engine, die ich aber anderen Template-Engines vorziehe, weil sie viel leistungsfähiger ist als die meisten Template-Engines und weil ich sie besser kenne und mag. Es ist auch möglich, bei Bedarf einen Zugriff auf XML-Rohdaten für einen automatisierten Zugriff bereitzustellen, ohne dass separate APIs erstellt werden müssen.

Natürlich wird es auf jeder mittelgroßen oder großen Website vollständig versagen, da XSL trotz guter Caching-Techniken die Gesamtleistung der Website beeinträchtigt und mehr CPU-Server erfordert.

Frage

Moderne Browser haben die Möglichkeit, eine XML-Datei aufzunehmen und mit einer zugehörigen, in XML deklarierten XSL-Datei zu transformieren <?xml-stylesheet href="demo.xslt" type="text/xsl"?>. Firefox 3 kann das. Internet Explorer 8 kann das auch.

Dies bedeutet, dass es für 50% der Benutzer möglich ist, die XSL-Verarbeitung vom Server auf die Clientseite zu migrieren (entsprechend der Browserstatistik auf mehreren Websites, auf denen ich dies möglicherweise implementieren möchte). Dies bedeutet, dass diese 50% der Benutzer bei jeder Anforderung nur die XML-Datei erhalten, wodurch die Bandbreite ihrer Benutzer und des Servers (die XML-Datei ist viel kürzer als das verarbeitete HTML-Analog) und die CPU-Auslastung des Servers verringert werden.

Was sind die Nachteile dieser Technik?

Ich habe über mehrere nachgedacht, aber das trifft in dieser Situation nicht zu:

  • Schwierige Implementierung und die Notwendigkeit, basierend auf der Browseranforderung zu entscheiden, wann unformatiertes XML gesendet und stattdessen in HTML umgewandelt werden soll. Offensichtlich wird das System nicht viel schwieriger sein als das eigentliche. Die einzige Änderung, die vorgenommen werden muss, ist das Hinzufügen einer XSL-Dateiverknüpfung zu jeder XML-Datei und das Hinzufügen einer Browserprüfung.
  • Mehr IO- und Bandbreitennutzung, da die XSLT-Datei von den Browsern heruntergeladen wird, anstatt vom Server zwischengespeichert zu werden. Ich denke nicht, dass es ein Problem sein wird, da XSLT-Dateien von den Browsern zwischengespeichert werden (wie Bilder oder CSS oder JavaScript-Dateien werden tatsächlich zwischengespeichert).
  • Möglicherweise einige Probleme auf der Client-Seite, z. B. Probleme beim Speichern einer Seite in einigen Browsern.
  • Schwierigkeiten beim Debuggen von Code: Es ist unmöglich, eine HTML-Quelle zu erhalten, die der Browser tatsächlich verwendet, da die einzige angezeigte Quelle das heruntergeladene XML ist. Auf der anderen Seite schaue ich selten auf HTML-Code auf der Clientseite und in den meisten Fällen ist er direkt unbrauchbar (Leerzeichen werden entfernt).
Arseni Mourzenko
quelle
1
Es spielt keine Rolle, wie das rohe HTML aussieht. Tools wie Firebug formatieren es für Sie.
Jeremy Heiler
Haben Browser schon XSLT 2.0? Persönlich würde ich nicht zu XSLT 1 zurückkehren wollen.
Christopher Creutzig
@ChristopherCreutzig: Ich erinnere mich, dass die serverseitige XSLT 2.0-Unterstützung sehr begrenzt war (obwohl ich mich nicht genau erinnere, ob es sich um ein Problem mit C #, Python, PHP, Nginx ngx_http_xslt_moduleoder allen vier handelte). Ich bezweifle sehr, dass die clientseitige Unterstützung von XSLT 2.0 besser ist.
Arseni Mourzenko
@MainMa Was hindert mich daran, z. B. Saxon auf dem Server zu verwenden und völlig zu ignorieren, ob mein Server in Ruby, PHP, Java, C # oder x86-Assembly geschrieben ist? Der Server ist ein Ort, an dem ich Code aus allen gewünschten Sprachen und Umgebungen frei mischen kann - vorausgesetzt, ich habe keine verkrüppelte Hosting-Lösung, bei der ich natürlich keine externen Programme aufrufen kann.
Christopher Creutzig
1
@ChristopherCreutzig: Ich habe oft in Umgebungen gearbeitet, in denen man den Systemadministrator einfach nicht bitten konnte, alles auf dem Server bereitzustellen, was man will. Das machte es mir praktisch unmöglich, Saxon zu verwenden.
Arseni Mourzenko

Antworten:

27

Browser können XSLT nicht progressiv rendern

Dies bedeutet, dass nichts anderes geladen und nichts angezeigt wird, bis alle Daten und das gesamte Stylesheet geladen und verarbeitet wurden.

Sie verpassen das progressive Rendern und Prefetching von Bildern, CSS und JS.

Das erstmalige Laden wird durch eine andere Anforderung verzögert

Bei kleinen Dateien (<20 KB) ist die Anzahl der Anforderungen, nicht die Bandbreite, der Engpass für die Front-End-Leistung, und die meisten Seiten und Stylesheets fallen in diese Kategorie.

Wenn Sie große Seiten haben, ist es noch schlimmer - siehe den ersten Punkt.

Sie sparen wahrscheinlich keine Bandbreite

XSLT selbst ist recht ausführlich und muss möglicherweise Vorlagen für die gesamte Site und Logik für alle seltenen Fälle enthalten, nicht nur für die auf der aktuellen Seite verwendeten Elemente.

Sie müssen weiterhin alle Daten einschließen, die in der von Ihnen gesendeten XML-Hauptdatei markiert sind. Wenn Sie z. B. einen Blog-Beitrag senden, kann XSLT diese Datei nicht wesentlich verkleinern. Wenn Sie komplexe Daten senden, wird es trotzdem viele Markups geben.

Caches werden überbewertet

Browser-Caches sind nicht so toll :

40-60% der Yahoo! -Nutzer haben einen leeren Cache, und ~ 20% aller Seitenaufrufe werden mit leerem Cache ausgeführt.

Auf Mobilgeräten, bei denen die Latenz zusätzliche Anforderungen am teuersten macht, sind die Caches sogar noch schlechter .

Überprüfen Sie Ihre Absprungrate - dies sind Benutzer, die nicht von zwischengespeichertem XSLT profitieren und sogar einen Aufpreis zahlen, um das Stylesheet herunterzuladen und auf die Verarbeitung zu warten.

gzip ist eine umgekehrte XSLT

Die meisten Transformationen, die über XSLT ausgeführt werden, bestehen darin, das knappe Markup in ein ausführlicheres zu ändern und Wiederholungen hinzuzufügen. Aber gzip ist großartig, um Wiederholungen / Redundanzen aus Dateien zu entfernen!

Sie sollten ohnehin gzip verwenden (es ist verschwenderisch, XML unkomprimiert zu senden). Es ist sehr wahrscheinlich, dass die komprimierte Größe des verarbeiteten Dokuments in etwa der komprimierten Größe von nicht verarbeitetem XML entspricht. Sie müssen jedoch kein zusätzliches XSLT senden, und Browser können mit dem Rendern beginnen, sobald die ersten Pakete eintreffen.

Clients sind möglicherweise langsam

Selbst wenn der beste Fall für das Laden aus dem Cache angenommen wird, ist die XSLT-Verarbeitung auf der Clientseite nur dann schneller, wenn die CPU des Benutzers schneller und die XSLT-Engine schneller ist.

Auf der Serverseite können Sie alle Arten von Optimierungstricks ausführen (z. B. im Cache verarbeitete Fragmente oder sogar ganze Seiten). Sie können den neuesten, schnellsten XSLT-Prozessor verwenden (Browser haben nur XSLT 1.0 und sind wahrscheinlich nicht sehr optimiert). Und Ihr Server hat wahrscheinlich eine leistungsstärkere CPU als viele billige Bürocomputer, Telefone usw.

Kornel
quelle
Hervorragende Antwort! Ich wünschte, ich könnte mehrmals darüber abstimmen.
Gaurav
1
+1 speziell für gzipPunkt
Nicole
3

Es gibt keinen Grund, warum diese Serverseite nicht skaliert und HTML nicht direkt generiert werden sollte. Es gibt auch nicht viel Grund für einen großen konstanten Overhead im Vergleich zu PHP. Anscheinend gibt es XSLT> JVM / CLR-Compiler und ich nehme an, Sie könnten es sogar in nativen Code übersetzen.

Die Idee, Daten und Präsentationsstruktur getrennt zu transportieren, ist jedoch als solche gut.
Es kann viel Bandbreite und sogar Serverleistung sparen. Aber pomeL hat eine Reihe von Punkten erwähnt.

Für eine ordnungsgemäße Unterstützung in allen Browsern kann xslt.js hilfreich sein.

Ich persönlich bin kein Fan von XML, daher würde ich stattdessen JSON und eine JS-Template-Engine verwenden, die im Browser ausgeführt wird. Oder eine Art Template-Engine, die das Template-Markup auf der Serverseite in ausführbare js konvertiert, die für das Rendern auf der Clientseite verwendet werden.
JavaScript ist relativ schnell und praktisch überall verfügbar. JSON und JS sind wesentlich kompakter als XML und XSLT.

back2dos
quelle
Im Gegensatz zu XML / XSLT, das bereits mitgeliefert wird, müssten Sie "jsonlt" jedoch selbst entwickeln, um Ihre Daten richtig einzustellen oder eine Client-Seite nur für das Rendering zu entwickeln.
Walfrat
2

Wenn Sie kompaktes XML senden und einen zwischengespeicherten XSLT auf dem Client haben, können Sie sogar Bandbreite sparen.

Sie lassen alle Browser wie Smartphones aus, die XSLT nicht unterstützen. Sie sollten jedoch trotzdem eine spezielle Version für diese erstellen.

9000
quelle
2
Es gibt keine spezielle Version für Browser, die XSLT nicht unterstützen (IE6, Smartphone-Browser usw.). Bei diesen Browsern wird die XSL-Transformation vom Server auf der Grundlage derselben XSLT-Datei durchgeführt und stattdessen der endgültige HTML-Code gesendet.
Arseni Mourzenko
2
MainMa: Ja, aber für Smartphones wird normalerweise ein anderes XSL-Format verwendet, da die Bildschirmgröße sehr unterschiedlich ist und nicht verwendet werden kann :hover. etc.
9000
1

Das Hauptproblem bestand früher darin, dass nur wenige Browser dies gut unterstützten, so dass sich die Mühe nicht lohnte, im Wesentlichen eine neue zu unterstützende Plattform zu erstellen. Außerdem haben ältere Versionen von IE dies nicht gut unterstützt, und wenn ich mich richtig erinnere, hatte mindestens ein IE einen anderen XSLT-Dialekt, der alle möglichen unterhaltsamen Probleme bereitete.


quelle
1
Wenn diese wenigen Browser von den meisten Benutzern verwendet werden, ist es möglicherweise die Mühe wert.
user281377
Außerdem haben Sie keine Kontrolle darüber, welche Unterstützung die Client-Systeme für XSLT bieten. Wenn sie nicht standardkonforme Plug-Ins oder ähnliches verwenden (ich weiß, das passiert so gut wie nie ...), funktioniert Ihre Website nicht und es ist fast unmöglich, sie zu unterstützen.
TMN