JAMstack-Websites werden oft als „statisch“ angesehen. Ein genaueres mentales Modell dafür wäre, dass es sich um Websites handelt, die die „Möglichkeit zur statischen Haltung“ haben. Der Unterschied mag semantisch erscheinen, aber dank des Aufstiegs vieler Tools und Dienste, die die Ausführung eines Builds und die Bereitstellung auf einer statischen Hosting-Infrastruktur vereinfachen, können sich solche Websites frischer und dynamischer anfühlen, als Sie vielleicht erwarten, während sie dennoch aus einer statischen Hosting-Infrastruktur heraus bedient werden können, mit all den Vorteilen, die dies mit sich bringt.
Ein Feature, das oft als Beispiel dafür dient, warum eine Website nicht statisch gehostet werden kann, sind Kommentare. Eine Kommentar-Engine muss Einreichungen verarbeiten, Moderation zulassen und ist von Natur aus „dynamisch“.

Dank des wachsenden Ökosystems von Tools für JAMstack-Websites gibt es Lösungen dafür. Schauen wir uns ein Beispiel an, das Sie auf Ihrer eigenen Website verwenden könnten, das
- kein clientseitiges JavaScript benötigt
- mit jedem Static Site Generator funktionieren könnte
- Moderation beinhaltet
- Benachrichtigungen sendet, wenn neue Kommentare moderiert werden müssen
- die Kommentare in Ihre Website einbäckt, sodass sie schnell geladen werden und in Suchergebnissen erscheinen
Dieses Beispiel nutzt einige der Funktionen von Netlify, einer Plattform zur Automatisierung, Bereitstellung und zum Hosting von Webprojekten. Viele der Prinzipien könnten jedoch auch mit anderen Plattformen verwendet werden.
Sie können die Beispiel-Website hier sehen.

Speichern unserer Inhalte
Wir erstellen 2 Formulare, um alle unsere Kommentare in den verschiedenen Phasen ihrer Reise vom Kommentator zum Inhalt zu empfangen. Wenn Netlify ein <form> sieht, erstellt es einen eindeutigen Datenspeicher für die von dem Formular gesammelten Daten. Dies werden wir ausgiebig nutzen.
- Formular 1) Eine Warteschlange zur Aufnahme aller neuen Kommentar-Einreichungen. Mit anderen Worten, ein Speicher für alle Kommentare, die auf Moderation warten.
- Formular 2) Enthält alle genehmigten Kommentare.
Der Akt der Moderation wird darin bestehen, dass jemand jede neue Einreichung prüft und entscheidet: „Ja!“ oder „Nein!“. Diejenigen, die abgelehnt werden, werden aus der Warteschlange gelöscht. Diejenigen, die genehmigt werden, werden in das Formular für genehmigte Kommentare überführt.

Alle Kommentare im Formular für genehmigte Kommentare werden von unserem Static Site Generator in nachfolgenden Website-Builds verwendet, dank des API-Zugangs, den Netlify für die Einreichungen in unseren Formularen bietet.

Das Kommentarformular
Jede Seite enthält ein HTML-<form>. Durch Hinzufügen des booleschen Attributs netlify zu jedem HTML-Formularelement auf Ihrer Website generiert Netlify automatisch eine API für Ihr Formular und sammelt alle Einreichungen für Sie. Sie können die Einreichungen später auch über diese API abrufen. Praktisch!
Das Kommentar-<form> auf jeder Seite wird in etwa so aussehen (einige Klassen und zusätzlicher Text wurden zur Klarheit weggelassen)
<form netlify name="comments-queue" action="/thanks">
<input name="path" type="hidden" value="{{ page.url }}">
<p>
<label for="name">Your name</label>
<input type="text" name="name" id="name">
</p>
<p>
<label for="email">Your email</label>
<input type="email" name="email" id="email">
</p>
<p>
<label for="comment">Your comment</label>
<textarea name="comment" id="comment"></textarea>
</p>
<p>
<button type="submit">Post your comment</button>
</p>
</form>
Sie werden feststellen, dass das Formular auch ein Feld vom Typ type="hidden" enthält, um uns mitzuteilen, für welche Seite auf der Website dieser Kommentar bestimmt ist. Unser Static Site Generator füllt dieses Feld für uns aus, wenn die Website generiert wird, und wir werden es später verwenden, um zu entscheiden, welche Kommentare auf welcher Seite angezeigt werden sollen.

Einreichungen und Benachrichtigungen
Wenn ein neuer Kommentar über das Kommentarformular gepostet wird, speichert Netlify diesen nicht nur für uns, sondern kann auch eine Benachrichtigung senden. Das könnte sein
- eine E-Mail
- eine Slack-Benachrichtigung
- ein Webhook unserer Wahl.
Dies gibt uns die Möglichkeit, Dinge ein wenig zu automatisieren.
Neue Einreichungen führen zu einer Benachrichtigung, die auf Slack gepostet wird. Wir sehen dort direkt in unserem Slack-Client, was eingereicht wurde und für welche Seite.

