2017年5月1日月曜日

HTML最小化ツール tdewolff/minify は凄いかも

HTML最小化は今までhtml-minifierを使っていたのですが、MinifyというライブラリがHugoに採用されるかもという話があり注目しました。

実行時間が非常に短いらしいのでさっそく軽く実行時間をテストしてみます。事前にGo言語を用意し、Minifyを以下のコマンドでインストール。html-minifierのインストール方法は長くなるので公式を参照頂くとして割愛します。
$ go get github.com/tdewolff/minify/cmd/minify

例によって検証用スクリプトを軽く組んでみました。
dir = ARGV[0]

def html_minifier(from, to)
  cmd = <<-CMD
  html-minifier #{from} \
    --collapse-boolean-attributes \
    --collapse-whitespace \
    --remove-attribute-quotes \
    --remove-comments \
    --remove-empty-attributes \
    --remove-redundant-attributes \
    --remove-script-type-attributes \
    --remove-style-link-type-attributes \
    --html5 \
    --use-short-doctype \
    --minify-js \
    --minify-css > #{to}
  CMD
  `#{cmd}`
end


minify_size = html_minifier_size = original_size = 0
minify_time = html_minifier_time = 0

files = Dir.glob("#{dir}/**/*.html").each {|file|
  original_size += File.size(file)

  t = Time.now
  `minify #{file} > #{file}.min`
  t = Time.now - t
  minify_size += File.size("#{file}.min")
  minify_time += t

  t = Time.now
  html_minifier(file, "#{file}.min")
  t = Time.now - t
  html_minifier_size += File.size("#{file}.min")
  html_minifier_time += t
}

puts "file num: #{files.length}"
puts "original:      #{original_size} bytes"
puts "Minify:        #{minify_size} bytes, #{minify_time} sec"
puts "html-minifier: #{html_minifier_size} bytes, #{html_minifier_time} sec"

軽く確認しただけでも凄い結果です。Minifyは非常に高速に動作する上に圧縮率も良いです。検証にはGo-1.8.1 + Minify-2.1.0、Node.js-7.8.0 + html-minifier-3.0.2を使用してます。html-minifierはちょっと古めですがご容赦ください。
$ ruby test.rb test_dir
file num: 93
original:      1716365 bytes
Minify:        1477416 bytes, 1.4351485620000002 sec
html-minifier: 1497892 bytes, 70.05997373700002 sec

これだけ高速に動作するならページ数が多少多くてもMinifyでHTML最小化→gzip/brotliで圧縮配信する価値がありそうです。 HTML最小化→gzip/brotliの効果はこちら。 html-minifier→zopfliをMinify→brotliにしたら半日掛かっていたバッチが30分以下になり、体感でもわかるくらいページ読み込みが早くなりました。

0 件のコメント: