dockview - TypeScript/React/Vue のウィンドウレイアウトマネージャー(タブ、フローティング、ポップアウト)
(github.com/mathuo)- dockview は、タブ、グループ、グリッド、split-view をサポートする依存関係なしのレイアウトマネージャーで、React、Vue、Angular、JavaScript で利用可能
- レイアウトのシリアライズ/デシリアライズ、dockable view、タブ・グループのドッキング、ドラッグ&ドロップ、フローティンググループ、ポップアウトウィンドウを含む包括的なレイアウト管理機能を提供
- テーマ適用とカスタマイズ、Shadow DOM 対応、タッチ・モバイル対応、拡張 API、ライブサンプル付きのドキュメントサイトを提供
- パッケージは
dockview、dockview-react、dockview-vue、dockview-angularに分かれており、React はreact16.8 以上、Vue はvue3.4 以上、Angular は@angular/core21 以上を peer dependency として要求 - 開発構成は NX モノレポと Yarn v1 workspaces ベースで、
dockview-core → dockview → フレームワークバインディングの順にビルドされる
dockview が提供するレイアウト機能
- dockview は、タブ、グループ、グリッド、split-view をサポートするレイアウトマネージャー
- JavaScript 向けの基本パッケージは zero dependencies で、全機能をすぐに利用可能
- 対応機能:
- レイアウトのシリアライズ/デシリアライズ
- split-view、grid-view、dockable view
- タブとグループのドッキング
- ドラッグ&ドロップ
- ポップアウトウィンドウ
- フローティンググループ
- タッチとモバイル対応
- Shadow DOM 対応
- テーマ適用とカスタマイズ
- 拡張 API
- ライブサンプル付きのドキュメントサイト
対応パッケージとフレームワーク
dockview: JavaScript 向けパッケージで、依存関係なしで全機能を提供dockview-react: React バインディングで、peer dependency としてreact16.8 以上を要求dockview-vue: Vue 3 バインディングで、peer dependency としてvue3.4 以上を要求dockview-angular: Angular バインディングで、peer dependency として@angular/core21 以上を要求
インストールと React の使用例
- インストールコマンドは、フレームワーク別のパッケージを選ぶ方式
npm install dockviewnpm install dockview-reactnpm install dockview-vuenpm install dockview-angular
- React の例では、
DockviewReactとdockview-react/dist/styles/dockview.cssをインポートして使用 onReadyコールバックでevent.api.addPanelを呼び出し、id、component、paramsを持つパネルを追加- Vue と Angular の例はドキュメントサイトで確認可能
開発構成とビルド
- プロジェクトは NX モノレポで、Yarn v1 workspaces を使用
- 開発コマンド:
yarn install: 依存関係のインストールyarn build: すべてのパッケージをビルドyarn test: テストを実行yarn lint: ESLint を実行yarn format: Prettier を実行
- NX がビルド順序を自動管理
dockview-core → dockview → dockview-reactdockview-core → dockview → dockview-vuedockview-core → dockview → dockview-angular
品質、セキュリティ、ライセンス
- プロジェクトは高いテストカバレッジ、透明性のあるビルド、コード分析を重視
- GitHub Actions による検証済みの publishing とビルドを含め、セキュリティに配慮
- ビルド検証は npm の provenance 関連の案内で確認可能
- コントリビューションは issue または pull request で受け付け
- ライセンスは MIT
1件のコメント
Hacker News のコメント
うわ、本当に素晴らしい仕事だ。初見でも TypeScript がきちんと書かれている感じがするし、時代の流れを捉えているのもその通りだと思う。これから AI アプリケーションを作るには、こうした基礎ツールがもっとずっと必要になっていく気がする。
技術的には、パネルをドラッグしたり表示状態が変わったりするときに、コンポーネントをマウント/アンマウントする仕組みが以前から気になっていた。場合によっては、マウント/アンマウントより
display:noneのほうが安く済むこともある。それから、パネル構造は実質的に宣言的なので、保存済みの TypeScript レイアウトを書き出し、関数、つまり TypeScript import がパネル内容にマッピングされるような形の Vite プラグインを公開する予定があるのかも気になる。JSX の外側で、より純粋な TypeScript 的なやり方として考えている。
https://dockview.dev/docs/core/panels/rendering
パネル内容を常に DOM 内に保持するオプションがあり、あなたの言うように
display: noneに近いアプローチも可能。逆に、内容を DOM から削除するオプションもある。純粋な TypeScript という観点では、ライブラリの大部分は純粋な TypeScriptで書かれていて、Vue と React 向けの小さなラッパーライブラリだけがある。
理論上は Angular のような別のフレームワーク向けラッパーも書けるし、今年中にやってみたい作業だ。
状態の読み込みと保存にも対応している。
https://dockview.dev/docs/core/state/save
この回答で質問が解決するか教えてほしい。
本当に印象的だ。特にいくつか大きく称賛したい点がある。依存関係 0 個は JavaScript パッケージとして非常に良いし、ドキュメントもきれいで例もある。透明なビルドも標準になるべきだ。
もっと多くの JavaScript パッケージがこうであってほしい。
ちょっと検索して理解した限りでは、すでに標準のように見える。インストールしたあと動かすために手動のビルド手順を自分で調べないといけないパッケージなら、そもそも使わない。
Dockview は素晴らしく、@mathuo の見事なプロジェクトに祝意を送りたい。最近このカテゴリのライブラリを 6〜7 個かなり徹底的にテストしたが、Dockview は間違いなく上位に入る。GitHub も非常に活発で、よくメンテナンスされている。
最近のプロジェクトで最終的に FlexLayout(https://github.com/caplin/FlexLayout) を選んだ唯一の理由は、事前定義/制限付きサイズのサポートがなかったことだが、その後とても良い形で追加された。また、FL が縦タブと事前定義された動作でサイドパネルを扱うやり方も気に入っていた。
次のプロジェクトのどれかで Dockview を使えることをかなり楽しみにしている。
趣味プロジェクトで文字どおりこういうものを作っていたところだったので、これを見つけられて本当にうれしい。これで自分のコードを捨てて、プロジェクトの次の段階に進める。
GoldenLayout と比べるとどうなのか? そこから着想を得たのか?
以前そのプロジェクトが本当に好きだったが、残念ながらサポートは完全に止まってしまった。何人かが引き継ぎはしたものの、熱心に更新していたにもかかわらず、現実的なアップグレードパスはあまり見えなかった。
これは良さそうで、試してみたい。
最初は GoldenLayout を含む他のレイアウトマネージャーから着想を得たのは確かだ。ここでの主な目標は依存関係 0 個で、純粋な TypeScript で書きつつ、Vue や React のようなフレームワーク向けのラッパーライブラリを提供することだった。
どんなフィードバックでもありがたいし、ウェブサイトのデモは現在の機能の大半を示している。Issues 一覧には今後予定していることも多い。
理論上は GoldenLayout 用のアダプターロジックを自分で保守できるかもしれないが、事実上死んだ状態に見える。このライブラリのように、より新しく、ドラッグ&ドロップの感触もより良いライブラリがある。
6 年ほど前、別のプロジェクトで GoldenLayout を使おうとして、体感上の問題がいくつかあったため、結局純粋な TypeScript で自前実装した記憶もある。広く使われてはいるが、実体験としてはそれほど素晴らしくはなかった。
良いプロジェクトだ。デモに動画、ドロップダウン、大量のテキスト、大きなサイズのテキストのような一般的なコンテンツを入れて、どう処理されるのか見せてくれるとよさそうだ。
それと、ウィンドウクロームなしでパネルだけのバージョンもあるのか気になる。
Rust で書いたタイル型ウィンドウマネージャーをメンテしているが、この種の作業を JS/TS でやり遂げる忍耐力は到底想像できない。mathuo に敬意を表する。最近 HN で見たものの中でも最もクールなものの一つだ。
本当に良い。SolidJS 対応もあるといい。最近 React と Solid の間に特別な好みはないが、これを使えそうなプロジェクトがいくつか SolidJS で作られている。
Mosaic を作り直す時が来た。 https://github.com/mlajtos/mosaic
素晴らしい。HTML が提供するもの以上に、メニューのような一般的なデスクトップコントロール向けの、同じような依存関係なしの純粋なライブラリを知っている人はいる?
0: https://daisyui.com