あーさーの備忘録

ゆっくり自由に生きてます

FuelPHPでHTMLソースを圧縮する

Pagespeed Insights

Web開発者なら自分のサイトをGooglePagespeed Insightsに突っ込んで点数を確認したことがあると思います。何も考えずにサイトを作るとかなり点数が低く出てびっくりしますよね。中には1点台のサイトもちらほらとありますから、そこまで気にすることはないんでしょうが…。せっかくだし、自分の作るサイトは100点目指したい!

ということで、FuelPHPを使ったサイトでPagespeed Insightsで100点を取るシリーズ第1弾「FuelPHPでHTMLソースを圧縮する」です。

html-minifierの導入

viewのファイルを圧縮してもよかったのですが、面倒だしtemplateもあるし…ということで、ライブラリを入れてみます。

zaininnariさんのhtml-minifierを使用します。普通はcomposerでインストール…というところですが、僕の開発環境の関係上、手動でのインストール方法を載せておきます。

  1. GitHub - zaininnari/html-minifierにアクセス
  2. Clone or download → Download ZIPでダウンロード&解凍
  3. srcの中にあるものをFuelPHPのAPPPATH/vendor/の中に入れる
  4. APPPATH/bootstrap.phpに以下のように追記

APPPATH/bootstrap.php

<?php
// Bootstrap the framework DO NOT edit this
require COREPATH.'bootstrap.php';

\Autoloader::add_classes(array(
    // Add classes you want to override here
    // Example: 'View' => APPPATH.'classes/view.php',
    /* ↓ここに追記↓ */
    'zz\Html\HtmlMinify' => APPPATH.'vendor/zz/Html/HTMLMinify.php',
    'zz\Html\HtmlNames' => APPPATH.'vendor/zz/Html/HTMLNames.php',
    'zz\Html\HtmlToken' => APPPATH.'vendor/zz/Html/HTMLToken.php',
    'zz\Html\HtmlTokenizer' => APPPATH.'vendor/zz/Html/HTMLTokenizer.php',
    'zz\Html\SegmentedString' => APPPATH.'vendor/zz/Html/SegmentedString.php',
));

これで、HtmlMinifyクラスのメソッドがControllerなどで使えるようになります。Packageにしとけばよかったかなぁ……。でも人が作ったものをPackageにして再配布っていうのもアレなのでPackageにしたい人は各自頑張ってください。

HTMLMinifyクラスを使う

圧縮したいページのControllerに追記します。

APPPATH/classes/controller/minifytest.php

<?php
class Controller_Minifytest extends Controller
{
    public function action_index()
    {
        return View::forge('minifytest');
    }

    public function after($response)
    {
        $response = parent::after($response);
        $response->body(zz\Html\HTMLMinify::minify($response->body(), array(
            'doctype' => 'html5',
            'optimizationLeval' => 1,
        )));
    }
}

これで、出力するHTMLが圧縮されます。Controller_Templateを使う場合も同様です。それなりのスペックのサーバーなら、この処理時間を考えても早く軽くなるかなぁと思います。

すべてのページに適応したい

これをすべてのControllerでいちいち書くのは大変なので、CoreのControllerを拡張します。

APPPATH/classes/controller.php

<?php
class Controller_Template extends Fuel\Core\Controller
{
    public $minify = false;

    public function after($response)
    {
        $response = parent::after($response);
        if ($this->minify === true)
        {
            $response->body(zz\Html\HTMLMinify::minify($response->body(), array(
                'doctype' => 'html5',
                'optimizationLevel' => 1,
            )));
        }
        return $response;
    }
}

これだけだと、まだCoreの方のControllerが呼び出されてしまうので、APPPATH/bootstrap.phpのオートローダの設定を編集します。

APPPATH/bootstrap.php

<?php
// Bootstrap the framework DO NOT edit this
require COREPATH.'bootstrap.php';

\Autoloader::add_classes(array(
    // Add classes you want to override here
    // Example: 'View' => APPPATH.'classes/view.php',
    'zz\Html\HtmlMinify' => APPPATH.'vendor/zz/Html/HTMLMinify.php',
    'zz\Html\HtmlNames' => APPPATH.'vendor/zz/Html/HTMLNames.php',
    'zz\Html\HtmlToken' => APPPATH.'vendor/zz/Html/HTMLToken.php',
    'zz\Html\HtmlTokenizer' => APPPATH.'vendor/zz/Html/HTMLTokenizer.php',
    'zz\Html\SegmentedString' => APPPATH.'vendor/zz/Html/SegmentedString.php',
    /* ↓追記↓ */
    'Controller' => APPPATH.'classes/controller.php',
));

これで、Controllerを拡張することができました。

ここまでできたら、Controllerで、

APPPATH/classes/controller/minifytest.php

<?php
class Controller_Minifytest extends Controller
{
    public $minify = true; //trueだと圧縮、falseや未定義だと非圧縮

    public function action_index()
    {
        return View::forge('minifytest');
    }
}

とすると、after()にいろいろ書かずに圧縮できます。public $minify = true;と書くだけ、簡単です。

ちなみに、Controller_Templateを拡張する場合は、APPPATH/classes/controller/template.phpを作成して同様に編集し、オートローダで読み込むようにするとできます。

次回予告

次回は、CSSJavascriptを圧縮・統合していきます。それでは。