生涯未熟

生涯未熟

プログラミングをちょこちょこと。

【PostCSS】ts⇔css間で値を共有する

プロジェクトの依存ライブラリをアップデートする苦行をやっているのですが、その最中で遭遇し解決した事象の話をば。
PostCSSを使っているのですが、その中で postcss-custom-media をv8からv10に上げた時にそれは起きました。

まず、以下のようなPostCSS設定ファイルがあり、

これがv8 -> v9でのbreaking changesにて importFrom が削除されたので、修正する必要がありました。
これについては、以下の内容を参考に postcss-global-data を使う形で解決しました。

github.com

各ComponentにCSSファイルが配置されていて、そこで @custom-media を利用しているのですが、 postcss-global-data を使って別途作成した media-queries.css を読み込ませて解決。
しかしここでふと気付いたわけです。「tsと共有している 100px をどうしよう・・・」と。

tsからはこのような形で呼び出していたのです。困った・・・

この問題を解決するためにいろいろ試しました。
最初に postcss-css-variables を使って media-queries.css に設定している @custom-media で指定しているピクセル数をcss variablesに置き換えていけるかな?と思ったらmedia queryでcss variablesが使えないことでダメでした。(知らなかった・・・)

次に、 postcss-extractatrule として custom-media を抜き出してexportしたものをts側で利用しようとしたけどなんかダメだった。
どういう風にダメだったかというと atrule[name="custom-media"] といった形式で抜き出そうとしたものの、取得結果を見ると空となってしまいどうしてもここを解決することができませんでした🤔

で、最後に試したのが postcss-design-tokens で、これが見事に刺さりました。これを使ってCSS内でデザイントークンを利用すればcss variablesではないのでいけないか?と思い、使ってみた経緯です。
利用例としては以下のような感じ。

これで具合が良かったのはts側からは design-tokens.json を読み込むだけでOKなのでめっちゃ楽ってとこでしたね。で、 @custom-media@media で使う際にcss variablesで怒れることがなく、万事解決しました!

まとめ

蓋を開けてみればPlugin知ってるか知らないかの話だったんですが、PostCSSのPlugin多すぎ問題があるのでなかなか難しいところではあります。
あとはmedia queryでcss variables使えないのは純粋に知らなかったので、これは大反省です・・・

chaika.hatenablog.com

この記事見かけてなかったら一生彷徨ってたかもしれないので感謝🙏