batonjs
既存ページにダイナミズムを後付けする宣言的UIフレームワーク
batonjsは既存ページにダイナミズムを後付けする宣言的UIフレームワークです。
HTMLをクライアント側で作るのではなく、サーバ側で作ったHTMLにダイナミズムを後付けします。そうすることで次のような長所を得ました:
- ダイナミックな部分だけをピンポイントでCSS風に記述
- HTMLを専有しないので、jQueryなどDOMに変更を加えるライブラリと併用可能
- 設定上当然ですが、サーバー側言語を限定せず、ページの表示速度やSEOも良好
また、batonjsは次のような優れた特性も持っています:
- 高速ロード -- gzipで4kbと小さいのでロードが高速です
- ワンストップ -- 他のライブラリ無しで様々なページを作れます
- 導入が楽 -- Node.js、babel、webpackなどが不要です
- 学びやすい -- Web標準の上に独自の概念を少し付け足しただけ
- 保守しやすい -- 枠組みに沿って書くだけで自然とコードが整理されます
概要
簡単なクリックカウントを例にbatonjsを見てみましょう。
<html>
<body>
<p>Count: <span id="count">0</span></p>
<button id="button" type="button">Count Up</button>
</body>
</html>
batonjsは既存のHTMLページにUI管理を後付けします。だからこの例でもHTMLは完全な形になっています。
import {baton} from '../asset/baton.esm.js'
const state = {count:0}
function show(state) {
return {
"#count": {
innerText: state.count
}
}
}
document.getElementById('button').addEventListener('click', (ev) => {
withState(state => ({count: state.count + 1}))
})
const withState = baton(state, show, document.body)
2行目でページの初期状態を定義しています。このオブジェクトは13行目でbatonjsを起動するのに使います。
3行目のshow
関数は、ページ状態をUIに反映させる方法を指示する関数です。最新のページ状態を受け取り、それをUI宣言に変換して返却します。UI宣言とは、どのUIがどうであるべきかを表現したオブジェクトです。
5行目の#count
はCSSセレクターで、6行目のinnerText
はDOM要素のプロパティ名です。この2行で、どのDOM要素のどのプロパティをどんな値にするか、を確かに指示できていますね。
11行目のwithState
はページ状態を更新するための関数です。withState
に渡したコールバック関数が新しいページ状態を返却すると、withState
はその状態をUIに反映させます。もちろん、その過程でshow
関数が使われます。
13行目ではbatonjsを起動しています。batonjsを起動すると、状態を管理するためのwithState
が返却されます。
このように、CSSに似た書き方で動的なウェブページをプログラミングしていけるのがbatonjsです。
インストール
CDNから
batonjsはインストールは必須ではありません。CDNから読み込むのが気楽でおすすめです。
あらかじめCDNからダウンロードしておき、自サーバーに配置することもできます。
ESモジュール形式
<script type="module">
import {baton} from 'https://cdn.jsdelivr.net/npm/@vividcolors/batonjs/asset/baton.esm.js'
</script>
UMD形式
<script src="https://cdn.jsdelivr.net/npm/@vividcolors/batonjs/asset/baton.umd.js"></script>
<script>
const baton = batonjs.baton
</script>
npmから
npmでインストールすれば、バンドルしたりTree Shakingしたりする余地があります。
$ npm install @vividcolors/batonjs
ESモジュール形式
import {baton} from '@vividcolors/batonjs'
CommonJS形式
const {baton} = require('@vividcolors/batonjs')
動作環境
- Chrome最新版
- Edge最新版
- Firefox最新版
- Chrome for Android最新版
- iOS Safari最新版
- Node.js v14以上
ライセンス
MIT