Lit - 高速で軽量な Web コンポーネント作成ライブラリ
(lit.dev)- Web コンポーネント標準をベースに、リアクティビティ、宣言的テンプレート、最小限のボイラープレートのみを追加
- 5KB級の小さなサイズと高速レンダリングにより、変更された UI 部分だけを更新してパフォーマンスと読み込み速度を最適化
- すべての Lit コンポーネントはネイティブ Web コンポーネントであり、フレームワークに依存せず HTML が使えるあらゆる場所で再利用可能
- Shadow DOMを活用してデフォルトでスタイルのスコープを制限し、CSS セレクタをシンプルにして他のスタイルとの衝突を防止
- Reactive Propertyでコンポーネント API と内部状態をモデリングし、プロパティ変更時の効率的な再レンダリングをサポート
- Tagged template Literalsベースのテンプレートで高速かつシンプル
- 共有用コンポーネント、デザインシステム、ベンダーロックインを減らし保守性を高めたアプリ全体の構築まで、さまざまな Web プロジェクトで利用可能
- チュートリアル を提供
- GitHub
4件のコメント
3年前から感じていますが、バニラのWeb Componentsをそのまま使うのに速く、過渡期のフレームワークのようにも感じます。遅いです..
どういう意味ですか?
Web標準の Web Components と
lit-htmlだけを使って運用ツールを開発していますが、把握すべき情報が最小限で済むのが良いです。lit-htmlで活用している機能も、event handler binding と loop templating 程度しか使っていません。(そのほかは Web 標準くらいで十分なので……)変更があるとrenderを直接呼び出さなければならない不便さはありますが、むしろ変数の変更を自動で検知して非明示的な動作をするより、明示的な呼び出しのほうが助けになる面もあります。運用ツールということもあって、さまざまな環境への対応は優先度が低いため、そう感じているのかもしれません。Hacker Newsの意見
すでに重いフレームワークを使っていたのに、誰かが履歴書に一行追加したいがためにLitを入れたのが大きな負担だった
Shadow DOMは特にアクセシビリティ(A11y)の問題をさらに深刻にした
idのスコープが分離されることで、label-forやdescribe-byのような関連付けが壊れてしまい、かなり苦労した
もちろん、ある程度はチームのスキル不足の問題でもあった
スタイルはスコープされるが、フォントサイズのような重要な部分は例外なので、差し替えるたびに小さな回帰バグが出続けた
DXもかなり落ちたし、ツール群が改善されることを期待しているが、今はただただ疲れる状況だ
実際には、ただ新しいものを試してみたくて、特に合理化もせず導入するほうがよくある気がする
複雑なアプリでネストしたコンポーネント同士が相互作用する場合にもうまく動き、Reactに似ているが、はるかにブラウザネイティブで、ボイラープレートが少なく、レンダリングも速い
なぜLitがもっと人気にならないのか理解できないほどだ
中核機能は意外と単純で、ほとんどがプラットフォームAPIに依存している
だから誰でも自分で実装できるし、この単純さこそ大きな価値だと思う
ちなみに私が作った代替実装は https://github.com/ruphin/lite-html
CDNから直接読み込めて、ビルドステップなしで試せるのも大きな利点だ
他のフレームワークのように重くなく、ただVanilla JS + HTMLを書いている感覚なので、認知負荷がほとんどない
Shadow DOMは基本的に、コンポーネント内部のDOMを分離するプライベートツリーだ
これによってスロット(slot)の概念が可能になり、本当に合成可能なコンポーネントを作れる
問題は、スタイルのカプセル化が既存システムと統合する際の大きな障壁になる点だ
そこで私はOpen Styleable Shadow Rootsという提案をした。外部スタイルが内部へ流れ込めるようにしつつ、スロットは維持する方式だ。まだブラウザベンダーを説得しているところだ
関連して私が書いた記事もある: https://medium.com/gitconnected/getting-started-with-web-com...
ときどき、なぜもっと広く使われていないのか不思議に思うこともある
もともとはBackbone.jsベースだったが、lit-html → lit-element → lit という順で段階的に置き換えた
今では
<converse-root />というWeb Componentとして提供されており、Reactのような他のフレームワークとも問題なく統合できるGitHub: https://github.com/conversejs/converse.js / デモ: https://chat.conversejs.org/
サーバー側でJSXのようなテンプレートシステムを使えば十分快適だし、クライアントは単なるJSなのでアップグレードの心配もない
ただしネイティブAPIはあまりに低レベルなのでDXに欠け、Litはその上に宣言的なリアクティビティを載せてくれる
自前で実装すると面倒な部分をきれいに解決してくれる
htmlテンプレートリテラルとJSXの間に大きな違いは感じなかったむしろJSXはコンパイル段階が必要なので、より面倒だ
最初は依存関係のない環境で自前のWeb Componentsを作っていたが、後でLitElementに移るとはるかに楽になった
ただしShadow DOMはデフォルトだが、むしろ問題を増やすこともあり、今はShadow DOMなしでLitElementを使っている
最大の利点は、安定した基盤の上にあることだ
ネイティブWeb Componentsはすべてのブラウザで安定してサポートされているので、フレームワーク入れ替えのリスクなしに開発へ集中できる
もっと多くのチームに試してみてほしい
ちなみにLitを扱ったHTTP 203動画もおすすめだ
Angularは重すぎるし、Reactは古いブラウザの制約に合わせて設計されたので、今では惰性だけで残っているように感じる
AngularのボイラープレートやReactのフックの複雑さに比べると、はるかに直感的だ
ただ、人気が出なかったのが残念だ
実質的には
+ Web Componentsの組み合わせで十分だと思うしかし、Vueの代わりにLitで作り直すことにどんな利点があるのか気になっている
Vue 3のref/reactive状態管理は強力で、DOM依存なしにテストできる
Litのリアクティビティはウィジェット単位なので、更新トリガーを自分で管理する必要がある
Vueはライフサイクルが単純だが、Litでは複数のコールバックに気を配る必要があり、バグが入りやすい
特別な理由がないなら、機能開発に集中するほうがよく、技術スタックの入れ替えはユーザーにほとんど影響しない
Vueはフレームワークなので機能が多く、LitはネイティブAPIにより近い形で実装する
Vueはビルドが必要だが、Litはランタイム読み込みが可能だ
Vueは他のターゲットにもコンパイルできるが、LitはWeb Components専用なのでよりクリーンだ
結局のところ、チームがより慣れている技術を使うのが一番重要だ
利用者は内部実装には関心がなく、重要なのはサイズとAPIだけだ
どうせ他の人たちは自分の環境に合わせてアダプターを作って使うことになる