Closed4
Panda CSSのコードリーディング
大まかなコードリーディングの方針
-
panda codegen
でstyled-system
ディレクトリが生成されるまでの流れの把握- コードが生成されるまでの主な登場人物の列挙
-
postcss
プラグインでコードをパースしてcssを生成する流れの把握 - コードをパースする部分の具体的なロジックの理解
-
styled.div
がどうやって動いているのか - tokensの挙動の把握
- variantsの挙動の把握
- recipesの挙動の把握
- 拡張の考察
- descendantsへのスタイリングをテーマ定義する実現可能性
- React Nativeへ応用できないか
読み解くのに助けになりそうな資料
Pandaの歴史
Stitches
variants APIの元ネタ
tailwindcss
コンパイラの元ネタ
panda codegen
でstyled-system
ディレクトリが生成されるまでの流れの把握
愚直にcliでpanda codegen
されてからの動きを追っていく
-
loadConfigAndCreateContext
が呼ばれてPandaContext
が作成される -
codegen
が実行される -
PandaContext
のwatchConfig
が呼ばれて、watcherが貼られる。watcherではファイル変更を監視してdiffを取得し、diffについてcodegen
を実行してコードを再生成する
loadConfigAndCreateContext
-
loadConfig
を実行してconfigのオブジェクトとconfigが依存しているパッケージを取得する -
loadTsConfig
を実行してtsconfig.json
を読み込む、baseUrl
とpaths
のようにコード生成に必要な情報は取得して使いやすい形にしておく -
loadConfig
とloadTsConfig
の結果からconfigのオブジェクトを作成し、それを渡してPandaContext
をインスタンス化して返す
loadConfig
の挙動
-
bundleNRequireを実行して、configファイルが
default export
しているもの(configのオブジェクト)と、configファイルがインポートしているファイルを取得する
PandaContextとは
超絶ざっくり言うとGenerator
(後述)にランタイムなどの環境情報を持たせたもの
codegen
- 変更対象の
Artifact
(後述)を取得する。Artifact
のid
(後述)が指定されている場合はそれらのみ。指定されていなければ全て取得する。 - 各
Artifact
についてOutputEngine
のwrite
メソッドを実行し、生成ファイルの書き込みを行う
Artifactとは
コード生成物の区分の総称?デフォルトではstyled-system
ディレクトリ以下に生成されるアレ
id
とdir
とfiles
を持っている。
idは以下の定義
export type ArtifactId =
| 'helpers'
| 'keyframes'
| 'design-tokens'
| 'types'
| 'css-fn'
| 'cva'
| 'sva'
| 'cx'
| 'create-recipe'
| 'recipes'
| 'recipes-index'
| 'patterns'
| 'patterns-index'
| 'jsx-is-valid-prop'
| 'jsx-helpers'
| 'jsx-factory'
| 'jsx-patterns'
| 'jsx-patterns-index'
| 'css-index'
| 'themes'
| 'package.json'
| 'types-jsx'
| 'types-entry'
| 'types-styles'
| 'types-conditions'
| 'types-gen'
| 'types-gen-system'
| `recipes.${string}`
| `patterns.${string}`
id毎にArtifact
を生成する関数が用意されている。setupRecipes
, setupPatterns
, setupJsxTypes
...etc
それぞれの生成関数はconfigファイルのデータを読み取って、生成ファイルに書き込むコードを用意する。.js
コードと.d.ts
コードを用意する。
コードが生成されるまでの登場人物の列挙
-
Config
:panda.config.ts
に書くやつ。そのままオブジェクトとして使われると思っていい。 -
PandaContext
:Generator
に環境情報とかとかを持たせたもの-
OutputEngine
とかDiffEngine
はインスタンス変数として持ってるんだけどDIはしてなくてコンストラクタの中で直接セットしてる = DIする形にすれば別のものを使える
-
-
Artifact
: 生成されるコードのこと。コードの内容とどこに書き込むかの情報を持ってる。関数的にはConfig
->Artifact[]
-
OutputEngine
:Artifact
をファイルに書き込む具体的な方法を持っているやつ- (補足)
PandaContext
で使っているOutputEngine
は普通にファイルに書き込むやつだけど、極端な話を言えばこれを差し替えればDBに生成物を保存できると思う。当然、そんなことする意味ないけど。
- (補足)
-
DiffEngine
:Config
の差分を変わったフィールドを取得するやつ。
postcssプラグインでコードをパースしてcssを生成する流れの把握
このスクラップは2024/10/05にクローズされました