Modernes Web - Single Page Application

  • App
    WoltLab Suite Core

    Hallo zusammen,

    ich hatte vor einigen Tagen die Idee aus dem WSC via Pugin eine SinglePageApplication zu bauen. Heute haben LucaDev und ich uns dann dran gesetzt und versucht, dieses Plugin zu schreiben.

    Am Ende kam folgendes Resultat raus (JavaScript-Datei, die im Browser eingebunden wird):

    Zum laden der Seiten reicht das soweit, allerdings gibt es verschiedene Probleme aufgrund der Umsetzung des WSC:

    1. leere Foren (z.B.) können nicht angezeigt werden, da diese den HTTP Status Code 404 zurückgeben (Unterstützt jQuerys load-Funktion nicht)
    2. Einige Funktionen sind eingeschränkt *
    3. Formulare sind nicht mit dem Plugin kompatibel, da diese den Input-Type "submit" in Verbindung mit einer entsprechenden Aktion des Formulars und nicht via einen Link mit dem Attribut href abgesendet werden

    Zu 2.: Wir mussten feststellen, dass mit unserer Umsetzung einige Funktionen eingeschränkt sind wie z.B. Dropdowns, die Profilnavigation(Pinnwand, Über Mich, ...) oder auch die Optionen zum Schreiben von Beiträgen (Smileys, Dateianhänge, Einstellungen).

    Somit schauten wir nach, weshalb das nicht geht und der Grund ist mit größerer Wahrscheinlichkeit die WSC.Combined.min.js, die im head in die Seite eingebunden wird (Allerdings kann es auch jede andere JavaScript-Datei im body sein).

    Der Vorteil einer Single Page Application (SPA) ist es, dass die Seite nicht komplett neu geladen werden muss um den Inhalt dieser zu aktualisieren. Bei unserem Beispiel wird z.B. nicht der head-Bereich neugeladen oder auch die gesamten Scripts am Ende des body nicht, welche die Ladezeit einer Seite ins unermessliche laufen lassen (können). So schafft die SPA dabei Abhilfe und verringert einerseits die Ladezeit der Seite (Da nur der HTML-Teil neugeladen wird und nicht noch alle css- und js-Dateien) und spart somit auch gleichzeitig noch weiter Traffic ein. Das ist allerdings so nicht direkt möglich, da wir das gesamte Dokument anscheinend neu laden müssten um alle verfügbaren Funktionen nutzen zu können.

    Leider mussten wir aufgrund verschiedener Tests feststellen, dass wir es mit dem Plugin nicht schaffen können/werden den Core so zu verändern, dass man die Seite später als SPA betrachten kann. Daher war unsere Idee, dass wir das ganze hier vorschlagen auf Hoffnung, dass es hinzugefügt wird.

    Uns ist durchaus klar, dass für ein solches Vorhaben das Frontend fast grundlegend verändert werden muss, allerdings für eine umso bessere Performance.

    Wir werden dieses Plugin nicht weiter schreiben, da wir nicht das halbe WSC dafür umschreiben wollen, bzw. die Möglichkeiten um dies als Plugin zu realisieren zu sehr begrenzt sind.

    Ich habe den Code oben noch dazugepackt, da ihr diesen ggf. nutzen könntet um das Vorhaben zu realisieren, sofern der Vorschlag euch überzeugt hat. Es gibt allerdings bestimmt auch wesentlich bessere Umsetzungsmöglichkeiten. Das ändern der URL könnte man außerdem mit der HTML 5 Histrory-API umsetzen.

    Es würde uns freuen, wenn eine solche Funktion hinzugefügt wird.

    Mit freundlichen Grüßen

    ilou & LucaDev

    Edited once, last by ilou (December 26, 2016 at 11:05 PM).

  • Dein Lösungsvorschlag ist ja nicht wirklich Single-Page Application, da bei jedem Request letztlich doch der komplette HTML-Code einer Seite übertragen wird. Ein großer Vorteil von Single-Page Applications, dass nur die eigentlichen Daten (z.B. via JSON) übertragen werden, wäre damit ja nicht gegeben.

    Die Suite als Single-Page Application umzusetzen ist sicherlich interessant, aber nichts was mal eben umsetzbar ist. Für eine solche Entwicklung würde man vermutlich auf ein fertiges Framework (wie z.B. AngularJS oder Vue.js) setzen. Dafür müsste man zugleich große Teile der Software komplett neu entwickeln. Das ist für uns aber aktuell kein Thema (eine größere Überarbeitung haben wir mit der neuen Version gerade erst hinter uns gebracht). Deshalb hier das Label "auf absehbare Zeit nicht geplant".

  • Quote

    Dein Lösungsvorschlag ist ja nicht wirklich Single-Page Application, da bei jedem Request letztlich doch der komplette HTML-Code einer Seite übertragen wird. Ein großer Vorteil von Single-Page Applications, dass nur die eigentlichen Daten (z.B. via JSON) übertragen werden, wäre damit ja nicht gegeben.

    Das stimmt teilweise (Sofern ich die load-Funktion jQuerys richtig verstanden habe). Wir laden nur den Teil des main-Containers der aufgerufenen Seite in den main-Container der alten Seite. Dass das nicht so praktisch umgesetzt ist, war mir schon klar.

    In einer Software die ich programmiere (in NodeJS wohlgemerkt) mache ich es so, dass ich einen extra pathname nur für templates die mittels EJS gerendert werden bereit stelle. Diese werden dann in eine index.html geladen (bzw. eher index.ejs, wird aber ja gerendert).

    Ich persönlich nutze AngularJS in letzter Zeit recht ungerne, da sich darin doch einige Sicherheitsrisiken befinden, die man dann noch extra mit NodeJS rausglätten muss.

    Schade, dass der Vorschlag (vorerst) abgelehnt wurde, allerdings hatte ich ja schon gesagt, dass es wahrscheinlich eher aufwendig wird, was ja jetzt auch bestätigt wurde. Allerdings kann man das ja mal im Hinterkopf behalten für die nächste große Version, weil man sich damit teils gute Vorteile für den Kunden schafft, aber auch gegenüber Konkurrenz, da mir keine Forensoftware (außer NodeBB) bekannt ist die als SPA aufgebaut ist.

    Mit freundlichen Grüßen

    ilou

  • Das stimmt teilweise (Sofern ich die load-Funktion jQuerys richtig verstanden habe). Wir laden nur den Teil des main-Containers der aufgerufenen Seite in den main-Container der alten Seite. Dass das nicht so praktisch umgesetzt ist, war mir schon klar.

    Du lädst das gesamte DOM und via jQuery-Selektor extrahierst du einen Teil daraus, unterm Strich lädst du aber trotzdem die gesamte Seite.

  • Du lädst das gesamte DOM und via jQuery-Selektor extrahierst du einen Teil daraus, unterm Strich lädst du aber trotzdem die gesamte Seite.

    Dann hab ich die jQuery-Funktion etwas missverstanden... Aber wir haben auch keine wirkliche andere (bessere) Möglichkeit gefunden.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!