Um die Dinge noch eleganter zu gestalten, können wir diese Benachrichtigung ein wenig bearbeiten, um einige Aktionsschaltflächen einzufügen. Eine Schaltfläche zum Löschen des Kommentars, eine zum Genehmigen. Das Genehmigen eines neuen Kommentars über eine Slack-Benachrichtigung auf dem Handy, während Sie Bus fahren, fühlt sich gut an.

Wir können diese Schaltflächen nicht zum Laufen bringen, ohne ein kleines Stück Logik auszuführen, was wir in einer Lambda-Funktion tun können. Netlify hat kürzlich Unterstützung für Lambda-Funktionen hinzugefügt, wodurch das Schreiben und Bereitstellen von Lambdas Teil desselben Bereitstellungsprozesses wird. Sie müssen sich nicht mehr in den AWS-Konfigurationseinstellungen von Amazon herumwühlen.
Wir werden eine Lambda-Funktion verwenden, um einige Schaltflächen zu unserer Slack-Benachrichtigung hinzuzufügen, und eine weitere Lambda-Funktion, um die Aktionen des Klickens auf eine dieser Schaltflächen zu verarbeiten.
Kommentare in die Website integrieren
Nachdem ein neu genehmigter Kommentar in unser Formular für genehmigte Kommentare gestellt wurde, greifen wir wieder auf die von Netlify bereitgestellten Auslöser für das Einreichungsereignis zurück. Jedes Mal, wenn etwas in das Formular für genehmigte Kommentare eingetragen wird, möchten wir es in die Website integrieren, sodass Netlify unsere Website automatisch neu erstellt und bereitstellt.

Die meisten Static Site Generatoren haben eine Art von Datendateien. Jekyll verwendet Dateien in einem Verzeichnis [_data], Hugo hat ein ähnliches Datenverzeichnis. Dieses Beispiel verwendet Eleventy als seinen Static Site Generator, der ein ähnliches Konzept hat. Wir werden uns dies zunutze machen.
Jedes Mal, wenn wir unseren Website-Build ausführen, sei es in unserer lokalen Entwicklungsumgebung oder innerhalb von Netlify durch deren automatisierte Builds, ist der erste Schritt, alle unsere externen Daten in lokale Datendateien zu ziehen, die unser SSG dann verwenden kann. Dies tun wir mit einem Gulp-Task.
Mit einer Datei `comments.json`, die wir aus einem Aufruf der Formular-Einreichungs-API von Netlify gefüllt haben, die alle unsere genehmigten Kommentare abgerufen hat, kann unser SSG nun die Website wie gewohnt erstellen und die korrekten Kommentare direkt in das HTML unserer Seiten einbacken.

Einige Vorteile
Das war zwar unterhaltsam, aber warum die Mühe?
Ja, Sie könnten etwas wie Disqus verwenden, um Kommentare zu einer statisch gehosteten Website mit ein paar Zeilen JavaScript hinzuzufügen. Aber das fügt eine externe JavaScript-Abhängigkeit hinzu und führt dazu, dass die Kommentare zu Ihrem Inhalt weit weg vom Inhalt selbst leben. Und sie sind erst verfügbar, nachdem das JavaScript geladen wurde, die Daten abgerufen und dann in Ihre Website eingefügt hat.
Während diese Methode zu Kommentaren führt, die direkt in den Inhalt Ihrer Website eingebettet sind. Sie erscheinen in Suchergebnissen bei Google und werden als Teil Ihrer Website geladen, ohne dass clientseitiges JavaScript benötigt wird.
Noch besser, sie stehen Ihnen zur Verfügung, um sie zusammen mit dem Rest Ihres Inhalts direkt in Ihr Code-Repository einzuschecken, was Ihnen in Zukunft mehr Sicherheit und Portabilität gibt.
Die Beispiel-Website und der gesamte Code dafür stehen zur Erkundung bereit. Sie können gerne Kommentare einreichen (obwohl der arme Phil alle Kommentare auf dieser Beispiel-Website moderieren müsste, bevor sie erscheinen, aber das würde ihn nur geliebt fühlen lassen).
Noch besser, Sie können dieses Beispiel klonen und Ihre eigene Version mit nur wenigen Klicks auf Netlify bereitstellen. Die Beispiel-Website erklärt, wie.
Zeig mir jetzt hinter die Kulissen!
Wenn Sie sehen möchten, wie die Dinge für den Moderator einer Website, die dieses System verwendet, ablaufen, ohne eine eigene Kopie zu erwerben, führt dieses kurze Video Sie durch einen Kommentar, der erstellt, moderiert und in die Website integriert wird.
Das ist eine interessante Idee, aber das Neuerstellen der Website oder Seite nach jeder neu genehmigten Kommentar scheint ziemlich dumm zu sein, besonders wenn die Website groß ist oder groß wird. Wahrscheinlich wäre es besser, einen täglichen Webjob dafür laufen zu lassen – aber selbst das tägliche Neuerstellen der Website erscheint albern.
Ich persönlich denke, dass Inhalte, die sich nicht oft ändern, perfekt für JAM sind. Kommentare, obwohl wie gezeigt möglich, treiben die Dinge zu weit. Kommentare sind dynamisch und daher scheint ein Drittanbieter-Plugin oder eine RESTful-API-Lösung viel ausgereifter. Mit anderen Worten, JAM kann gemischt werden, um das beste Ergebnis für die Bedürfnisse zu erzielen!
Danke, Nick,
Ich stimme Ihnen zu, dass Sie es vielleicht vermeiden möchten, eine Website für jeden genehmigten Kommentar neu zu generieren, wenn Sie eine Website mit einer sehr großen Anzahl von Seiten und einer hohen Frequenz von Kommentaren haben. In diesem Szenario gibt es keinen Grund, warum dieser Mechanismus nicht angepasst werden könnte, um seltener neu zu generieren und zu veröffentlichen.
Das Prinzip und die Mechanik könnten jedoch gleich bleiben, ohne auf die von Ihnen genannten Bedenken zu stoßen, denke ich.
Ich stimme jedoch nicht zu, dass Kommentare dynamisch sind und in ein Drittanbietersystem gehören. Dieser Kommentar und Ihr eigener sind beide relevant für diesen Artikel und werden am besten als Teil des Inhalts dieser Veröffentlichung behandelt. Sich auf einen entfernten Drittanbieter zu verlassen, ist nicht so wünschenswert, wie die Kommentare zu Ihren Inhalten innerhalb Ihres Inhalts zu behalten.
Rendering-Leistung, Zuverlässigkeit, Langlebigkeit und Auffindbarkeit werden alle verbessert, wenn wir die Kommentare im HTML einer Seite liefern können, anstatt darauf zu warten, dass Drittanbieter-JavaScript geladen wird, den Inhalt abruft (und was auch immer für Anzeigen sie einfügen möchten) und dann den restlichen Inhalt auf der Seite rendert.
Es ist auch schön, wenn der Inhalt von Kommentaren in Suchergebnissen auftaucht und Leute auf diese Weise zu Ihren Inhalten gebracht werden.
Dieses Beispiel untersuchte, was möglich sein könnte, wenn die Kosten (in Bezug auf Zeit, Geld und Aufwand) für die Generierung und Bereitstellung einer Website gegen Null gehen. Was der Fall geworden ist.
Hallo, ich bin ein großer Fan des Netlify-Stacks und des einfach zu bereitstellenden Systems. Aber bei diesem Kommentarsystem wäre es nicht mühsam, jeden einzelnen Kommentar auf einer belebten Seite zu genehmigen? Wie würden Sie empfehlen, ein Kommentarsystem ohne manuelle Genehmigung zu implementieren und gleichzeitig schädliche Kommentare/Spam effektiv zu filtern?
Danke, Kevin!
Ich denke, das ist eine berechtigte Sorge. Jedes Kommentarsystem, das eine Moderation aller Einreichungen erfordert, hat einen gewissen Overhead. Was ich mit diesem Beispiel zu tun versucht habe, war zu veranschaulichen, dass Sie mit den Bausteinen von
einer statisch generierten Website
automatisierte, geskriptete Builds, die durch Hooks ausgelöst werden
konfigurierbare Benachrichtigungen von Formular-Einreichungsereignissen
Formular-APIs, die Ihre Formular-Einreichungen für Sie bearbeiten
die Möglichkeit, serverlose Funktionen zu schreiben und auszulösen
… haben Sie Zugriff auf ziemlich viel Power, und Sie können diese Tools verwenden, um alle möglichen Dinge zu erstellen. Dies ist kein Produkt, sondern ein Denkanstoß.
Für viele von uns, einschließlich derjenigen, die ihre eigenen persönlichen Blogs betreiben, denke ich, dass Benachrichtigungen über jede Einreichung in Ordnung sind, wenn sie bequem geliefert werden. Das würden wir wahrscheinlich ohnehin von dem erhalten, was wir jetzt verwenden. Aber für größere Websites mit einem viel größeren Kommentarvolumen sind Sie richtig, vielleicht wäre eine Moderationskonsole besser.
Dieses Modell würde die Hinzufügung einer bescheidenen Moderationskonsole vollständig unterstützen. Wir haben bereits Zugriff auf die Warteschlange der Kommentare, die auf Moderation warten, über eine API, und die serverlosen Funktionen könnten so angepasst werden, dass sie alles tun, was wir brauchen. Eine Seite, die alle wartenden Kommentare anzeigt, und die Möglichkeit, sie in einem Stapel zu genehmigen/löschen, wäre eine einfache Erweiterung.
Vielleicht werde ich das Beispiel auch erweitern, um dies einzuschließen.
Ich frage mich, wie andere die Funktionalität dieses Beispiels erweitern könnten?
Ich denke, Sie könnten jeden Kommentar veröffentlichen, der kommt, wenn Sie möchten, und andere Moderationstechniken verwenden.
Gegen Spam könnten Sie eine Captcha-Technik verwenden oder die Spam-Schutzfunktionen von Netlify in Ihrem Kommentarformular nutzen. Bei bösartigen Kommentaren könnten Sie die Moderation immer nach der Tatsache durchführen, indem Sie ihn aus dem Datensatz löschen und dies dann ebenfalls einen Build auslösen lassen.
Hallo Kevin. Sie könnten eine Lambda-Funktion verwenden, um die gewünschte Filterung durchzuführen und dann die Kommentare, die Ihren automatisierten Filter bestehen, in die „genehmigte“ Warteschlange zu verschieben. Die Architektur wäre fast identisch, obwohl Sie wahrscheinlich nur eine Lambda anstelle von zwei benötigen würden.
@philhawksworth
Hallo, vielen Dank für die Erklärung! Das macht total Sinn. Ich finde die Verwaltung eines Stapels von Antworten großartig! Ich verstehe, was Sie mit diesem Artikel als Denkanstoß meinen. Er ist sehr erweiterbar und ich verstehe jetzt mehr von den Möglichkeiten!
@bryan und @matt
Das sind großartige Ideen! Ich werde definitiv versuchen, diese Filter-Lambda-Funktionen zu implementieren und sie danach in eine Warteschlange zu senden! Ich sehe, wie die Hooks effektive Filterung ermöglichen können.
Danke an alle!
Ich denke, das ist kein Problem. Es sei denn, Sie stellen Builds auf einem Raspberry Pi bereit, jeder Neuerstellung sollte höchstens nur wenige Sekunden dauern. Ich habe eine statische Website, die von Hugo betrieben wird, mit etwa 200 Beiträgen, 100 Tags und einigen Kategorien, und es dauert weniger als 5 Sekunden, um alles zu erstellen und auf meinen Webserver hochzuladen.
Das könnte ein Problem bei Jekyll sein, wo Website-Builds Minuten dauern können, wenn eine Website mehr als eine Handvoll Beiträge, Includes oder paginierte Seiten hat.
Davon abgesehen wird unsere Arbeitswebsite auf Netlify gehostet und etwa 20 Mal pro Tag neu erstellt. Das scheint keine Probleme zu verursachen, obwohl ich nicht weiß, ob das der Fall wäre, wenn Sie Dutzende von Kommentaren erhalten würden.
In Bezug auf die Vorlaufzeit von der Erstellung bis zur Veröffentlichung eines Kommentars erwarte ich in anderen Systemen aufgrund menschlicher Eingriffe eine angemessene Zeit für die Moderation und bin damit einverstanden.
Wenn es mehr darum geht, viele lange Builds auf Netlify zu haben, ist das kein Problem, solange kein einzelner Build länger als 30 Minuten dauert (das Maximum, bevor er abbricht).
Wenn Sie Netlify mit Anfragen für viele Builds überfluten, sind die Build-Bots schlau genug, um alle Anfragen zu ignorieren, die nach dem aktuell laufenden Build in der Warteschlange stehen, mit Ausnahme der zuletzt in der Warteschlange stehenden. Nach dem Ausführen des aktuellen Builds werden alle anderen übersprungen und der endgültige Build ausgeführt.
Das ist nur ein weiterer Vorteil der Behandlung aller Deploys als in sich geschlossene und unveränderliche.
@bryan, @matt
Ja, Sie könnten tatsächlich eine Kombination aus Netlify's Honeypot-Filterung und reCAPTCHA-Unterstützung verwenden. Beides hilft bei der Reduzierung von Spam, bevor er die Lambda erreicht. Ich habe diese in diesem Beispiel nur der Einfachheit halber weggelassen, da bereits viele andere Mechanismen eingeführt wurden.
Ich persönlich lege Wert auf ein gewisses Maß an manueller Intervention irgendwo in der Moderationspipeline, stimme aber zu, dass es gut ist, so viel Automatisierung wie möglich auf dem Weg zu haben.