web学习

作者: 说不出口的喵 | 来源:发表于2019-06-27 16:20 被阅读0次

Web 客户端通过称为浏览器的程序来查看网页。所有的网页都含有其如何被显示的结构,浏览器通过阅读这些结构来显示页面 ,最常用的显示结构称为 HTML 标签。签文档对象模型 (DOM) 是一个平台,一个中立于语言的应用程序编程接口 (API),允许程序访问并更改文档的内容、结构和样式。所以js是通过dom的api来改变html的。 由于这两块相互分离,通信是需要付出代价的,因此JavaScript调用DOM提供的接口性能不咋地。各种性能优化的最佳。实践也都在尽可能的减少DOM操作次数。(所以会需要虚拟dom)

真实dom与虚拟dom

真实 DOM 的的工作流程: 

大致分 5 步:创建 DOM tree –> 创建 Style Rules -> 构建 Render tree -> 布局 Layout –> 绘制 Painting

第一步,用 HTML 分析器,分析 HTML 的各种元素,构建一颗 DOM 树。

第二步:用 CSS 分析器,分析 CSS 文件和元素上的 inline 样式,生成页面的样式表。

第三步:将上面的 DOM 树和样式表,关联起来,构建一颗 Render 树。这一过程又称为 Attachment。每个 DOM 节点都有 attach 方法,接受样式信息,返回一个 render 对象(又名 renderer)。这些 render 对象最终会被构建成一颗 Render 树。

第四步:有了 Render 树后,浏览器开始布局,会为每个 Render 树上的节点确定一个在显示屏上出现的精确坐标值。

第五步:Render 数有了,节点显示的位置坐标也有了,最后就是调用每个节点的 paint 方法,让它们显示出来。

然而操作 DOM,浏览器会从构建 DOM 树开始从头到尾执行一遍流程。然而 DOM 的批量操作不会被合并,只会第一个 DOM 操作处理完之后再重新从构建 DOM 树开始第二个操作,一直到最后一个操作结束。

构建DOM数是一个渐进过程,为达到更好用户体验,渲染引擎会尽快将内容显示在屏幕上。它不必等到整个HTML文档解析完毕之后才开始构建render数和布局。   

 Render树是DOM树和CSSOM树构建完毕才开始构建的吗?这三个过程在实际进行的时候又不是完全独立,而是会有交叉。会造成一边加载,一遍解析,一遍渲染的工作现象。    

CSS的解析是从右往左逆向解析的(从DOM树的下-上解析比上-下解析效率高),嵌套标签越多,解析越慢。

用我们传统的开发模式,原生JS或JQ操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程。在一次操作中,我需要更新10个DOM节点,浏览器收到第一个DOM请求后并不知道还有9次更新操作,因此会马上执行流程,最终执行10次。

虚拟DOM就是为了解决浏览器性能问题而被设计出来的。如前,若一次操作中有10次更新DOM的动作,虚拟DOM不会立即操作DOM,而是将这10次更新的diff内容保存到本地一个JS对象中(React的Diff算法的时间复杂度是O(n)。要实现这么低的时间复杂度,意味着只能平层的比较两棵树的节点,放弃了深度遍历。这样做,似乎牺牲掉了一定的精确性来换取速度,但考虑到现实中前端页面通常也不会跨层移动DOM元素,这样做是最优的。),最终将这个JS对象一次性attch到DOM树上,再进行后续操作,避免大量无谓的计算量。所以,用JS对象模拟DOM节点的好处是,页面的更新可以先全部反映在JS对象(虚拟DOM)上,操作内存中的JS对象的速度显然要更快,等更新完成后,再将最终的JS对象映射成真实的DOM,交由浏览器去绘制。

Vue的核心是双向绑定和虚拟DOM

vue实现这种数据双向绑定的效果,需要三大模块:

Observer:能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者

Compile:对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数

Watcher:作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图

Vue和React的区别

相同点:

    1.都支持服务器端渲染

    2.都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范

    3.数据驱动视图

    4.都有支持native的方案,React的React native,Vue的weex

    5.都有管理状态,React有redux,Vue有自己的Vuex(自适应vue,量身定做)

不同点:

      1.React严格上只针对MVC的view层,Vue则是MVVM模式

      2.react整体是函数式的思想,把组件设计成纯组件,状态和逻辑通过参数传入,所以在react中,是单向   数据流,推崇结合immutable来实现数据不可变。react在setState之后会重新走渲染的流程,如果shouldComponentUpdate返回的是true,就继续渲染,如果返回了false,就不会重新渲染,PureComponent就是重写了shouldComponentUpdate,然后在里面作了props和state的浅层对比。

        而vue的思想是响应式的,也就是基于是数据可变的,通过对每一个属性建立Watcher来监听,当属性变化的时候,响应式的更新对应的虚拟dom。

            总之,react的性能优化需要手动去做,而vue的性能优化是自动的,但是vue的响应式机制也有问题,就是当state特别多的时候,Watcher也会很多,会导致卡顿,所以大型应用(状态特别多的)一般用react,更加可控。

       3. 组件写法不一样, React推荐的做法是 JSX + inline style, 也就是把HTML和CSS全都写进JavaScript了,即'all in js';

          Vue推荐的做法是webpack+vue-loader的单文件组件格式,即html,css,jd写在同一个文件;

      4.数据绑定: vue实现了数据的双向绑定,react数据流动是单向的

      5.state对象在react应用中不可变的,需要使用setState方法更新状态;

        在vue中,state对象不是必须的,数据由data属性在vue对象中管理;

网络上觉得不对的说法:
单向数据流是指数据的流向只能由父组件通过props将数据传递给子组件,不能由子组件向父组件传递数据,要想实现数据的双向绑定,只能由子组件接收父组件props传过来的方法去改变父组件的数据,而不是直接将子组件的数据传递给父组件。

相关文章

  • 无标题文章

    #Web前端 - web前端是什么 - 定义 - 职责 - web前端基础知识和学习路线 - web前端学习的...

  • Web前端

    Web前端 web前端是什么- 定义 职责 web前端基础知识和学习路线 web前端学习的资源 1.Web前端是...

  • 怎样学习web前端?---Web前端需要熟悉大学里[高大上]计算

    怎样学习web前端?---Web前端需要熟悉大学里[高大上]计算机专业课吗? 怎样学习web前端?Web前端需要熟...

  • Web前端要学多久才能就业,Web学习路线是什么

    Web前端开发越来越火了,Web前端学习要多久才能达到就业标准,Web前端学习路线是什么呢?对于想从事Web前端岗...

  • day21-HTML简介

    今天开始python学习的第二阶段,进入web前端的学习; 一、web前端简介 1、web标准web前端的内容:H...

  • Web学习

    DOM级别与DOM事件https://www.jianshu.com/p/622d994906f7 jQuery事...

  • web学习

    Web 客户端通过称为浏览器的程序来查看网页。所有的网页都含有其如何被显示的结构,浏览器通过阅读这些结构来显示页面...

  • web学习

    系统的学习方案 看各种书籍html+div+css+ps切图+ftp网站上传 html5标签+css3动画+手机网...

  • web技术讲解(web安全入门03)

    一、Web 工作机制 为什么学习这节课 我们学习渗透测试这门课程,主要针对的 Web 应用,所以对 Web 架构需...

  • 13.Tomcat&Servlet

    主要内容 web相关概念回顾 web服务器软件:Tomcat Servlet入门学习 web相关概念回顾 web服...

网友评论

      本文标题:web学习

      本文链接:https://www.haomeiwen.com/subject/dwsccctx.html