精读《Vuejs设计与实现》(2)

382 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

第一篇 框架设计概览

这一篇中作者主要讲述了设计vue时候的一些思考,一些选择。其实也是在讲明vue与其他前端框架的不同。

权衡的艺术

虚拟DOM性能到底如何

其实在知乎上,尤雨溪曾经回答过这个问题网上都说操作真实 DOM 慢,但测试结果却比 React 更快,为么? 虚拟DOM的性能到底好不好取决了2点:你的操作类型,你的代码水平。

在书中,把虚拟dom与innerHTML做了对比,其实并不全面。我把dom的变化分为3种类型(这里只关注dom的变化,不关注属性,css,dom内文字的变化):

  1. dom增加:dom.parentNode.appendChild(xxx)
  2. dom减少:dom.parentNode.removeChild(xxx)
  3. 完全替换:dom.innerHTML = 'xxx' 如果你说性能,毫无疑问,前两种绝对会吊打虚拟dom,但是第三种就不一定了。因为虚拟dom永远只会更新变化的部分,而innerHTML随着页面变大,消耗越大

但是,从心智负担。可维护性,性能上来讲,虚拟dom达到了一个平衡点。但是,有没有办法做到,既是声明式的描述UI,又能具备媲美原生JS的性能呢?请往下看

运行时和编译时

我对此的理解就是能直接运行的就叫运行时。比如我们插入dom的时候dom.parentNode.appendChild(xxx),你直接在控制台里输入正确的代码,就能运行。但是你把.vue文件中的代码直接放到控制台里,它时不能运行的,这就是编译时。我们需要把.vue文件编译为纯js文件,这部分就是通过webpack的vueLoader去实现的。

运行时和编译时各有优缺点,纯运行时,我们无法知道传入的参数,我们很难却优化内部的实现。比如appendChild这种原生API,我们根本优化不了。

运行时+编译时,我们可以对用户的输入进行一定的优化,通过编译可以去提供一些插件等等,这也是现在vue的选择。

纯编译时,就像svelte。有着不错的性能,但是用起来却不够灵活。