bouzuya.hatenablog.com

ぼうずやのにっき

次は Vue.js の scoped CSS を使いたい

業務のほうが落ち着いてきた。きのう (2016-09-28) ・おととい (2016-09-27) と同様に大きな進捗はない。

bouzuya/rally-client-example-vuejsCSS 作成中に感じた点を書いておく。

CSS は時間がかかる。CSS を調整することは予想よりもいつも時間がかかる。これはきっとぼくの CSS の知識が低いのと道具をうまく使えていないからだろう。

LESS の extend 。LESS にも extend がある 。mixin と比べたときの大きな利点は最終的な CSS の size だという理解だ。これをうまく使えていない。使えていないだけでなく、使える気がしない。LESS の extend を使える気がしない理由はぼくの現状の方針にある。

ぼくの現状の方針は view component が LESS の Not Outputting MixinFunction として提供する。view component の利用者は自分の使いたい場所で CSS の child selector (>) で scope を制限しながら使う。

この方針の長所は意図しない scope で CSS が適用されるのを防げる点。 LESS の Function により global な class への CSS 適用はない。ある view component はその配下の style を制御する責任を負う。

この方針の欠点は CSS の肥大化だ。LESS の Mixin を使うので使えば使うほど肥大化していく。extend を使えば解決できそうだが、 extend は既に定義されている class にしか適用できないと思っている (実は違っていたら困るな……) 。

このあたりの方針や使いかたがたぶん根本的にまずいのだと思う。Shadow DOM に向けた component 単位の style が主流になってきているはずだ。 scoped CSS や scoped style と呼ばれているはずだ。それらを取り入れるようにすれば scope の問題は解決するように思う。

今回は Vue.js の Single File Component が気持ち悪いからとかありがたみが分からなくなるからと vue-loader や vue-cli を避けたのだけど。よく読めば Single File Component でも Multi File にできるようだ。ほかにも 2016-09-23 のように template の build で事故を起こすわけだ……。次回は vue-cli & vue-loader でやってみたい。vue-loader に乗っかれば scoped CSS も標準機能として提供されており、幸せになれそうだ。