Xamarin.Forms CSSに対応したScss環境作ってみた

f:id:itaoyuta:20180519011728j:plain

Xamarin.Forms 3には、web界隈ではお馴染みのCSS機能が搭載されました。
これだけでも相当レイアウト管理、作成が楽になりそうだと思います。
期待が高いだけに平置きCSSは避けたいと思い、きちんとScssでやれる環境を用意してみました。

なぜScss環境?

Webに馴染みがある方はよくご存知の通りですが、大きなプロジェクトを何の規則性なくCSSを作成していくと

  • ソースのどれが適用されているかわからなくなる
  • CSS自体がめちゃくちゃ大きいサイズになる
  • 前にも作ったことあるクラス再作成

と、運用コストがばかにならなくなってきます。
いくつか運用を楽にするためのパターンはありますが*1Scss環境はこういったCSSだけで管理すること、および記述を楽にするメタ言語です。
Xamarin.Formsで作成するプロジェクトの規模にもよりますが、途中導入するころには荒れ果ててるのがだいたいのパターンなので、最初からScss環境があるといいと思います。

node-sassの壁

導入作業当初は、node.js環境用意してScssをwatchする環境だけ作れればいいと思って楽勝な感じで用意していたのですが、一通り出来上がった後公式ドキュメントを読んでいると、あれ、これ大丈夫かなという箇所が。

注意 ^baseセレクターは、Xamarin.Forms の固有であり、CSS 仕様の一部ではありません。

^contentpageとかで宣言すると、contentpageクラスおよび派生クラスに一括で適用されるようなので外したくない機能です。

おもむろに出来上がった環境から

^contentpage{
 color: red
}

と記述してみると

{
  "status": 1,
  "file": "......assets/scss/_layout.scss",
  "line": 13,
  "column": 2,
  "message": "Invalid CSS after \"}\": expected 1 selector or at-rule, was \"^hoge{\"",
  "formatted": "Error: Invalid CSS after \"}\": expected 1 selector or at-rule, was \"^hoge{\"\n        on line 13 of scss/_layout.scss\n        from line 1 of scss/style.scss\n>> }\n\n   -^\n"
}

とがっつりエラーが、、、

考えた

最初は、node-sassのオプションで接頭辞の除外とかできないかなとさがしたところ、こういったやりとりを発見して、この方向性はなさそうかと。
そしたらplugin中見てみるかと思ったのですが、^[attr^=value]のような使い方ができることもあって、純正をいじるのは得策ではなさそうと感じました。*2
node-sassの依存プラグイン量見ても、調整はぞっとするので、出力されたCSSに調整する方向しかないなと。
そして思い出したのが、autoprefixerです。
autoprefixerはweb開発では必須モジュールで、文字通りベンダープレフィックスを自動でつけてくれる優れものです。
これがなかったころは

.hoge{
  -webkit-animation: fadeIn 1s ease;
  -moz-animation: fadeIn 1s ease;
  animation: fadeIn 1s ease;
}

みたいにせこせこつけてた接頭辞が

.hoge{
  animation: fadeIn 1s ease;
}

記述自体はこれだけでよくて、あとはconfigファイルに基づきよしなにビルドで接頭辞をつけてくれるものです。*3

確かこの挙動はscssから作成されたcssをpipeして処理していた記憶がうっすらあったことを思い出して、よくよく調べてみるとPostCssというフレームワークが大きく作用していることがわかってきました。
PostCssのアウトラインは@morishitterさんのこちらの記事がとても詳しいです。

PostCss Pluginを作成してみた

それなら、PostCssまわりでプラグイン*4あるかなと思って探して見たのですが、案外意図するものがなく作ることに。
コード自体はとてもシンプルなもので、実際公式はいるかどうかPR中です。
https://github.com/itaoyuta/postcss-selector-replace

Xamarin.Forms ProjectとしてSkelton作成しました

ついでに、最小構成プロジェクトも公開してみました。 https://github.com/itaoyuta/Xamarin-LinkedSass
もしよかったら使ってみてください。
注意点として、yarn installするときはVS落としておいた方が良いです。
大量のファイルがプロジェクト配下にいきなり流れ込んできてパニックをおこしているような挙動をしていました。

改めてXamarin.Forms CSS

環境も用意できたので、次はがっつりCSSまわりの挙動チェックしてみたいと思います。
絶対今までのXaml直下記より便利で見通しよく、管理もいいと思うので是非発展していってほしいところです。

CINRAでの活動について

CINRAのエンジニアチームでは 、Xamarinを利用したアプリ
HereNow iOS
HereNow Android
を外部パートナーさんと一緒に作っています。
この他にも色々作っていきたいと思っているので、もし興味持っていただけたらTwitterでもなんでも構わないのでご連絡いただきたいです。

*1:BEM SMACSS等、記述パターンも非常に有効なパターンです

*2:CSSはなにげに正規表現使えたりしてできること多いですね

*3:ベンダープレフィックスはブラウザの進化に伴い不要なものになりつつはありますが

*4:しっかり整備されていてとてもいい感じ