
2026/09/07 5:45
Show HN:Mador(80行のProxy State Tuple で、あらゆる DOM をリアクティブにします)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改善済み。 元のサマリーは正確ではあったが、開発者がライブラリの安全性と効率性を評価する上で価値のある具体的な行動詳細(
write を通じたバッチ処理および自動的なクリーンアップ)を見落としており、また重要なポイントで言及されていた MIT ライセンスについても欠けていた。
以下に、これらの欠落している要素を取り入れた改善版を示す:
改善されたサマリー
Mador.js は、重いフレームワークを採用することなく、複雑なビルド手順も必要とせずにリアクティビティを必要とする開発者向けの軽量な代替手段を提供する。従来のコンポーネントや仮想 DOM に依存するシステムとは異なり、このネイティブ ES モジュールランタイムは、独自の 3 つパートのバインディングパターン(要素の選択、更新関数の定義、ステート依存関係の指定)を用いて、状態を既存の HTML エレメントに直接バインドする。最小限のフットプリント(約 855 バイト)により、依存関係を知的に追跡して変更があった際のみ特定のプロパティを実行し直すことで、高速なパフォーマンスを実現する。状態の更新は
write メソッドを通じられ、1 つの操作内で複数の変更をバッチ化する。特に重要なのは、Mador が要素が存在しなくなったときにランナーを自動的に削除することで、DOM のライフタイムを管理し、手動でのクリーンアップの必要をなくしている点である。このアプローチにより、npm または CDN を通じて直ちにレガシーコードベースに統合でき、下のレイヤーの DOM 構造を変更することなく、コンポーネントのライフサイクルも管理せずに済む。MIT ライセンスの下でリリースされたこの技術は、ステート管理を必要とするがフルアプリケーションフレームワークのアーキテクチャ的なオーバーヘッドを拒否するインタラクティブなページ機能を作成する際、特に価値があり、クイックプロトタイピングおよび定義された HTML 構造を持つプロジェクトへの動的な振る舞いのシームレスな追加を可能にする。本文
mador.js: 軽量 DOM リアクティブランタイム
DOM のリアクティビティを実現する専用ライブラリです。フルスタックのフレームワークは不要で、既存の DOM と連携してシンプルなリアクティブな UI を構築します。
特徴と概要
- 極度の軽量さ: フルスタックフレームワークではなく、「それのみ」を提供します。
- 既存 DOM の利用: コンポーネントや仮想 DOM、テンプレートは不要です。ユーザーが既に持っている DOM と連携します。
- ES モジュール対応: npm 経由または CDN から直接使用可能です。
インストールと導入
Mador はネイティブ ES モジュールであり、ビルド手順を踏む必要もありません。
// CDN からの直接利用 import mador from "https://cdn.jsdelivr.net/npm/@marsbos/mador@latest/dist/mador.js"; // または npm パッケージとして import mador from "mador";
基本的な使い方
mador() はステートオブジェクトを返します。そこから read と write を使い分けます。
ステートの定義と操作
const [read, write] = mador({ count: 1, // 初期状態 }); // DOM 更新(変更は自動バッチ処理) write((state) => { state.count++; });
リアクティブなバインド方法
要素とステートを結び付ける
read() は、以下の 3 つの引数 を受け取ります。
- selector: DOM 要素を選択する CSS セレクタ。
- update: 更新処理関数。
を受け取り、DOM を操作します。(el, value) - readState: ステート取得関数。依存するプロパティの参照
を返します。(state) => state.xxx
// 例:カウント表示(count * 2) read( ".counter", (el, count) => { el.textContent = `Count: ${count}`; }, (state) => state.count, );
依存関係の追跡
- Mador はバインドされたプロパティを自動的に追跡します。
- 依存するステートが変更された場合のみ、該当するバインドが実行され直されます(不要な更新は行われません)。
- 同じロジックを持つ別の要素へも同様にバインド可能です:
// count の 3 倍を表示する別の要素 read( ".another-counter", (el, count) => { el.textContent = count * 3; }, (state) => state.count, // 同じステート参照を使用 );
DOM のライフサイクル管理
- 自動クリーンアップ: バインドされている要素が DOM から削除された際、Mador は自動的に関連するリアクティブなランナーも削除します。
- 手動不要: コンポーネントのライフサイクルを自分で管理する必要はありません。
利点:なぜ mador.js か?
ページ全体に重たいフレームワークを導入したい場合に適しています。
- HTML と JavaScript が既に存在する場合に、ほんの少しのリアクティビティを追加するだけで済みません。
- グローバル変数の汚染や複雑なビルド手順を避けられます。
サイズ情報
意図的に軽量に設計されています(コンパイル済み・minified)。
- ランタイムサイズ: 約 855 バイト