<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>StyleStats &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/stylestats/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>「StyleStats」を活用してCSSを評価する、Evaluating CSS─Frontrend Conference</title>
		<link>/t32k/13504/</link>
		<pubDate>Fri, 06 Mar 2015 03:00:08 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[StyleStats]]></category>

		<guid isPermaLink="false">/?p=13504</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (5)本記事は、2015年2月21日に行われたFrontrend Conferenceの「Evaluating CSS」の内容を紹介します。 はじめに こんにちは、...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/frontrend/" class="series-251" title="Frontrend Conference 特集" data-wpel-link="internal">Frontrend Conference 特集</a> (5)</div><p>本記事は、2015年2月21日に行われた<a href="http://frontrend.github.io/conference/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Frontrend Conference</a>の「Evaluating CSS」の内容を紹介します。</p>

<h2>はじめに</h2>

<p><a href="https://speakerdeck.com/t32k/evaluating-css" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/01.png" alt="Evaluating CSS" /></a></p>

<p>こんにちは、<a href="https://twitter.com/t32k" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@t32k</a>です。今日はEvaluating CSSというタイトルでCSSの解析ツール、<a href="https://github.com/t32k/stylestats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats</a>に関して説明したいと思います。ちなみにEvaluateというのは『評価する、価値を見極める』といった意味の単語です。</p>

<p>宣伝ですが、今年から<a href="https://frontendweekly.tokyo/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Frontend Weekly</a>という無料のメールマガジンというか、海外の役立つリソースを紹介するウィークリーメールをやってますので、こちらも登録いただけると大変私嬉しいです。</p>

<h2>なぜCSSはそんなに難しいのか？</h2>

<p>では、まずなぜCSSはこんなに難しいのか考えてみましょう？いやいや、CSSってすごく、すごく単純ですよね。</p>

<p><img src="/wp-content/uploads/2015/03/02.png" alt="CSSの構造" /></p>

<p>こういったひとつのRuleがあります。divとsectionというSelectorがあります。その中にDeclarationをしていきます。DeclarationはPropertyとValueから成り立っています。</p>

<p>どうですか、これだけ見るには、すごく簡単ですよね。これのどこが難しいのでしょうか？ちょっと冷静に考えてみてください。ただ単純にCSSを書き連ねていくのは、誰でもできます。しかし、それのメンテンナンス性を維持しつつ、スケーラブル性も保ちながら管理していくのは非常に難しいです。</p>

<p>なぜならCSSにはスコープもなければ、抽象化する術も持たないので、どうしても冗長に書かざるを得なくなってしまいますし、現状はセレクタの命名規則でなんとかまかなうしかないのです。</p>

<p>JavaScriptサイドはよいですね。ES6などでどんどんと強力な機能が追加されていっています。しかし、CSSはプロパティは増えれども構造的にはなにも進化してません。SassなどのCSSプリプロセッサーなどは登場してきてますが、結局コンパイルしてしまえば、ただのCSSです。CSSには頑張ってほしいところです。</p>

<h3>CSSサイズファイルの増加</h3>

<p><img src="/wp-content/uploads/2015/03/03.png" alt="CSSのサイズの変遷" /></p>

<p>CSSは冗長的にしか書けませんので、時と共にじわじわと増加していきます。上記のグラフは、私が制作していたWebアプリケーションのデプロイ毎にCSSファイルサイズを記録しています。2回ほど大きく減少していますが、これは私が不慣れな書き方をしていたのをリファクタリングした結果でして、そのようなコードがなくなれば、あとはじわじわとファイルサイズが増加していくだけです。</p>

<p>私はこれが非常に怖い問題だと思っています。例えば、CSSのせいでレイアウトが崩れた！といったバグなどありますが、そういったものは探せば原因が見つかってすぐに直せます。たいした問題ではありません。しかし、このようにゆっくりとファイルサイズが増加していく場合は、それが問題だと認識しづらいという点が問題です。</p>

<p><a href="https://developers.google.com/web/fundamentals/performance/critical-rendering-path/index?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">クリティカルレンダリングパス</a>の観点から言えば、CSSファイルサイズがダウンロード・パースされるまでレンダリングはブロックされます。つまり、レンダリング遅延の問題が懸念されます。では表示遅延が問題（体感できるように）になってから、解決にリファクタリングしようとしても、スパゲッティ化したコードを一体どこから手を付けていいのかわからない状況に陥ります。</p>

<h3>デザインに依存</h3>

<p>また、CSSはデザインに大きく依存します。いくらあなたがスーパーCSSハッカーであろうとも、どうしようもないデザインをベースにコーディングすれば、どうしようもないスタイルシートができ上がります。</p>

<p><img src="/wp-content/uploads/2015/03/04.png" alt="Webデザインの3つのレイヤー" /></p>

