PR

HTMLをminifyしてサイトの読み込み速度を上げる

Web制作を学ぶ

こんにちは。Webサイトの表示速度を上げることは、ユーザーの離脱率低下のために重要だと考えられています。

特にLPのような直接的にユーザーの行動を促すページにおいては特に重要で、普通のサイトではやらないような細かいテクニックも使われることがあります。

今回はその中でもHTMLファイルのminify、圧縮を紹介しようと思います。

結論

最も簡単にやるには、以下のコマンドを実行すればminifyしたHTMLが出力されます。

mkdir -p dist && npx html-minifier-terser src/index.html \
  --collapse-boolean-attributes \
  --collapse-whitespace \
  --remove-comments \
  --remove-redundant-attributes \
  --use-short-doctype \
  --remove-attribute-quotes \
  --minify-css true \
  --minify-js true \
  -o dist/index.html

src/index.htmlがminifyしたいファイル、-o dist/index.htmlがminifyしたものをどこに出力するかを指定しています。distフォルダが存在しないとファイルが作れないのでmkdir -p distで先に作成しています。それ以外はオプションです。minifyしたいファイルや出力先を変更したい場合はここを変えてください。

コードの内容にもよりますがこれで3割程度の容量削減になります。手元のコードでころ74KBが52KBに減りました。

ただし、実際の読み込み速度への影響はかなり小さいと思われます。実際に確認してみてもせいぜい数ミリ秒〜十数ミリ秒の変化しかなく、ネットワーク状況でのブレの方がよっぽど大きいです。

また、オプションをよく理解して使わないとコードが壊れる可能性もあります。他に優先度の高い改善点を済ませてから慎重に行うのが良さそうです。

解説

HTMLのminifyにはいくつか方法があります。主に以下の3つ。

フレームワークなどを使っている場合は基本勝手にやってくれている、もしくは設定で行えることが多いのでそれに任せましょう。

頻度が少なければブラウザツールでもいいんですが、前述の通り近年はHTMLのminifyは下火のようでツールがあまりメンテナンスされていないようです。

ライブラリの方は色々調整が効きやすいのでおすすめかなと思い、この記事で解説していきます。

html-minifier-terserでminifyする

いくつかライブラリはあるんですが、人気やメンテナンス状況を鑑みてhtml-minifier-terserを紹介します。基本の使い方は以下のコマンド。

npx html-minifier-terser ./index.html  -o output.html

こうするとminifyが実行されてoutput.htmlが出力されます。

ただしオプションを指定しないとほぼ何も起こりません。いくつかおすすめのオプションがあるのでそちらをつけましょう。

–collapse-boolean-attributes

真偽値属性の値を省いて属性名だけにします。

<!-- Before -->
<input type="checkbox" checked="checked" />

<!-- After -->
<input type="checkbox" checked/> 

–collapse-whitespace

文章ツリーに影響しない余分な空白・改行をまとめます。要するにHTMLの改行を除去し1行にするということで、一般的なminifyのイメージを実現しているのはこれです。

<!-- Before -->
<ul>
  <li>Sample</li>
</ul>

<!-- After -->
<ul><li>Sample</li></ul>

–remove-comments

コメントを削除します。

<a href="example.com"> <!-- hrefは変更の可能性 -->
  リンク 
</a>

↓

<a href="example.com">
  リンク 
</a>

–remove-redundant-attributes

デフォルトの値と一致する属性の記述を削除します。

<!-- Before -->
<form action="" method="get">
  <input type="text" />
</form>

<!-- After -->
<form action="">
  <input>
</form>

–use-short-doctype

今時はあまり見かけませんが、古いHTMLなどでのDOCTYPE宣言をHTML5に準拠させます。

<!-- Before -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!-- After -->
<!doctype html>

–remove-attribute-quotes

可能な場合に属性値を囲う引用符を削除します。

<!-- Before -->
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Document</title>
  </head>
  <body></body>
</html>

