Heim  >  Artikel  >  Backend-Entwicklung  >  GoLang stellt .js.gz bedingt bereit, falls vorhanden, andernfalls .js

GoLang stellt .js.gz bedingt bereit, falls vorhanden, andernfalls .js

WBOY
WBOYnach vorne
2024-02-09 20:36:09328Durchsuche

GoLang 有条件地提供 .js.gz(如果存在),否则提供 .js

php-Editor Apple wies bei der Einführung von GoLang darauf hin, dass GoLang über eine interessante und praktische Funktion verfügt, nämlich dass bei der Bereitstellung von JavaScript-Dateien die .js.gz-Datei bedingt bereitgestellt wird (falls vorhanden), andernfalls wird sie bereitgestellt .js-Dateien. Diese Funktion kann die Dateigröße effektiv reduzieren, die Ladegeschwindigkeit von Webseiten verbessern und den Benutzern ein besseres Erlebnis bieten. Dieser intelligente Dateiauswahlmechanismus macht GoLang bei der Webentwicklung effizienter und flexibler. Egal, ob es sich um Front-End- oder Back-End-Entwicklung handelt, GoLang ist eine hervorragende Programmiersprache, die es wert ist, erkundet zu werden.

Frageninhalt

Mein Hintergrund liegt hauptsächlich im Bereich React/Frontend, aber ich wurde damit beauftragt, die Leistung unserer React-Webanwendung zu verbessern, die mit GoLang bereitgestellt und mithilfe des aws sdk for Go-Dokuments aus S3 abgerufen wird. Ich habe Webpack so konfiguriert, dass es seinen Job erledigt und so viele seiner Optimierungsfunktionen wie möglich nutzt, einschließlich der Verwendung seines Komprimierungs-Plugins, um gzip-komprimierte .js.gz-Dateien zusammen mit den .js-Dateien im auf S3 bereitgestellten Bundle zu erstellen.

Meine Frage ist: Gibt es in Go und aws sdk eine Möglichkeit, beim Abrufen einer Datei aus einem S3-Bucket zunächst festzustellen, ob eine gzip-komprimierte Form der Datei vorhanden ist, und dann die Datei abzurufen, wenn nicht, dann die reguläre Datei? Ist dies der beste Weg, dieses Problem zu lösen? Ich weiß, dass es in Go eine Bibliothek für die Laufzeitkomprimierung gibt, aber es scheint effizienter zu sein, die Komprimierung im Voraus durchzuführen.

Der Go-Serverteil ist sehr klein und verfügt über eine Funktion zum Abrufen von Bucket-Dateien, die im Grunde einen S3-Client erstellt und dann die getObject-Methode auf diesem Client verwendet, um den Inhalt dieses Buckets abzurufen, und dann die .write-Methode von http verwendet, die den Text enthält dieses Inhalts.

Lösung

Ja, es ist möglich, die komprimierte Version direkt zu versenden.

Hier ist ein Beispiel:

package main

import (
    "fmt"
    "net/http"
    "strings"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func getFileFromS3(bucket, key string, w http.ResponseWriter, r *http.Request) error {
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("your-region"),
        // Add other necessary configurations
    })
    if err != nil {
        return err
    }

    client := s3.New(sess)

    // Check if gzipped version exists
    gzKey := key + ".gz"
    _, err = client.HeadObject(&s3.HeadObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(gzKey),
    })
    if err == nil {
        // Gzipped version exists, fetch and serve directly
        obj, err := client.GetObject(&s3.GetObjectInput{
            Bucket: aws.String(bucket),
            Key:    aws.String(gzKey),
        })
        if err != nil {
            return err
        }
        defer obj.Body.Close()

        // Set appropriate headers
        w.Header().Set("Content-Encoding", "gzip")
        w.Header().Set("Content-Type", "application/javascript") // Set the appropriate content type

        // Copy the gzipped content directly to the response
        _, err = fmt.Fprint(w, obj.Body)
        return err
    }

    // Gzipped version doesn't exist, fetch the regular version
    obj, err := client.GetObject(&s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    })
    if err != nil {
        return err
    }
    defer obj.Body.Close()

    // Set appropriate headers
    w.Header().Set("Content-Type", "application/javascript") // Set the appropriate content type

    // Copy the regular content directly to the response
    _, err = fmt.Fprint(w, obj.Body)
    return err
}

func handler(w http.ResponseWriter, r *http.Request) {
    // Extract the file key from the request URL or any other way you have it
    fileKey := "your-file-key"

    // Set appropriate cache headers, handle CORS, etc.

    // Fetch the file from S3
    err := getFileFromS3("your-s3-bucket", fileKey, w, r)
    if err != nil {
        // Handle error, e.g., return a 404 or 500 response
        http.Error(w, "Internal Server Error", http.StatusInternalServerError)
        return
    }
}

func main() {
    http.HandleFunc("/your-endpoint", handler)
    http.ListenAndServe(":8080", nil)
}

Das obige ist der detaillierte Inhalt vonGoLang stellt .js.gz bedingt bereit, falls vorhanden, andernfalls .js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen