Google
の PageSpeed Insights の、
「次のリソースの HTML を縮小すると、サイズを 776 バイト(17%)削減できます。」という
ご提案に応えるため、django-htmlmin
をインストールして HTML
を圧縮してみます。
前提
以下の環境で実行しています。
* OS
CentOS release 6.7 (Final)
-
Python Version
Python 2.7.8 -
Package (必要そうなものだけ抜粋)
Django (1.9.6)
Mezzanine (4.1.0)
参考サイト
- cobrateam/django-htmlmin: HTML minifier for Python frameworks (not only Django, despite the name)
- Randall Degges - The Simplest Way to Compress HTML in Django
インストールと設定
インストール
-
command
pip install django-htmlmin ----------------------------------------------- Requirement already satisfied (use --upgrade to upgrade): beautifulsoup4 in /usr/local/lib/python2.7/site-packages (from django-htmlmin) Requirement already satisfied (use --upgrade to upgrade): html5lib in /usr/local/lib/python2.7/site-packages (from django-htmlmin) Requirement already satisfied (use --upgrade to upgrade): six in /usr/local/lib/python2.7/site-packages (from html5lib->django-htmlmin) Installing collected packages: argparse, django-htmlmin Successfully installed argparse-1.4.0 django-htmlmin-0.9.1 -----------------------------------------------
-
確認
pip list | grep django-htmlmin ----------------------------------------------- django-htmlmin (0.9.1) -----------------------------------------------
settings.py
の MIDDLEWARE_CLASSES
に追記
当ブログは、django-request
を使用しているため、
request.middleware.RequestMiddleware
を一番上に記載しました。
※ログ書き込んでるミドルウェアなので、ライフサイクルの外で一番最初に書くよね
と云う判断です。
また、GZip middleware
はセキュリティホールがあるから、気をつけて使ってねと、
こちらに記載があったので、使っておりません。
- Cache 関連のミドルウェアを使っていない場合
# other middleware classes
'htmlmin.middleware.HtmlMinifyMiddleware',
'htmlmin.middleware.MarkRequestMiddleware',
- Cache 関連のミドルウェアを使っている場合
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
'htmlmin.middleware.HtmlMinifyMiddleware',
# other middleware classes
'django.middleware.cache.FetchFromCacheMiddleware',
'htmlmin.middleware.MarkRequestMiddleware',
)
- Cache 関連のミドルウェアを使っていて、且つ、
django-request
を使っている場合
IDDLEWARE_CLASSES = (
# django-request をtopに記述
"request.middleware.RequestMiddleware",
"mezzanine.core.middleware.UpdateCacheMiddleware",
"htmlmin.middleware.HtmlMinifyMiddleware",
# other middleware classes
"mezzanine.pages.middleware.PageMiddleware",
"mezzanine.core.middleware.FetchFromCacheMiddleware",
"htmlmin.middleware.MarkRequestMiddleware"
)
RequestMiddleware
は1番最後に実行されます。
HTML_MINIFY
の設定
DEBUG
モードの設定で、切り替わるようなので、未設定にしておきます。
DEBUG = True
の場合、 HTML_MINIFY = False
、
DEBUG = False
の場合、 HTML_MINIFY = True
、になります。
EXCLUDE_FROM_MINIFYING
の設定
HTML
圧縮の対象外にするディレクトリを指定します。
README.rst
の通り、 ADMIN
のURL
を設定します。
EXCLUDE_FROM_MINIFYING = ('^admin/','^ja/admin/','^admin_keywords_submit')
^admin_keywords_submit
について
mezzanine
で blog
投稿を行う際、上記 URL
に ajax
リクエストを送信しているようです。
上記を設定しないと、以下のようなエラーが出力され、blog
投稿が失敗します。
invalid literal for int() with base 10: '<html><head></head><body>'
KEEP_COMMENTS_ON_MINIFYING
の設定
デフォルト動作だと、HTML内のコメントは全て削除するようです。
削除したくない時は、以下のように
KEEP_COMMENTS_ON_MINIFYING
を True
に設定します。
KEEP_COMMENTS_ON_MINIFYING = True
これで設定は完了です。
HTTP
サーバの再起動で HTML
圧縮が行われるようになります。
HTMLの圧縮要領の説明
出力された HTML
全ての改行を除去とかするわけではなく、
それなりに「いい感じ」でサイズを小さくしてくれます。
pre
タグ、script
タグ、 textarea
タグ内は、スペースも改行も除去しない。
htmlmin/minify.py
内に以下のように記載されています。
EXCLUDE_TAGS
に含まれるタグは、スペース、改行の除去がスキップされるようです。
EXCLUDE_TAGS = set(["pre", "script", "textarea"])
<!–[if lt IE 9]> 等の条件付きコメントは除去しない
htmlmin/minify.py
内に以下のように記載されています。
条件付きコメントはKEEP_COMMENTS_ON_MINIFYING
が False
の場合でも、
除去されません。
# see http://en.wikipedia.org/wiki/Conditional_comment
re_cond_comment = re.compile(r'\[if .*\]>.*<!\[endif\]',
re.MULTILINE | re.DOTALL | re.UNICODE)
re_cond_comment_start_space = re.compile(r'(\[if .*\]>)\s+',
re.MULTILINE | re.DOTALL | re.UNICODE)
re_cond_comment_end_space = re.compile(r'\s+(<!\[endif\])',
re.MULTILINE | re.DOTALL | re.UNICODE)
適用後、いくつかページを確認したところ、
問題なく表示はできているようです。
issues を見ると、
パターンによってはうまく動作しないケースも記載もあるようなので、
ページ構成によって、使える使えないはあるのかもしれません。
HTML
圧縮後の PageSpeed Insights
の得点 について
HTML
圧縮後のPageSpeed Insights の得点は、
下がります。。
条件付きコメント部が、以下のように圧縮されますが、
<script src="/static/CACHE/js/4462284b3590.js" type="text/javascript"></script><!--[if lt IE 9]><script src="/static/js/html5shiv.js"></script> <script src="/static/js/respond.min.js"></script><![endif]--></head>
PageSpeed Insights
は条件付きコメント内の記載も読み込みにいってそうな挙動をしています。Chrome
だと、うまく認識しているので圧縮はしておくで以上です。
コメント