虚拟DOM和抽象语法树

JavaScript023

虚拟DOM和抽象语法树,第1张

1. 虚拟DOM其实就是一个普通的JS对象,是为了提高页面渲染的性能。

虚拟DOM的解决方式是,通过状态生产一个虚拟状态Dom,然后根据虚拟节点进行渲染,假如是首次渲染的就会直接渲染,但是二次往后的话就是进行虚拟状态树的对比,只更新不同的地方。

2. 换成AST的是Vue模板,Vue需要根据模版去处理各种插值、指令;

生成虚拟DOM的是最终要展示在页面上的内容的对象描述,Vue每次需要通过Diff算法对比新旧虚拟DOM的差异;

固定模版生成的AST是不变的,虚拟DOM是不断变化、需要进行差异对比的(数据等会变)。

  template -->抽象语法树 -->render(h) -->虚拟DOM-->UI

3. 抽象语法树的终点是渲染函数(h函数)。

渲染函数(h函数),它既是AST的产物,也是vnode(虚拟节点)的起源。h函数里面是不含指令的。

抽象语法树不会进行diff算法的并且抽象语法树不会直接生成虚拟节点,抽象语法树最终生成的是渲染函数的

参考 https://zhuanlan.zhihu.com/p/111715881

如果要感受抽象语法树推荐一个node工具:

也可以对AST进行一些处理后输出

安利两个网站能查看tokens和抽象语法树:

http://resources.jointjs.com/demos/javascript-ast

https://astexplorer.net/

相关文章: https://segmentfault.com/a/1190000016231512

相关文档: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Parser_API#Node_objects

CSS(Cascading Style Sheets )叫层叠样式表,用于修饰HTML文档样式;CSS3是CSS2的升级版本,由CSS权威组织在css2的基础之上新增了很多功能和标准,让各大浏览器厂商去实现。但是由于各浏览器出于各种原因,导致对各个功能的实现的时间是参差不齐的,这就导致有些浏览器先实现,有些浏览器后实现,甚至有些浏览器没实现;先实现的浏览器将已经实现的功能做个特殊的标记,表示这个功能是我的私有属性,其他浏览器用不了;而接着如果第二个浏览器也实现了这个功能,它也加一个自己的特殊标记,以此类推,到最后面所有浏览器厂商都实现了该功能。这个时候某个浏览器厂商的人可能就想到,这个功能大家都实现了那这也不算是我的私有属性了,那我就支持不加自己特殊标记的写法吧,接着第二个厂商看到,哟呵是哦大家都实现了,那我也支持不加自己特殊标记的写法,以此类推,到最后大家都支持不加自己特殊标记的写法了,这就是一个属性从开始定义到兼容一些浏览器到兼容所有浏览器的过程。这个过程,甚至到现在很多属性和功能都是在上述的发展着。

所以正是浏览器厂商对CSS3新增功能的实现时间参差不齐,导致了CSS3属性各种各样不兼容的问题。

那如何解决兼容性紊乱的问题呢?

方法一:查文档查手册

下面是两个最常用的两个网址caniuse和CSS手册:

当我们要用某个属性的时候,就去上面两个网址查找该属性的兼容性,对应你要兼容到的浏览器版本,对应的加上前缀之类的操作,如columns:

小结一下,各主流浏览器常加的特殊标记:

1. Safari/Chrome: -webkit-

2. IE:-ms-

3. Firefox:-moz-

4. Opera:-o-

方法二:使用后处理器比如autoprefixer插件自动补齐前缀

这里简单讲一下后处理器和预处理器

注意:cssNext和autoprefixer依赖于postCss

postCss的本质是用js实现的CSS的抽象语法树(AST : Abustract Syntax Tree)

说白了postCss就像一个插槽一样,剩下的具体事情留个其他插件来做了,cssNext和autoprefixer就是它其中的两个插件