<p><strong>Contents(HTML)</strong>、<strong>Presentation(CSS)</strong>、<strong>Behavior(JavaScript)</strong>といったWebデザインの3つのレイヤーがありますが、結局、HTML/CSSコーディングというのはビジュアルデザイン（PSD）から、ContentsとPresentationを分離させる作業ともいえます。</p>

<p>イレギュラーなデザインパターンを、CSS側で吸収するのは限度があります。そのため、最近ではページをデザインするのではなく、システムをデザインする考え方がよいです。つまり、ひとつひとつのコンポーネント（部品）から成り立つCSSであれば、部品を組み合わせることで、CSSの増加させずにさまざまなビジュアルパターンを制作することができます。</p>

<p>そのためには、スタイル（コンポーネント）ガイドのようなものを日常的に管理し、デザイナーとそれを参照しながらデザインをしてもらうといった制作スタイルも考えられます。</p>

<h3>CSSエンジニアになる</h3>

<p>しかしデザインもまた、突発的なデザイン変更やクライアントの希望などで、一貫性を保つことが難しい場合もあります。それを『デザイナーの責任だー！』と言っていれば、私たちはただのコーダーで終わるしかありません。私たち側でもよりよいものを作るために努力しなければなりません。</p>

<p>個人的にはエンジニアとはそういう存在だと思っています。だから私はCSSエンジニアになりたいと思いました。</p>

<blockquote>エンジニアとは、主に工学（エンジニアリング）分野の専門的な技術を持った実践者のことである。</blockquote>

<ul>
<li><a href="http://ja.wikipedia.org/wiki/%E6%8A%80%E8%A1%93%E8%80%85" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">技術者 &#8211; Wikipedia</a></li>
</ul>

<p>エンジニアとは上記のような人のことを言うそうです。さらにソフトウェアエンジニアリングのWikipediaを見てみると、<a href="http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E5%B7%A5%E7%A8%8B" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ソフトウェアの開発プロセス</a>というものがありました。</p>

<p>CSSにおける <strong>要求 · 仕様</strong> は、デザイナーが出してくるPSDでしょう。ここに関しては今までどおりデザイナーと対話する必要があります。</p>

<p><strong>アーキテクチャ · 設計</strong> に関しては、HTML5エキスパートである谷さんの『<a href="http://www.amazon.co.jp/dp/B00M0ESXUI" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web制作者のためのCSS設計の教科書</a>』を読めば大丈夫でしょう。</p>

<p>問題は、<strong>実装 · テスト</strong> と <strong>展開 · 保守</strong> の2つの段階でコレといったモノがないことです。私はこの辺りを解決するモノがほしかったのです。</p>

<h2>CSSを評価してみましょう</h2>

<p>そういう理由で、私は<a href="http://www.stylestats.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats</a>を作成しました。StyleStatsにスタイルシートに解析させることで、さまざまな指標が得られます。v5.0.1時点で29の指標を確認することができます。基本的な使い方と各種指標の意味は、以前書いた記事を参照してください。</p>

<ul>
<li><a href="https://html5experts.jp/t32k/5743/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">自分の書いたコードが即座に解析できる「StyleStats」でCSSを測ろう！ | HTML5Experts.jp</a></li>
</ul>

<p>v5.0.0でいろいろコマンドラインのオプション名が変わっていますので、ヘルプでご確認ください。
</p><pre class="crayon-plain-tag">$ stylestats -h

  Usage: stylestats [options] 

  Options:

    -h, --help             output usage information
    -V, --version          output the version number
    -c, --config [path]    set configurations
    -f, --format [format]  set the output format 
    -t, --template [path]  set the template path for output formant
    -s, --specs [path]     run test with your test specs file
    -n, --number           show only numeral metrics
    -m, --mobile           set the mobile user agent</pre><p>
CSSと十把一絡げにいっても、HTML5エキスパートの谷さんが書くCSSと、新卒エンジニアの書くそれとでは大きく違うことでしょう。しかし、違うフィールドの人が一見してみれば同じように見えるでしょう。そこでStyleStatsに解析させてみれば、数値的に比較できれば違いが分かります。エキスパートの書いたCSSであれば、CSSでバッドプラクティスと思われる指標の数値は低く、ファイルサイズもまた小さいことでしょう。そういったことがStyleStatsでは目視で確認するより圧倒的に速く理解できます。</p>

<h3>類似ツール</h3>

<p>まずは、<a href="http://cssdig.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Dig</a>というChrome拡張機能があります。解析したいページに行き、拡張ボタンを押すだけで解析できます。</p>

<p>次に<a href="http://cssstats.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Stats</a>というWebアプリケーションがあります。Specificity Graphなど、StyleStatsにはない機能もあります。</p>

<p>StyleStatsもCLIだけでなく、GUIとしてのWebアプリケーションが提供されています。</p>

<ul>
<li><a href="http://www.stylestats.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats &#8211; Useful tool to collect CSS statistics</a></li>
</ul>

