M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

Mojolicious::LiteでCSSをHTML自体に埋め込む

Mojolicious::LiteでCSSをいつものように外部ファイルとしてlinkすると、CGIとして動かしたときにCGI複数回走ってしまい、負荷が高くなるので、昔のi-modeページみたいにHTML自体にCSSを埋め込むことをやります。

戦略としては、Mojolicious::Liteの教科書通りCSSファイルとしてstyles.css に書いて %= stylesheet url_for('/public/styles.css') でlinkする、というのはやらないで、styles.css.html.ep にHTMLとして書いて、HTMLとしてIncludeします。

なお、Mojolicious::Liteは、ファイルとして配置せずに一つのファイル内にまとめてしまえるので便利です(__DATA__以降の@@ 行で指定します)。

#!/usr/bin/perl

use 5.010; # Mojolicious 1.9.8以降はPerl 5.10対応
use Mojolicious::Lite;
use utf8;

# ROOT
get '/' => sub {
  my $self = shift;
} => 'index';

app->start;

__DATA__

@@ index.html.ep
% layout 'default', title=>'テストページ';
      <section>
        <h1>Mojolicious::Lite CSS 埋め込みテスト</h1>
        <p>本文です。</p>
      </section>

@@ layouts/default.html.ep
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title><%= title %></title>
    <%= include 'styles.css' =%>
  </head>
  <body>
    <div>
      <%= content =%>
    </div>
  </body>
</html>

@@ styles.css.html.ep
  %# Yahoo UI Font Size
  %# ----------------
  %# |  px  |   %   |
  %# |--------------|
  %# |  10  |  77   |
  %# |  11  |  85   |
  %# |  12  |  93   |
  %# |  13  | 100   |
  %# |  14  | 108   |
  %# |  15  | 116   |
  %# |  16  | 123.1 |
  %# |  17  | 131   |
  %# |  18  | 138.5 |
  %# ----------------
  %= stylesheet 'http://yui.yahooapis.com/3.8.1/build/cssreset/cssreset-min.css'
  %= stylesheet 'http://yui.yahooapis.com/3.8.1/build/cssfonts/cssfonts-min.css'
  %= stylesheet begin
  /* styles.css.html.ep 共通CSS */
  body {
    margin: 20px;
  }
  h1 {
    background-color: #ffc1c1;
    font-size: 138.5%;
    margin: 16px 0px;
    padding: 16px;
    color: #93252a;
    font-weight: bold;
    border-radius: 4px;
    text-shadow: 0 0 0 transparent, 1px 1px 0 #fff;
  }
  %= end

上記プログラムをCGIを通して実行するとこんな感じになります……

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>テストページ</title>
    <link href="http://yui.yahooapis.com/3.8.1/build/cssreset/cssreset-min.css" media="screen" rel="stylesheet" />
    <link href="http://yui.yahooapis.com/3.8.1/build/cssfonts/cssfonts-min.css" media="screen" rel="stylesheet" />
    <style>/*<![CDATA[*/

    /* styles.css.html.ep 共通CSS */
    body {
      margin: 20px;
    }
    h1 {
      background-color: #ffc1c1;
      font-size: 138.5%;
      margin: 16px 0px;
      padding: 16px;
      color: #93252a;
      font-weight: bold;
      border-radius: 4px;
      text-shadow: 0 0 0 transparent, 1px 1px 0 #fff;
      position: relative;
    }
    
/*]]>*/</style>
        
  </head>
  <body>
    <div>
      <section>
        <h1>Mojolicious::Lite CSS 埋め込みテスト</h1>
        <p>本文です。</p>
      </section>
    </div>
  </body>
</html>

1回のCGI実行で、CSSまで埋め込まれます。ブラウザ側からのHTTPのリクエストも減ります。副次的なメリットとして、HTMLに出力されないコメント行表記 %# が使えるので便利だと思います。