Моя первая идея состояла в том, чтобы получить тело ответа внутри фильтра, а затем использовать одну из minify библиотек, таких как tdewolff/minify и write to response, но я не могу найти способ получить тело ответа. Есть ли лучшие решения?Как выполнить html minify с Revel framework
ответ
Кажется, взглянув на документы, фильтр может получить доступ к типу Controller
, который содержит Response
. Этот ответ содержит Out
, который является ResponseWriter (и, следовательно, также io.Writer). Нам нужно заменить только метод Write, чтобы перенаправить запись в minifier, который затем записывается в автоответчик. Для этого нам нужно использовать io.Pipe
и goroutine.
type MinifyResponseWriter struct {
http.ResponseWriter
io.Writer
}
func (f MinifyResponseWriter) Write(b []byte) (int, error) {
return f.Writer.Write(b)
}
func MinifyFilter(c *Controller, fc []Filter) {
pr, pw := io.Pipe()
go func(w io.Writer) {
m := minify.New()
m.AddFunc("text/css", css.Minify)
m.AddFunc("text/html", html.Minify)
m.AddFunc("text/javascript", js.Minify)
m.AddFunc("image/svg+xml", svg.Minify)
m.AddFuncRegexp(regexp.MustCompile("[/+]json$"), json.Minify)
m.AddFuncRegexp(regexp.MustCompile("[/+]xml$"), xml.Minify)
if err := m.Minify("mimetype", w, pr); err != nil {
panic(err)
}
}(c.Response.Out)
c.Response.Out = MinifyResponseWriter{c.Response.Out, pw}
}
Что-то вдоль этих линий (не проверено). Здесь мы берем входящий io.Writer
(который является частью ResponseWriter
) и обертываем вокруг него структуру. Он сохраняет исходные методы для автоответчика, но метод Write переопределяется для замены на PipeWriter
. Это означает, что любая запись в новую запись ответа идет на PipeWriter
, которая связана с PipeReader
. Minify Читает от этого читателя и пишет первому автору ответа.
Поскольку мы меняем значение c.Response.Out
, мы должны передать его явно в goroutine. Убедитесь, что вы получили правильный тип mimetype (через расширение?) Или напрямую вызываете соответствующую функцию minify.
- 1. Minify PHP/html code
- 2. Revel framework кэширует статические файлы?
- 3. Browserify + vue + HTML minify
- 4. Перейти программирование кросс-компиляции для revel framework
- 5. Объединение файлов css в revel go framework
- 6. Cloudflare minify html и gzip
- 7. Minify Html output приложения ASP.NET
- 8. minify frontend с minify-maven-plugin
- 9. Как удалить значение из сеанса с revel
- 10. Любая хорошая реализация Zend Framework + Minify?
- 11. Относительные пути в шаблоне revel
- 12. Golang revel framework hot-reload in docker environment
- 13. Шаблоны макетов в revel
- 14. Как использовать сеанс с рамой golang revel
- 15. Revel Framework - Go Lang - Не удается найти контроллер
- 16. Minify XML с Рубином
- 17. Программно определить, есть ли в производстве в revel framework
- 18. Wordpress minify html только на главной странице
- 19. Можно ли отключить «minify-cation» с помощью Minify?
- 20. Как использовать Minify PHP с компрессором YUI?
- 21. Как получить местоположение текущего файла в revel
- 22. MobileWeb - не minify
- 23. Grunt minify inline css
- 24. Шаблон двигателя шаблона Golang/Revel с переменной
- 25. Minify Inline-JavaScript с PHP
- 26. ExtJs minify Gets игнорируется
- 27. Revel приложение с местными пакетами в Heroku
- 28. Revel - Сохранение объекта в сеансе
- 29. как отлаживать журнал сбоя сборки revel?
- 30. Не удается установить Revel (непризнанный путь импорта)
работает в Firefox, но Chrome не показывает страницу с ошибкой net :: ERR_CONTENT_LENGTH_MISMATCH. Пытался вставить фильтр до или после revel.CompressFilter без успеха. –
Я не уверен, как работает Ревель, но посмотрите на https://github.com/revel/revel/blob/master/compress.go#L46, кажется, что вам нужно удалить заголовок длины содержимого, чтобы он пересчитывается? –
Большое вам спасибо за вашу большую помощь и приятную библиотеку minify) Единственная проблема, которую я вижу, это бесконечные ошибки, такие как goroutine 45 [semacquire]: sync.runtime_Syncsemacquire (0xc82013aa00); /home/venom/gocode/src/github.com/tdewolff/buffer/shifter.go:75 после обновления страницы, как 10 раз –