Pembaruan DOM reaktif dengan Ruby.
demo langsung di rdom .fly.dev
menyematkan demo di rdom .netlify.app
Ini adalah eksperimen dasar dengan VDOM sisi server di Ruby. Untuk implementasi lebih lengkap lihat Mayu Live. Saya punya beberapa ide yang saya rasa harus saya jelajahi, dan inilah hasilnya.
Pastikan Anda memiliki Ruby 3.2 dan Bundler, lalu jalankan:
bundle install
Untuk memulai server:
ruby config.ru
Hal ini dilengkapi dengan server HTTP/2. Mulai dengan ruby config.ru
.
Secara default, ini terikat ke https://localhost:8080
, tetapi dapat diubah dengan mengatur variabel lingkungan rdom _BIND
seperti ini rdom _BIND="https://[::]" ruby config.ru
.
Ini adalah satu-satunya baris HTML yang Anda perlukan untuk memasang aplikasi.
< script type =" module " src =" https://rdom.fly.dev/ rdom .js " > </ script >
< rdom -embed src =" https://rdom.fly.dev/. rdom " > </ rdom -embed >
Anda dapat menggunakan bin/transform
untuk melihat keluaran file Haml yang diubah.
Contoh:
bin/transform app/List.haml
Repositori ini berisi perpustakaan sinyal reaktif yang terinspirasi oleh SolidJS, Preact Signals, dan Reaktif.
Aplikasi yang dibuat dengan ini hanya dapat dialirkan, server tidak akan pernah mencoba membuat HTML untuk permintaan awal. Jika Anda perlu menyajikan HTML pada permintaan awal, lihat Mayu Live.
Jika koneksi terputus, semua status hilang. Untuk mencoba sesuatu yang lebih andal, lihat Mayu Live.
Semua pohon DOM statis diekstraksi menjadi elemen khusus, jadi jika Anda menulis:
- items = %w[foo bar baz]
% ul
= items.map do |item |
% li = item
Maka kode ini akan dihasilkan:
# frozen_string_literal: true
class self :: Component < VDOM :: Component :: Base
rdom _Partials = [
VDOM :: CustomElement [
:" rdom -elem-app꞉꞉my-component.haml-0" ,
'<ul><slot id="slot0"></slot></ul>'
] ,
VDOM :: CustomElement [
:" rdom -elem-app꞉꞉my-component.haml-1" ,
'<li><slot id="slot0"></slot></li>'
]
]
def render
items = %w[ foo bar baz ]
H [
rdom _Partials [ 0 ] ,
slots : {
slot0 : items . map { | item | H [ rdom _Partials [ 1 ] , slots : { slot0 : item } ] }
}
]
end
end
Browser akan memberi Anda:
< rdom -elem-my-component .haml-0 >
#shadow-dom
< ul > < slot > </ slot > </ ul >
< li >
< slot id =" slot0 " >
< rdom -elem-my-component .haml-1 > ↴
< rdom -elem-my-component .haml-1 > ↴
< rdom -elem-my-component .haml-1 > ↴
</ slot >
</ li >
< rdom -elem-my-component .haml-1 >
#shadow-dom
< li >
< slot id =" slot0 " >
< #text > ↴
</ slot >
</ li >
foo
</ rdom -elem-my-component .haml-1 >
< rdom -elem-my-component .haml-1 >
#shadow-dom
< li >
< slot id =" slot0 " >
< #text > ↴
</ slot >
</ li >
bar
</ rdom -elem-my-component .haml-1 >
< rdom -elem-my-component .haml-1 >
#shadow-dom
< li >
< slot id =" slot0 " >
< #text > ↴
</ slot >
</ li >
baz
</ rdom -elem-my-component .haml-1 >
</ rdom -elem-my-component .haml-0 >
Setiap slot di dalam shadow DOM akan memiliki nodenya yang ditetapkan setiap kali turunannya diperbarui.
Ini bagus karena beberapa alasan:
Setiap elemen khusus memiliki :host { display: contents; }
untuk menghindari gangguan pada flex dan grid.