Was ist Scully?
Im Grunde genommen ist Scully ein Static-Site-Generator, kurz SSG. Obwohl es bereits einige anderen Implementationen von Static-Site-Generatoren wie Gatsby, Hugo, Jekyll oder Zola gibt, ist Scully die Erste für Angular-Applikationen.
Im Vergleich zum konventionellen Jamstack hat dieses Tool jedoch einige weitere Ziele:
- für Angular Projekte (und dies ohne grossen Aufwand)
- Support für Markdown
- Plugin System & Ecosystem
Scully wird also dafür verwendet, um jede Seite Ihrer Angular-Applikation zu pre-rendern und eine reine statische HTML- & CSS-Seite zu generieren. Dabei wurde Scully von HeroDevs Ende 2019 in einer Alpha-Version released. Durch das Verwenden von Scully ist es nicht mehr notwendig, dass irgendwelche JavaScript-Dateien heruntergeladen werden müssen. Aus diesem Grund ist die Download-Grösse im Vergleich zu einer normalen Angular Applikation um einiges geringer.
Jamstack
Wir bei b-nova haben uns bereits des Öfteren mit dem Thema Jamstack auseinandergesetzt. Hierzu hat Raffi bereits
auch einen Blog-Artikel geschrieben. Trotz allem
möchte ich Ihnen an dieser Stelle noch einmal die wichtigsten Punkte aufzeigen. Das Ziel von Jamstack ist es zunächst
einmal allen Inhalt zuvor schon zu rendern. Ebenfalls ist es so möglich den Vorteil eines CDNs zu nutzen, in dem die
Daten quasi sehr nah beim Endnutzer sind und so Ladezeiten verkürzt werden können. Dadurch lassen sich auch enorme
Kosten sparen. Ebenfalls wird der Sicherheitsaspekt erhöht, da es sich nur noch um statische Seite handelt.
Der Scully Prozess
Im Grunde genommen ist Scully im ersten Schritt dafür zuständig, dass die App analysiert wird und die gesammelten Informationen in statische Fils schreibt, um die notwendigen States, Seiten und Routen darstellen zu können.
Plugins
Plugins werden an den Stellen verwendet, an dem Scully Hilfe benötigt. Zum Beispiel beim Finden von allen oder bestimmen
Routen. Ein Plugin gibt dabei immer ein async
-Funktion oder eine Promise als Rückgabewert zurück. Dabei gibt es
unterschiedliche Standard Plugins:
allDone
Diese werden aufgerufen, sobald Scully alle Prozesse ausgeführt hat. Dies ist somit nützlich, wenn Sie noch etwas machen müssen, nach dem die Seite erstellt wurde.
routeDiscoveryDone
Diese werden erst aufgerufen, wenn Scully alle Routen gesammelt und auch alle Router-Plugins fertig sind. Dies kann zum Beispiel nützlich sein, wenn Sie einen eigenen RSS-Feed erstellen möchten. Da das Plugin erst aufgerufen werde, wenn alle zuvor genannten Aufgaben durch sind.
fileHandler
Dieses Plugin wird von dem contentFolder-Plugin während des render-Prozesses verwendet. Dieses wiederum ist dafür zuständig, dass alle Ordner mit Markdown-Dateien oder aber auch andere Formate, die Sie wünschen, verarbeitet. Standardmässig bietet Scully hier ein Markdown-Plugin sowie ein asciidoc-Plugin. Wenn Sie beispielsweise csv-Dateien verarbeiten möchten, ist dies Ihr passenden Typ.
router
Sobald Ihre Route
-Parameter verwendet, müssen Sie ein router-Plugin verwenden. Somit kann Scully wissen, welcher
Inhalt dargestellt werden muss. Anhand eines kleinen Beispiels lässt sich dies am besten erklären.
|
|
Bei den ersten drei Beispielen hat Scully kein Problem die Routes zu erkennen und diese entsprechend zu rendern. Jedoch bei dem letzten hat
Scully ein Problem mit dem Parameter blogId
. In diesem Fall wird nun ein Plugin benötigt, welches eine Liste mit
vorhanden blogIds bereitstellt und diese anschliessend dann auch gerendert werden können.
Anforderungen
Je nachdem, welche Angular Version Sie verwenden, müssen Sie darauf achten, welche Scully Version Sie verwenden.
-
Angular 9, 19, 11 → Scully V1.1.1
-
Angular 12 → ab Scully V 2.0.0
-
Node.js 14 oder neuer
Damit auch Scully auch verwendet werden kann, ist mindestens eine Route innerhalb der App notwendig, deshalb muss die App das router-Modul importiert haben.
Scully in Aktion
Zunächst einmal müssen Sie eine App erstellen. Hier ist es bei den Einstellungen wichtig, daran zu denken, dass Scully Routing benötigt. Deshalb macht es Sinn, dies gleich in diesem Schritt hinzuzufügen.
|
|
Im Anschluss wechseln Sie in das App-Verzeichnis. Von Haus aus bietet Scully ein Package mit verschiedenen Angular Schematics. Dieses können Sie installieren, damit ihre App initial automatisch gebootstrapped und konfiguriert wird.
|
|
Dadurch erhalten Sie einige neue Dateien und haben diese Ordner Struktur. Hierzu gehört der scully
-Ordner, die
Konfigurationsdatei scully.scully.config.ts
. Alleine schon mit diesen Einstellungen sind Sie bereit Scully zu
verwenden.
|
|
An dieser Stelle können Sie nun die Applikation Builden, mit Scully die statischen Seiten erstellen lassen und anschliessend den Server starten.
|
|
Im Anschlusskönnen Sie die Seite einer Angular App unter der Adresse http://localhost:1668/
aufrufen, diese ist die Variante, welches das Ergebnis von ng build
bereitstellt. Unter der Adresse
http://localhost:1864/ befindet sich die Variante aus dem von Scully erstellten
dist
-Ordner.
Um nun auch wirklich zu beweisen, dass es sich um eine statische Seite handelt, können Sie innerhalb des Browsers
JavaScript einfach deaktivieren und prüfen, ob die Seite nach einem Refresh immer noch gleich aussieht. Falls Sie Chrome
verwenden, können Sie innerhalb der Entwickler Tools über das command
-Feld (Control+Shift+P oder Command+Shift+P)
Javascript deaktivieren und andersrum.
Nun wollen wir noch ein wenig Inhalt zu unserer Seite hinzufügen. Dafür sind zunächst ein Mal neue Komponenten notwendig, die Sie für eine App benötigen.
|
|
Nun muss innerhalb von app.module.ts
Ihre zuvor erstellten Komponenten für die Angular App verfügbar gemacht werden.
|
|
Damit Ihre App weis, welche Routen sie zur Verfügung stellen soll, müssen nun neue Routes angelegt werden. Dies ist
innerhalb von app-routing.module.ts
.
|
|
Damit Sie nun auch Inhalt sehen und auch zwischen Seiten hin und her wechseln können, müssen Sie
unter app. component.html
eine Liste mit Links erstellen, sowie das router-outlet
-Tag für den Inhalt Ihrer
verschiedenen Routen bereitstellen.
|
|
Um den Inhalt innerhalb der verschiedenen Seiten können Sie für Test-Zwecke beispielsweise einfach die Namen als
Überschrift ausgeben. Dies ist in diesem Beispiel in den Dateien: not-found.component.html
, bnova.component.html
und blog.component.html
.
|
|
Selbstverständlich können Sie während dem entwickeln auch den Server starten, um zu überprüfen, ob ihre Änderungen auch erfolgreich waren
|
|
Wie vorhin bereits beschrieben können Sie nun Scully das erste Mal mit eigenem Inhalt ausprobieren.
|
|
Nach dem scully
Befehl erhalten sie eine neue Struktur innerhalb dem dist
-Ordner. Hier ist zu beachten, dass
innerhalb des static-Ordners nun 3 index.html
-Daten vorhanden sind, welche den statischen Inhalt beinhalten.
|
|
Scully als Blog
Zuvor haben wir Ihnen gezeigt wie Sie eine normale Angular App nutzen können. Static-Seite-Genaratoren kommen jedoch oft in Verbindung mit Blogs in Verbindung. Deshalb bietet Scully von Haus aus hier eine Möglichkeit, die Sie auf jeden Fall kennenlernen sollten.
Auch hierfür erstellen Sie ein neues Projekt.
|
|
Out-off-the-box gibt es ein Scully-Command, welches die Blog Funktion hinzufügt:
|
|
Dadurch erhalten Sie direkt alle notwendigen Routen und einen Ordner mit einer Blog-Komponente.
|
|
Falls Sie nicht die Standardeinstellungen verwenden möchten, können Sie diese auch über einen anderen Befehl hinzufügen, bei dem Sie nach einigen Einstellungen gefragt werden:
|
|
Praktischerweise gibt es auch einen Befehl, der Ihnen direkt einen Blogbeitrag erstellt:
|
|
Diesen Artikel können Sie als Markdown-Datei in dem Ordner blog
finden:
|
|
Innerhalb des Markdown-Files wird ein Standard-Header bestimmt, sowie eine h1-Überschrift hinzugefügt. Anschliessend können Sie Ihren Inhalt innerhalb dieses File mit Markdown-Format schreiben.
|
|
Gleichzeitig ist meist eine Seite sinnvoll, welche eine Übersicht über alle verfügbaren Blog-Artikel bereitstellt. Dafür müssen Sie eine weitere Komponente erstellen.
|
|
Im Anschluss muss die Logik implementiert werden, die nur Blog-Artikel anzeigt, welche public = true
sind. Dies wird
innerhalb von bnova.component.ts
gemacht. Über ScullyRoutesService
bietet Scully für diesen Fall ein
Observable available$
um danach zu filtern.
|
|
Selbstverständlich kann man auch den gewünschten Inhalt für die Übersicht bestimmen. Dies passiert
innerhalb bnova. component.html
|
|
Wenn Sie auf den Link “Hier entlang“ klicken, wollen Sie zu der entsprechenden Blogartikel-Seite weitergeleitet
werden. Dafür müssen Sie noch eine weitere Anpassung innerhalb von blog-routing.module.ts
vornehmen für den “leeren”
Pfad.
|
|
Der Inhalt Ihrer Markdown-Dateien wird innerhalb der blog.component.html
Datei gerendert. Möchten Sie dabei
Style-Anpassungen vornehmen, können Sie dies innerhalb von blog.component.css
machen.
|
|
Für beide Beispiele finden Sie den Code auf Github: Standard Variante und Blog Variante.
Fazit
In diesem TechUp-Beitrag habe Sie nun zwei Varianten gesehen, wie Sie Scully verwenden können. Dabei kann für viele Interessierte die Blog-Funktion sehr interessant sein, da man ziemlich schnell und ohne grossen Aufwand einen eigenen Blog erstellen kann. Selbstverständlich muss Ihnen in beiden Fällen klar sein, dass dafür natürlich auch das technische Wissen notwendig sein muss, um eine Angular Applikation bereitzustellen. Sobald Sie dies aber geschafft haben oder sich genau deswegen dafür entscheiden, können Sie alle Vorteile von Jamstack nutzen.