@dan_farrell
В Go есть пакет compress
для работы с компрессией данных. Вы можете использовать этот пакет для компрессии js/css файлов.
Пример компрессии JS файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package main import ( "compress/gzip" "io" "os" ) func main() { // Открываем исходный js файл file, err := os.Open("script.js") if err != nil { panic(err) } defer file.Close() // Создаем выходной gzip файл outFile, err := os.Create("script.js.gz") if err != nil { panic(err) } defer outFile.Close() // Создаем gzip writer gzWriter := gzip.NewWriter(outFile) defer gzWriter.Close() // Копируем данные из исходного файла в gzip writer _, err = io.Copy(gzWriter, file) if err != nil { panic(err) } } |
Пример компрессии CSS файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package main import ( "compress/gzip" "io" "os" ) func main() { // Открываем исходный css файл file, err := os.Open("styles.css") if err != nil { panic(err) } defer file.Close() // Создаем выходной gzip файл outFile, err := os.Create("styles.css.gz") if err != nil { panic(err) } defer outFile.Close() // Создаем gzip writer gzWriter := gzip.NewWriter(outFile) defer gzWriter.Close() // Копируем данные из исходного файла в gzip writer _, err = io.Copy(gzWriter, file) if err != nil { panic(err) } } |
Эти примеры открывают исходный файл, создают gzip файл и копируют данные из исходного файла в gzip writer.
@dan_farrell
Дополнительно к использованию пакета compress/gzip
, также можно воспользоваться пакетом net/http
для создания HTTP-обработчика, который будет возвращать скомпрессированные файлы. Ниже приведен пример кода, демонстрирующий компрессию JS и CSS файлов через HTTP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package main import ( "compress/gzip" "io" "net/http" "os" ) func compressHandler(w http.ResponseWriter, r *http.Request) { // Открываем исходный файл в зависимости от запроса var filename string if r.URL.Path == "/script.js" { filename = "script.js" w.Header().Set("Content-Type", "application/javascript") } else if r.URL.Path == "/styles.css" { filename = "styles.css" w.Header().Set("Content-Type", "text/css") } else { http.NotFound(w, r) return } file, err := os.Open(filename) if err != nil { http.Error(w, "Error reading file", http.StatusInternalServerError) return } defer file.Close() // Установим заголовок Content-Encoding для указания компрессии w.Header().Set("Content-Encoding", "gzip") // Создаем gzip writer на основе ResponseWriter gz := gzip.NewWriter(w) defer gz.Close() // Копируем данные из открытого файла в gzip writer _, err = io.Copy(gz, file) if err != nil { http.Error(w, "Error compressing file", http.StatusInternalServerError) return } } func main() { // Определяем обработчик для компрессии файлов и запускаем HTTP-сервер http.HandleFunc("/script.js", compressHandler) http.HandleFunc("/styles.css", compressHandler) http.ListenAndServe(":8080", nil) } |
Этот код создает HTTP-сервер, который обрабатывает запросы для /script.js
и /styles.css
, компрессирует соответствующие файлы и отправляет скомпрессированные данные обратно клиенту с заголовком Content-Encoding: gzip
.
Чтобы протестировать код, запустите сервер, перейдите в ваш браузер и выполните запросы к http://localhost:8080/script.js
и http://localhost:8080/styles.css
, чтобы получить скомпрессированные файлы.