reclassify — React の className を強化するランタイム
概要
reclassify は、React のカスタム JSX ランタイムで、組み込み(intrinsic)要素に対して配列やオブジェクトをそのまま className プロパティに渡せるようにします。通常は clsx や classNames のようなヘルパー関数を介して配列や条件オブジェクトをフラットな文字列に変換しますが、reclassify を使うと JSX 側でそのような関数呼び出しを省略できます。構文は直感的で、ネストした配列や真偽値による条件クラスの切り替えもサポートされます。TypeScript 実装のため型安全性が期待でき、React のレンダリング結果として正しい class 属性が出力されます。軽量かつ用途が明確なユーティリティで、既存のスタイル運用をシンプルにします。
リポジトリの統計情報
- スター数: 20
- フォーク数: 0
- ウォッチャー数: 20
- コミット数: 9
- ファイル数: 12
- メインの言語: TypeScript
主な特徴
- 配列やオブジェクトをそのまま className に渡せる(clsx 不要)
- ネストされた配列や条件付きオブジェクトをフラットな文字列に変換
- TypeScript で実装され型安全性がある程度担保される
- 軽量なカスタム JSX ランタイムとして既存の React ワークフローに導入可能
技術的なポイント
reclassify のコアは「JSX ランタイム」を差し替えるアイデアにあります。通常の React では className に文字列を渡すことを前提とするため、配列やオブジェクトを渡すと正しくレンダリングされません。reclassify はカスタムの JSX 実装(あるいは JSX 変換後のランタイム挿入)を用いて、JSX の属性値として配列やオブジェクトが来た場合にそれらを解析・フラット化して最終的な class 属性用の文字列を生成します。実装は TypeScript で行われており、入力として受け取る型(文字列、配列、オブジェクト、ネスト)を適切に扱うユーティリティ関数群を備えています。ランタイム側で真偽値による条件評価(オブジェクトの値が truthy の場合のみキーを採用)や配列の再帰的な展開を行うことで、clsx のようなライブラリと同様の振る舞いを提供します。導入は JSX コンパイラ設定や importSource の切り替えなど、既存のツールチェーンに依存するため、使う際はプロジェクトのビルド設定(Babel/TypeScript の jsxImportSource 等)を調整する必要があります。また、intrinsic elements(div、button など組み込み要素)向けに最適化されている点や、カスタムコンポーネントでは挙動が異なる可能性がある点には注意が必要です。
プロジェクトの構成
主要なファイルとディレクトリ:
- .gitignore: file
- .vite-hooks: dir
- AGENTS.md: file
- LICENSE: file
- README.md: file
…他 7 ファイル
まとめ
clsx を不要にするシンプルで実用的な JSX ランタイム改良ツール。
リポジトリ情報:
- 名前: reclassify
- 説明: Make React classNames more powerful
- スター数: 20
- 言語: TypeScript
- URL: https://github.com/yangshun/reclassify
- オーナー: yangshun
- アバター: https://avatars.githubusercontent.com/u/1315101?v=4
READMEの抜粋:
reclassify
reclassify is a custom JSX runtime for React that lets you pass arrays and objects as className on intrinsic elements — no classNames() or clsx() functions needed.
// Before:
<button className={
clsx(["btn", ["btn-primary", { "btn-disabled": false }], { "is-active": true }])
}>
Save
</button>
// After:
<button className={
// No need for clsx
["btn", ["btn-primary", { "btn-disabled": false }], { "is-active": true }]
}>
Save
</button>
It constructs cl...