<!-- After -->
<html lang=ja>
  <head>
    <meta charset=UTF-8>
    <meta name=viewport content="width=device-width,initial-scale=1">
    <title>Document</title>
  </head>
  <body></body>
</html>

–minify-css true

HTML上のstyleタグ、もしくは各要素のstyle属性内のCSSをminifyします。内部的にはclean-cssというライブラリを使っているようです。

<!-- Before -->
<style>
  body * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }
</style>

<!-- After -->
<style>body *{box-sizing:border-box;margin:0;padding:0}</style>

今回の例では単にtrueを指定していますが、clean-cssの設定項目を渡すことで細かく制御可能です。

–minify-js true

HTML内のscriptタグ、もしくは各要素のイベント属性内のJavaScriptをminifyします。内部的にはterserというライブラリを使っているようです。

<!-- Before -->
<script>
  const a = 1
  const b = 2
  const c = a + b
  console.log(c)
</script>

<!-- After -->
<script>const a=1,b=2,c=3;console.log(3)</script>

コードを見るとわかるように、内容を解釈して処理内容を変える挙動をする場合があるようです。

今回の例では単にtrueを指定していますが、terserの設定項目を渡すことで細かく制御可能です。

これらを丸っと設定したコマンドがこちら。こちらをコピペしてファイル指定の部分だけ自分の環境に合わせてもらえればOKです。

mkdir -p dist && npx html-minifier-terser src/index.html \
  --collapse-boolean-attributes \
  --collapse-whitespace \
  --remove-comments \
  --remove-redundant-attributes \
  --use-short-doctype \
  --remove-attribute-quotes \
  --minify-css true \
  --minify-js true \
  -o dist/index.html

設定ファイルを用意して管理する

毎回上記コマンドを使うのでもいいんですが、設定ファイルを用意すると管理面やより複雑な設定がしたい時に便利です。次のようなjsonファイルを作ってください。

{
  "collapseBooleanAttributes": true,
  "collapseWhitespace": true,
  "removeComments": true,
  "removeRedundantAttributes": true,
  "useShortDoctype": true,
  "removeAttributeQuotes": true,
  "minifyCSS": true,
  "minifyJS": true
}

コマンドの場合はオプション名をハイフン繋ぎ(ケバブケース)で書きますが、設定ファイルの場合は大文字繋ぎ(キャメルケース)で書くので注意してください。

この時は以下のコマンドを使います。-cオプションで設定ファイルを指定してください。

npx html-minifier-terser src/index.html \
  -o dist/index.html \
  -c config.json

まとめ:ご利用は計画的に

ということでHTMLのminify方法でした。まあ正直リスクリターンが釣り合ってるか怪しい部分もありますので、よく考えて行うのが良いでしょう。

もっと効果が高く安全なパフォーマンス改善ポイントもたくさんあります。そちらを優先して対応し、余力があったら行うくらいがいいのではないでしょうか。

この記事を書いた人
小林 秀樹

Web制作フリーランス9年目|ディレクター・フロントエンドエンジニア
「世界一初心者に優しい」→セカヤサ。

コーポレートサイトやLP、メディア立ち上げまで幅広く対応。コーディングを軸に、UX設計・SEOライティング・サイト運用まで一貫対応。

法律系オウンドメディア立ち上げ支援では、特定のキーワードでのSEO1位を実現し問い合わせ獲得に貢献。また大手専門学校サイトの大規模リニューアル(100ページ超)でのディレクションと実装の両面の経験あり。

最近では、AIツールによる自社サービスUI制作や、ChatGPTを活用した記事執筆フローの構築など、AI時代に対応した制作手法の実践にも注力している。

zenn:
https://zenn.dev/hideki_climax

制作実績:
https://tan-band-c66.notion.site/37abe7077b184b338fd8f53f6873ca1d

小林 秀樹をフォローする
Web制作を学ぶ
スポンサーリンク
シェアする
小林 秀樹をフォローする

コメント

タイトルとURLをコピーしました