Stellen Sie es von einer Firebase-Funktion auf Firebase-Hosting bereit

8

Ist es möglich, statische Assets von einer Firebase-Funktion auf dem Firebase-Hosting bereitzustellen?

Anwendungsfall: Ein Blog mit statischen HTML-Dateien. Blog-Inhalte und Meta-Informationen würden in der Datenbank gespeichert (Inhalt als Markdown). Beim Veröffentlichen oder Aktualisieren wird eine Firebase-Funktion ausgelöst, die den Markdown analysiert und eine statische HTML-Datei für den Blog-Post generiert und diese an das Firebase-Hosting verteilt. Nach der Bereitstellung speichert die Funktion die Live-URL in der Datenbank.

Wäre dieser Workflow möglich? In der aktuellen Dokumentation kann ich nichts über die Bereitstellung von Funktionen finden.

Als Workaround könnte ich mir ein Setup mit travis-ci vorstellen. Die Funktion löst eine Wiederherstellung auf travis aus, travis erstellt die statischen Assets und stellt sie zum Firebase-Hosting bereit, aber das scheint ein großer Aufwand zu sein.

Ich könnte den Markdown-Inhalt auch aus der db ziehen und auf dem Client aufbauen, aber ich versuche wirklich, den statischen Dateiansatz aus Gründen der anfänglichen Ladezeit auszuprobieren.

    
phippu 22.03.2017, 08:51
quelle

1 Antwort

1

Ich wollte das schon lange machen, und es scheint, als ob die Firebase-Funktionen Hosting-Integration ... naja, wir können immer noch nicht genau das machen, was wir wollen. Aber wir können schließen !

Wenn Sie den obigen Beitrag lesen, können Sie sehen, wie wir die firebase.json URLs so umleiten können, dass sie auf eine Firebase-Funktion verweisen, die die Seite aus Markdown erstellen kann, die in Firebase gespeichert ist an den Kunden.

Die Sache ist, das passiert bei jeder GET Anfrage für jede Seite. Was ist dumm (für eine weitgehend statische Seite wie ein typischer Blog). Wir möchten statische Seiten, die sofort verfügbar sind, ohne auf Funktionen warten zu müssen, um etwas generieren zu können (obwohl das sehr schnell geht). Wir können das mildern, indem wir den Header Cache-Control auf eine beliebig große Zahl mit dem Objekt response wie in

setzen

res.set('Cache-Control', 'public, max-age=600, s-maxage=31536000');

Was den Browser anweist, das Ergebnis für 10 Minuten zwischenzuspeichern, aber das CDN, um es für ein Jahr zwischenzuspeichern. Dies löst fast das Problem, dass vorgerenderte, sofort verfügbare Seiten für alle außer dem ersten Treffer gewünscht werden, was die Renderkosten verursacht. Außerdem kann das CDN Ihren zwischengespeicherten Inhalt verwerfen, wenn festgestellt wird, dass nicht genügend Datenverkehr vorhanden ist, um die Speicherung zu gewährleisten.

Näher kommen.

Aber wir sind nicht ganz da, wo wir sein müssen. Sagen Sie, Sie veröffentlichen Ihren Post und ein paar Tage später, bemerken Sie einen Tippfehler? Nun, ich denke du bist ziemlich abgespritzt. Ihr zwischengespeicherter Inhalt wird weiterhin für den Rest des Jahres bereitgestellt, es sei denn, Sie tun etwas wie:

Ändern Sie die URL des Posts - Dies ist wahrscheinlich eine schlechte Idee, da es jeden SEO tankt und Links zu der Seite, die bereits in der Wildnis sind, bricht.

Es kann einen Weg geben, das CDN zu aktualisieren, vielleicht indem Sie Ihren 'Blogpost veröffentlichen' Prozess so erweitern, dass er eine Javascript GET Anfrage mit etwas Seltsamem im Anfrage Header enthält, oder vielleicht gibt es eine Möglichkeit dies zu tun mit einer Firebase-Funktion, wann immer der Post aktualisiert wird. Hier bleibe ich stecken.

Firebase nutzt das Cloud-Plattform-CDN von Google, das einen Mechanismus für Cache-Ungültigmachung enthält weiß nicht, dass dies aus Funktionen leicht verfügbar ist - und selbst wenn dies der Fall ist, löst es immer noch nicht die Entfernung aus dem Cache.

Persönlich werde ich wahrscheinlich das Setup, das ich beschrieben habe, mit einem CDN-Cache-Alterslimit mittlerer Länge verwenden. Dies schlägt meine derzeitige Herangehensweise an das Senden von Markdown an den Client und das Rendern lokal mit (dem exzellenten) showdown.js, was immer noch sehr schnell ist, aber clientseitige Javascript und ein paar CPU-Zyklen erfordert.

Hoffentlich hat jemand eine Lösung dafür (oder jemand von der Firebase kann es verdrängen, von den Funktionen in die nächste Version zu hosten :)). Ich werde meine Antwort aktualisieren, wenn ich es genagelt bekomme.

    
qhoffman 23.05.2017 01:06
quelle