プロジェクト紹介
プロジェクト紹介
Section titled “プロジェクト紹介”@lh-ui/share は、lh-ui コンポーネントファミリー唯一のフレームワーク非依存共有層です。
コンポーネントライブラリの「フレームワークに依存しない半分」を切り出して独立したリポジトリに しています:クラス名計算、ステートマシン、アクセシビリティ属性パック、位置決定エンジン、 仮想スクロール、テーマトークン、国際化メッセージ、コンポーネントスタイルソース。各端の UI ライブラリ(lh-ui-plus / lh-ui-vue2 / lh-ui-react / lh-ui-uniapp)は、公開時には npm 依存として 本パッケージを消費し、ファミリー内のローカル開発では本リポジトリのソースを変更すると各 UI ライブラリに即時反映されます。ビルドもリリースも不要です。
なぜこの層が必要か
Section titled “なぜこの層が必要か”コンポーネントライブラリのロジックのうち、フレームワークのリアクティビティに本当に依存するのは ごく一部です:
- あるクラス名を付けるべきかどうかは、
(size, disabled) => stringの純粋な計算; - ドロップダウンパネルをどちらへ反転すべきかは、幾何計算;
- リストがどの行をレンダリングすべきかは、インデックス範囲の計算;
- 「確定」ボタンのラベルは、言語パックの参照。
これらを純関数として沈殿させれば、4 つの端はそれぞれ書いて、それぞれ間違えて、それぞれ 直す必要がなくなります。フレームワーク層に残る仕事はただひとつ:純関数の出力をテンプレートに 束ね、ユーザーの入力を純関数へ戻すことだけです。
リポジトリの中身
Section titled “リポジトリの中身”| 層 | 内容 | 数 |
|---|---|---|
src/core/<コンポーネント>/ |
コンポーネント純関数(logic.ts / types.ts)、フレームワークインポートなし | 56 コンポーネント |
src/core/shared/ |
コンポーネント横断の共有コア(popper / virtual / sx / keyboard / focus-trap …) | 12 モジュール |
src/theme/ |
テーマ TS 側:型 + 5 つのプリセット + ランタイムプリミティブ | — |
styles/ |
コンポーネント BEM スタイルの唯一ソース + theme/common/*.scss トークン |
58 セットのコンポーネントスタイル |
src/locales/ |
国際化(LhLocale は純イベントエミッター)+ 6 言語の骨組み | — |
src/constants/ src/types/ src/utils/ |
定数 / 型 / 純ユーティリティ(createNamespace を含む) | — |
カウントの基準:core は 56 個のコンポーネントディレクトリ、styles は 58 セット——
layout/tree-selectはスタイルソースを持ちますがロジックはすべて UI 層にあります (レイアウトコンテナ、ツリーセレクターのフレームワーク側グルー)。configはスタイル ディレクトリではconfig-providerという名前です。詳しくはパッケージ構成。
- フレームワーク依存ゼロ:
src/内でimport 'vue' | 'react' | '@dcloudio/*'を禁止。 CI grep ゲートが監視します。本パッケージはexternal: []で、完全ゼロ依存バンドルです。 - スタイル単一ソース:
styles/はファミリー全体のコンポーネント BEM スタイルの唯一ソースで、 どの UI ライブラリもコンポーネント scss のコピーをローカルに持ってはなりません。クロス フレームワークのトランジションクラス名の差異はtransition.scssの 3 つの mixin が統合します。 - 単体テストは唯一のコピー:core の単体テストは本リポジトリの
tests/unit/にのみ存在し、 3 つのライブラリはこの結果を共有して、重複コピーしません。 - リアクティビティは UI 層に帰属:core はデータを生み出すだけ。購読とリアクティブな配線は
各 UI ライブラリの仕事です。そのため LhLocale は純 emitter であり、
versionの自動増分に よって各端がそれぞれの仕組みで再レンダリングします。 - 明暗は同じ品質:すべてのコンポーネントは明色と暗色の両方をデフォルトでサポートします。
コンポーネントは
var(--lh-*, fallback)でのみトークンを消費でき、暗色の完全性はverify:stylesの第 7 項が監視します。
これは何ではないか
Section titled “これは何ではないか”- UI ライブラリではない:本パッケージは何もレンダリングせず、コンポーネントランタイムも
ありません。すぐ使えるコンポーネントが必要なら、
@lh-ui/vue3/@lh-ui/vue2などの 各端ライブラリをインストールしてください。 - どの UI ライブラリにもフレームワークにも依存しない:最下層であり、依存される側で、 依存する側ではありません。
- デプロイ段階は担わない:テーマカスタマイズが生み出すのは
<style>テキストと CSS 変数で、 DOM への注入方法は各端の ConfigProvider が決めます。
ファミリー構成
Section titled “ファミリー構成”lh-ui/├── lh-ui-share/ ← 本リポジトリ:フレームワーク非依存共有層(core / theme / styles / locales)├── lh-ui-plus/ Vue3 端(全体を side-effect でスタイル注入)├── lh-ui-vue2/ Vue2 端(オンデマンドで theme.css + style/<name> を読み込み)├── lh-ui-react/ React 端├── lh-ui-uniapp/ uniapp 端├── docs/ ファミリードキュメントサイト(別リポジトリ)└── native/ ネイティブ端(android / ios / harmony、applicationId は top.lhgb.*)リリース順はハード制約です:share が先にリリースし、UI ライブラリが続きます。share を変更
→ changeset を書く → リリース → 各ライブラリが pnpm up @lh-ui/share でリグレッション。
次のステップ
Section titled “次のステップ”- クイックスタート —— パッケージをインストールし、スタイルを読み込み、最初の純関数を動かす
- パッケージエントリとサブパス —— 77 個のエクスポートキーをどう選ぶか
- 各フレームワークでの利用 —— Vue3 / Vue2 / React / uniapp の配線サンプル
Copyright © 2024-2026 FengMo WenXue