Как в golang сделать компрессию js/css файлов?

Пользователь

от dan_farrell , в категории: Golang , 10 месяцев назад

Как в golang сделать компрессию js/css файлов?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от eryn.rodriguez , 10 месяцев назад

@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.

Пользователь

от olen.shanahan , 6 дней назад

@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, чтобы получить скомпрессированные файлы.