<p>また、npmモジュールとしてProgrammaticalに利用することもできるため、他にGruntやGulpからも利用することができます。また、解析が終わったらSlackに結果を投稿するなどのインテグレーションも考えられます。</p>

<p><img src="/wp-content/uploads/2015/03/05.png" alt="Slack Integration" /></p>

<p>おかげさまで、<a href="https://moniteur.herokuapp.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FT Labs</a>や<a href="http://ianfeather.co.uk/css-at-lonely-planet/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Lonely Planet</a>などの世界的な企業でStyleStatsは使われております。</p>

<p>結局、私が欲しかったのはエンジニアリングとしてのツールで、それを継続的インテグレーションに組み込みたかったという点があります。</p>

<p><img src="/wp-content/uploads/2015/03/06.png" alt="CI" /></p>

<p>CIプロセスにCSSの評価を組み込めば、CSSを書く人だけでなく、デザイナーやバックエンドのエンジニアも今のCSSの状態が分かるようになります。その中で、StyleStatsでどのようにモニターとテストをすればよいか説明します。</p>

<h3>モニター</h3>

<p>前述のとおり、CSSは徐々に徐々に増えていきます。気づいたら手遅れになっていた、ということのないように常日頃から監視しておく必要性があります。StyleStatsを使えば、Jenkins上から実行させ、それをグラフとしてプロットすることができます。これは<a href="https://html5experts.jp/t32k/5743/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前回の記事</a>でも紹介したとおりです。</p>

<p><img src="/wp-content/uploads/2015/03/07.png" alt="moniteur" /></p>

<p>また、最近ではFT Labsの方が<a href="https://github.com/kaelig/moniteur" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">kaelig/moniteur</a>というモニタリングWebアプリケーションを作成してくれました。<code>git clone</code>してきて、ローカルでも動作させることが可能です。Webアプリケーションのとして動かすにはRedisサーバーを使うことになるのですが、そこまで難しくはないので試してみてください。</p>

<h4>User Specified Selectors</h4>

<p>v5.0.0で追加された新規指標のUser Specified Selectorsは、ユーザー指定のセレクタ数をカウントすることができます。config.jsonで<code>"userSpecifiedSelectors"</code>の値に任意の正規表現を記述することで、指標を表示させることができます。</p>

<p>これにより、例えばBEMでのModifierの数やElementの数などカウントするこもできますし、CSSを記述する人が独自の命名規則（独自の接頭辞を持つクラスセレクタ等）さえ、守っていればいろいろ計測することができます。</p>

<h3>テスト</h3>

<p>次にテストですが、CSSには古くから<a href="http://csslint.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Lint</a>があります。これはさまざまなエディタのプラグインが揃っていたりGrunt/Gulpのプラグインもあるので、多くの人が使われているかと思います。</p>

<p>しかし、これは単純に使ってたらエラーが出るだけのものです。例えば、古くから運用しているサイトのCSSを解析したい場合、昔にIDセレクタを使っていたといったことがあります。そこで、StyleStatsでは5個以上あったらエラーとするなど、任意の値でCSSをテストすることできます。
</p><pre class="crayon-plain-tag">{
  "defaults": {
    "suiteName": "StyleStats Test Suite for sample.css",
    "text": "{metric}: {actual} should be {operation} {expected}",
    "operation": "&lt;",
    "reporter": "spec"
  },
  "results": {
    "simplicity": {
      "min": 0.4
    },
    "size": 20000,
    "dataUriSize": 8000,
    "idSelectors": 20,
    "importantKeywords": {
      "min": 2,
      "max": 8
    },
    "javascriptSpecificSelectors": 1
  }
}</pre><p>
上記のコードのようにtest-specs.jsonでテストのしきい値を設定します。例えば上記の条件だと、IDセレクタが20個以上だったらエラーでビルドが中止されます。</p>

<p>StyleStatsでテストできる指標は数値的なものであれば何でもできますので、例えば単純にsizeに着目してもいいですし、先ほど説明したUser Specified Selectorsを使って、独自の基準を設けてもらっても大丈夫です。大事なのは皆の前でテストを失敗させる（エラーにならないほうが良いのですが）ことでCSSの問題をプロジェクトチーム全体の問題にすることです。</p>

<p><img src="/wp-content/uploads/2015/03/08.png" alt="test" /></p>

<h2>まとめ</h2>

<p>そういうわけで、CSSはいまだにどうしようもないですが、CSSを扱う人間までがどうしようもないわけではありません。CSSの問題は一人で解決できないので、その問題をチームで共有しましょう。</p>

<p>現状のCSSを状態を常に確認し、ある程度のしきい値をあらかじめ決めておく。肥大化してエラーが出る度になぜクリアできないのか皆で話し合う。そうすることによって、CSSを扱う私たちの価値も上がっていくのではないでしょうか。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
	</channel>
</rss>
