Mithril 1.1.0

CSS


バニラCSS

CSSはさまざまな理由から評判が悪く、開発者の中にはスタイルを管理しやすくするために複雑なツールを使う人もいます。このセクションでは、その複雑なツールから一歩下がり、プレーンなCSSを書くためのtipsを紹介します。


Tachyons

TachyonsはCSSフレームワークです。ライブラリがなくても使いやすいことを念頭に開発されています。

基本的な考え方は、すべてのクラス名には1つのCSSルールのみを記述する点です。例えば、bw1border-width:1px;を表します。複雑なスタイルを作るには、必要なCSSルールのクラス名を単純に組み合わせて使います。例えば、.black.bg-dark-blue.br2というスタイルは、青い背景色で、黒字で、4pxの角丸を持つ、という意味になります。

すべてのクラスが小さくアトミックなので、CSSのコンフリクトを起こすことが難しくなっています。

Tachyonsの規約はMithrilやJSXにとてもよくマッチします:

var Hero = ".black.bg-dark-blue.br2.pa3"

m.mount(document.body, <Hero>Hello</Hero>)
// `m(".black.bg-dark.br2.pa3", "Hello")`と同じ

CSS in JS

通常のCSSは、すべてのセレクターがグローバルなスコープの中にあるため、名前や空間のコンフリクトが発生します。CSS-in-JSはCSSのスコープの問題を解決しようとします。関連するスタイルをグローバルではないモジュールに分類します。モジュール同士は不可視です。CSS-in-JSは極めて巨大な開発チームがひとつのコードベース上で仕事をしている場合に役立ちますが、多くのチームではオーバーキルです。

現在は、たくさんのCSS-in-JSライブラリがあり、ロバスト性もそれぞれ異なります

これらのライブラリの問題は、少なくない量のトランスパイラツール群と、それらのための設定ファイルが必要になる点です。また、動作させるためにはコードの可読性を少し犠牲にする必要があります。例えば、<a class="button danger"></a>(あるいはhyperscriptを使っていたらm("a.button.danger"))という表記は、<a class={classnames(styles.button, styles.danger)}></a>となります。

また、デバッグ時にも同じ犠牲を払う必要があります。マッピングされているクラス名とソースコードのマッピングを調べるのが簡単ではなくなります。ブラウザの開発者ツールを開いても、button_fvp6zc2gdj35evhsl73ffzq_0 danger_fgdl0s2a5fmle5g56rbuax71_0といったクラス名は役に立たないソースマップ名、もしくはより悪いケースでは暗号化されたクラス名となります。

他によくある問題としては、@keyframes@font-faceといった基本的なCSS機能のサポートが欠けていることが多いです。

もしCSS-in-JSライブラリの使用を検討しているのであれば、設定ファイルいらずで、@keyframes@font-faceの対応が実装されているJ2Cを強く推奨します。


License: MIT. © Leo Horie.