终于把 Svelte 这类无虚拟 DOM 的前端框架的实现原理搞清楚了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
ksco
V2EX    分享创造

终于把 Svelte 这类无虚拟 DOM 的前端框架的实现原理搞清楚了

  •  
  •   ksco 2021-03-25 13:23:39 +08:00 4998 次点击
    这是一个创建于 1694 天前的主题,其中的信息可能已经有所发展或是发生改变。

    去年从前端同事口中知道了 Svelte,竟然可以不用 VirtualDOM 就能精准地更新 DOM 树,一直很好奇其原理。

    最近闲着没事什么事,就去研究了一下 Svelte 的源码,但因为 Svelte 的项目代码太庞大,感觉抓不到重点。最后找到了一个和 Svelte 类似,但是代码量要小很多的项目 MalinaJS,花了几天时间把核心部分的代码看懂了,感觉挺有成就感的哈哈哈。

    最后出于学习的目的模仿 MalinaJS 实现了一个小的 Demo 。代码量很小,只有几百行代码,如果你也感兴趣的话,可以看看。

    项目地址: https://github.com/ksco/slim

    非常喜欢的一句话送给大家:

    "What I cannot create, I do not understand." -- Richard Feynman

    8 条回复    2021-03-27 18:48:24 +08:00
    Adalwin
        1
    Adalwin  
       2021-03-25 13:43:27 +08:00
    不错!有空看看(并交流交流)

    谢谢分享!
    40EaE5uJO3Xt1VVa
        2
    40EaE5uJO3Xt1VVa  
       2021-03-25 17:42:24 +08:00
    厉害厉害
    JinTianYi456
        3
    JinTianYi456  
       2021-03-27 11:42:29 +08:00
    完全不懂,"用 VirtualDOM 就能精准地更新 DOM 树" "不用 VirtualDOM 就能精准地更新 DOM 树",有链接让我来个入门吗?
    lifetimeporn
        4
    lifetimeporn  
       2021-03-27 11:48:28 +08:00
    borrowed lots of code from it
    ksco
        5
    ksco  
    OP
       2021-03-27 12:43:09 +08:00 via iPhone
    @JinTianYi456
    1. 用 VirtualDOM 就能精准地更新 DOM 树。这个可以去搜一下 VirtualDOM 的原理
    2. 不用 VirtualDOM 就能精准地更新 DOM 树。这个可以看看 @djyde 的这篇文章: https://lutaonan.com/blog/svelte/
    3dwelcome
        6
    3dwelcome  
       2021-03-27 14:58:20 +08:00   1
    就是一个前端语法编译器,之所以不需要虚拟 DOM,是改成了命令反射式语法。

    举个不恰当的例子,虚拟 DOM 好比是 GC,会自动收集相关依赖。
    而 Svelte 好比是 COM 引用计数,用之前变量必须写上$ :语法,来告诉编译器,这个变量和别的不一样,有事件反射关联性,是需要特殊引用处理的。

    我下一步工作也是类似的方面,把特制 HTML 语法编译到前端,只不过编译和逻辑处理代码都是 C++。webasm 只是把语言门槛铺平,却没有提供任何实际操作 DOM 的接口。
    cereschen
        7
    cereschen  
       2021-03-27 17:18:21 +08:00
    写编译器就是脏活累活 svelte 到现在 数组对象的操作还不能触发重渲染
    ksco
        8
    ksco  
    OP
       2021-03-27 18:48:24 +08:00 via iPhone
    @cereschen 其实这类框架的核心就是变化检测。

    Svelte 用的是脏标记,并且认为只有发生赋值操作时才需要将数据标记为脏,所以自然就检测不到 Array.push 这种。
    我参考的这个 MalinaJS 就没有这个问题,因为 MalinaJS 检测的是绑定,而不是变量赋值。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5617 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 03:18 PVG 11:18 LAX 19:18 JFK 22:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86