یک DOM مجازی سبک به سبک Snabbdom. رابط کاربری تو را با شیءهای ساده جاوااسکریپت (همان VNodeها) نشان میدهد، درخت کهنه را با درخت نو میسنجد و فقط تفاوتها را بر DOM واقعی مینشاند.
init() سازوکار همسنجی را برپا میکند و یک تابع patch برمیگرداند. ماژولهای همراه (class / props / attrs / style / events) خودبهخود ثبت میشوند.
patch(oldVnode, newVnode) اگر oldVnode عنصری واقعی از DOM باشد درخت را سوار میکند، وگرنه دو درخت vnode را میسنجد و DOM را همانجا بهروز میکند.
h(sel, dataOrChildren?, children?) همان یاریرسان hyperscript است که VNode میسازد.
نکته: در این پیادهسازی init()هیچ آرگومانی نمیگیرد: مجموعهٔ ماژولها ثابت است و در درون ثبت میشود، پس لازم نیست تکتک صادراتهای *Module را به init بدهی. آنها برای مراجعه و وارسی صادر شدهاند.
همان چیزی است که init() برمیگرداند. در نخستین فراخوان، بهجای oldVnode یک Element واقعی از DOM بده تا درخت درون آن سوار شود. در فراخوانهای بعدی، VNode پیشین را بده تا همانجا سنجیده و بهروز شود. VNode تازه را برمیگرداند که آن را بهعنوان مقدار «کهنه» برای فراخوان بعدی نگه میداری.
ویژگیهای DOM که با elm[key] = value گذاشته میشوند
Record<string, any>
propsModule
attrs
صفتهای HTML که با setAttribute گذاشته میشوند (true و false صفت را میگذارند و برمیدارند)
Record<string, string | number | boolean>
attributesModule
class
کلاسهای شرطی: نگاشتی از نوع name → boolean
Record<string, boolean>
classModule
style
سبکهای درونخطی: نگاشتی از نوع name → value (کلیدهای --var به متغیرهای CSS بدل میشوند)
Record<string, any>
styleModule
on
شنوندههای رویداد: event → handler (یا آرایهای از دستگیرهها)
Record<string, Function | Function[]>
eventListenersModule
key
نشانی پایدار که الگوریتم همسنجی برای جفت کردن و جابهجا کردن فرزندان به کار میبرد
string | number
(هستهٔ همسنجی)
ns
نشانی فضاینام (در زیردرختهای SVG خودبهخود گذاشته میشود)
string
(هستهٔ همسنجی)
hook
قلابهای چرخهٔ عمر برای هر vnode (Hooks)
Hooks
(فقط در سطح نوع: نکته را ببین)
نکته: hook و نوع Hooks بخشی از سطح عمومی نوعها هستند. اما این پیادهسازی پیراسته، DOM را از راه چرخهٔ عمر ماژولها (create / update / destroy) میگرداند؛ فراخوانهای data.hook که به هر vnode بستهاند، در حلقهٔ کنونی patch صدا زده نمیشوند.
فقط مرورگر.ranuts/vnode به document و APIهای DOM دست میزند؛ آن را در کد مرورگر وارد کن، نه در Node.
آخرین vnode را نگه دار.patch همان VNode تازه را برمیگرداند. آن را ذخیره کن و در بهروزرسانی بعدی بهعنوان oldVnode بده تا تفاوتها نسبت به درخت کنونی سنجیده شود.
در یک VNode، text و children با هم جمع نمیشوند: هر گره یا گرهٔ متنی است یا عنصری با فرزند.
برای فهرستها key بگذار. وقتی فهرستی پویا را میکشی، به همنیاها مقدارهای key پایدار بده تا همسنجی بتواند گرهها را جفت و جابهجا کند بهجای آنکه از نو بسازد.