Bevor wir über HTTP/2-Server-Push sprechen, müssen wir zunächst wissen, dass HTTP/2 darauf ausgelegt ist, viele Mängel von HTTP/1.x zu beheben. Moderne Webseiten nutzen viele Ressourcen: HTML, Stylesheets, Skripte, Bilder und so weiter. In HTTP/1.x muss jede dieser Ressourcen explizit angefordert werden. Dies kann ein langsamer Prozess sein. Der Browser ruft also zunächst den HTML-Code ab und erhält dann schrittweise weitere Ressourcen, während er die Seite analysiert und auswertet. Da der Server darauf warten muss, dass der Browser jede Anfrage stellt, ist das Netzwerk oft inaktiv und wird nicht ausreichend genutzt.
Um die Latenz zu verbessern, hat HTTP/2 Server-Push eingeführt, der es dem Server ermöglicht, Ressourcen an den Browser zu pushen, bevor der Browser sie explizit anfordert. Ein Server weiß oft, dass eine Seite viele zusätzliche Ressourcen benötigt und kann mit dem Pushen dieser Ressourcen beginnen, wenn er auf die erste Anfrage des Browsers antwortet. Dadurch kann der Server ein potenziell inaktives Netzwerk vollständig nutzen und so die Seitenladezeiten verbessern.
serverpush.svg.png
Auf der Protokollebene wird HTTP/2-Server-Push durch push_promise-Frames gesteuert Ein PUSH_PROMISE beschreibt eine Anfrage, also serverseitiges prädiktives Browsing . Der Server stellt die Anfrage sofort aus. Sobald der Browser das PUSH_PROMISE empfängt, weiß er sofort, dass der Server diese Ressource übertragen wird. Wenn der Browser später feststellt, dass er die Ressource benötigt, wartet er, bis der Push abgeschlossen ist, anstatt eine neue Anfrage zu senden. Dies reduziert die Zeit, die der Browser damit verbringt, auf das Netzwerk zu warten.
Server-Push im Net/http-Paket go1.8 führt Unterstützung für Push-Antworten von http.Server ein. Diese Funktion ist verfügbar, wenn der laufende Server ein HTTP/2-Dienst ist und eingehende Verbindungen HTTP/2 verwenden. In jedem HTTP-Handler können Sie feststellen, ob http.ResponseWriter Server-Push unterstützt, indem Sie prüfen, ob er die neue http.Pusher-Schnittstelle implementiert. Wenn der Server beispielsweise weiß, dass app.js zum Rendern der Seite angefordert wird, kann der Handler einen Push initiieren, wenn http.Pusher verfügbar ist.http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if pusher, ok := w.(http.Pusher); ok { // Push is supported. if err := pusher.Push("/app.js", nil); err != nil { log.Printf("Failed to push: %v", err) } } // ... })
Andere verwandte Artikel!
Verwandte Lektüre:Wie sieht die JS-Engine aus, wenn sie ausgeführt wird?
Wie natives JS AJAX und JSONP implementiert
So passen Sie das Konsolenobjekt bei Verwendung von JS an
Das obige ist der detaillierte Inhalt vonÜber HTTP/2-Server-Push. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!