zoukankan      html  css  js  c++  java
  • 学习react总结

    一、web开发涉及的基本技术有哪些

    首先我们讲一下,你在浏览器输入地址到可以看到网页,这个过程发生了什么?

     

    1浏览器渲染页面的过程

     

    1.DNS 查询

    2.TCP 连接

    3.HTTP 请求即响应

    4.服务器响应

    5.客户端渲染

    2客户端渲染的过程

    1.处理 HTML 标记并构建 DOM 树。

    2.处理 CSS 标记并构建 CSSOM 树。

    3. DOM CSSOM 合并成一个渲染树(render-dom)。

    4.根据渲染树来布局,以计算每个节点的几何信息。

    5.将各个节点绘制到屏幕上。

     

    我们知道浏览器是通过http请求从服务器获取到html文档。会根据包含相关信息的请求的头和请求体。将其解析并构建成一个DOM树。同时根据文档取到相关的CSS文档,这些文档里面包含了许许多多的CSSOM。最后,这颗DOM树和这些CSSOM 会在浏览器内存中形成一个Render树,浏览器就是根据这个Render树渲染出我们看到的页面的。而这些过程都是发生在渲染引擎中的,这与负责执行动态逻辑的JavaScript引擎是相分离的。因此,为了JS能够方便操作DOM结构,渲染引擎会暴露一些接口供JavaScript调用。 

     

    注释:

    浏览器解析html文件生成dom文档树结构,就是我们看到的网页。

    Css会对网页样式进行渲染,如改变字体大小、样式、给边框添加阴影、边框等。

    Javascript给网页元素添加动态效果,如点击某个元素出现弹框,鼠标放在元素上改变背景等。

    其他如es6ES6JSjavascript)的一个版本标准。

    Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量、Mixin、函数等特性,使 CSS 更易维护和扩展。可以使用在线编译工具将less文件翻译成css文件,也可以使用工具如kaola进行转义。

    React 是一个用于构建用户界面的 JAVASCRIPT 库,主要用于构建UI。

    前后端执行流程

    二、为什么选择react

    1DOM操作问题

     

    前面讲到为了JS能够方便操作DOM结构,渲染引擎会暴露一些接口供JavaScript调用。通过暴露的接口,JS可以操作到DOM树中的节点。但是性能其实不是很高,特别是对于一些复杂的网页,添加删除节点会导致DOM节点的更新,这个开销是很大的。在之前,普遍都是通过JQuery来和DOM进行交互:

    Bullds/modidies构建/修改、delivers events 传递事件

    在网页设计越来越丰富,逻辑交互越来越复杂的情况下,频繁地进行DOM操作组件逐渐成为了性能的瓶颈。而以直接操作DOMJQuery也不再像之前那么大一统。许许多多前端框架如雨后春笋般涌现,如AngularJSReactVue等。其中最火的当属React,它提供了一套不同的,高效的方案来更新DOM。这种全新的解决方案就是“Virtual DOM”:

    如上图所所示,React会在内存中根据DOM创建一个虚拟的DOM树。基于React的开发并不直接操作DOM,而是通过操作这棵虚拟DOM进行的,每当数据变化的时候,React会重新构建整个DOM树,然后将当前DOM树和上个DOM树进行对比,得到DOM结构的区别,然后仅仅将需要变化的部分进行实际的浏览器DOM更新。

    既然最后还是会通过React来进行对DOM的更新,那为何还会有性能的提升呢?

    原因在于React并不总是马上对DOM树所做的更改进行更新,换而言之,就是你在虚拟DOM树上做的操作,不保证马上会产生实际的效果,它只会在你需要产生DOM树更新的时候进行更新。这样的一个机制就使得React能够等到一个事件循环的结尾,将若干个由数据影响的节点合并在一起,和实际DOM进行比较,只操作Diff部分,而不是像传统的js那样需要更新DOM操作,就更新DOM树一次,因而能达到提高性能的目的。

    同时,在保证性能的同时,React通过组件化的抽象概念,让开发者将不需要关注某个数据的变化该如何体现在DOM树上,只需要关系某个数据更新时,页面是如何Render的。

    2版本架构问题

     

    以前的架构是采用前后端分离方式,搭建了一个 node 中间层进行页面的渲染,以求提升页面的渲染速度。旧版平台的结构如下:

    从图中我们可以看到,尽管我们前端掌握了 server,可以进行页面渲染的控制,但是服务端的渲染和前端的渲染和路由依然是割裂的,之间有很多冗余的内容。导致这些冗余的主要原因,其实还是前后端渲染方式不一致以及前后端代码的分离。

    1是否需要前后端分离

    我们知道,在传统的 MVC 架构的项目之中,js 代码只占 View 层的很小的一部分。随着项目的渐进发展,前端功能的复杂度日益增高,导致项目难以维护;同时前后端语言并不一致(我们都知道 Java JavaScript 基本上是雷锋和雷峰塔的关系),不同的开发在一个项目里操作极为不便,因此才产生了前后端分离。

    但是随着 js 向服务端的进发,我们的中间层 server 也采用支持 js node 来进行架构,所以前后端语言不一致的问题基本上抹平了;而前端功能复杂这一点,从刚才的分析我们也可以看到,其实前端和后端在路由、渲染这些功能上是有很大的重合,因此前端的 server 和前端逻辑项目没有必要进行分离。

    实际上,这里我们的前后端分离,已经有传统意义上前端和后端代码的分离、服务端和浏览器客户端的分离,演变为后端数据提供和前端提供渲染的分离

    2前后端混合渲染的问题

    如果将前后端代码糅合在一起,那么渲染这里将会是服务端逻辑和客户端逻辑的一个结合点,它们的模板、渲染方式都一定要一致,才能减少开发的工作量。

    对于我们旧版项目来说,服务端采用 handlebars 作为模板,而前端采用 MVVM 模式的 avalon 的模板,两者在用法和理念上都是有一定冲突的。其中 MVVM 模式在服务端渲染中最棘手的问题就是: 要实现双向数据绑定,必须要经历一次 DOM 渲染 。这样就导致后端只能渲染一个中间状态的模板,然后还需要前端在更改一次 DOM,无法达到『直出』的效果。

    这个问题看似困难,但在 react 出现之后,却得到了完美的解决:react 基于 virtual DOM,不需要扫描 DOM 来建立双向绑定关系,只需要在每次状态变动时进行 diff,有变化才会进行更新。因此,我们可以在服务端直接渲染出 DOM 结构,如果前端最终生成的虚拟 DOM 跟后端直出的 DOM 保持一致,那么就不需要更改 DOM 结构,大幅度提升渲染速度。

    3同构应用的构建

    如果要实现前后端代码同构,其实只要保证两个一致即可: 包管理工具  模块依赖方式 的一致。这里我们可以看到,这二者的一致性都能得以保证:

    包管理工具:前端和 node 目前都采用 npm 来进行依赖管理,这就保证客户端和服务端都可以使用同一个兼容包;

    模块依赖方式:通过 webpack 这样的打包工具,可以保证前端和均采用 CommonJS 的依赖方式,确保代码可以互相依赖。

    有了这二者的保证,我们就可以完美的解决同构的问题,剩下需要考虑的就是如何处理服务端渲染了。

    4项目在使用了 react 进行同构构建之后,可以解决的问题

    开发效率低的问题:同构应用只有一个项目和一套技术栈,只要拥有 react 开发经验,就可以快速投入前端和后端的开发当中;

    可维护性差的问题:同构应用可以进行大量的代码公用,包括工具方法、常量、页面组件和 redux 的大部分逻辑等,可重用性大大提高;

    首屏性能、SEO 等:有了服务端渲染,再也不担心首屏和 SEO 问题。

    三、详细介绍react

    首先,React是一个用于构建用户界面的Javascript,React并不是一套完整的MVCMVVM的框架,它仅涵盖V-view视图层。

    1建议使用JSX的代码进行React的开发。

    JSX语法,像是在Javascript代码里直接写XML的语法,实质上这只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,React 官方推荐使用JSX, 当然你想直接使用纯Javascript代码写也是可以的,只是使用JSX,组件的结构和组件之间的关系看上去更加清晰。

    因为Javascript代码与JSX代码并不兼容,凡是使用JSX的地方我们都需要加上 type="text/babel"

    2JSX转换为JS的方法

    使用browser.js(Babel5.8.23)在浏览器中转换JSX

    BabelReact团队选择的在使用React过程中转换ES*JSXES5语句的工具

    实际上,Babel的主要用途并非一个JSX语句转换器。Babel主要用途是一个JavaScript转换器,它可以转换各种ES*代码为浏览器可识别的ES代码。就目前来说,Babel主要会转换ES6ES7语句为ES5语句,转换JSX看起来倒像是其的一个附加功能。

    babel.jsbrowser.js的关系

    babel的浏览器版本为browser.js(未精简)和browser.min.js(已精简)

     

    React默认会进行HTML的转义,避免XSS攻击,如果要不转义,可以这么写:


    在使用React之前,我们必须要先引入三个库——react.js/react-dom.js/browser.min.js

    ReactDOM.renderReact的最基本方法用于将模板转为HTML语言,并插入指定的DOM节点。ReactDOM.render(template,targetDOM),该方法接收两个参数:第一个是创建的模板,多个dom元素外层需使用一个标签进行包裹,如div第二个参数是插入该模板的目标位置。

    3、展示react的组件定义和生命周期

    调用组件

    浏览器输出

    React文档https://doc.react-china.org/

    4React生命周期图

    5react的特点 

    A.virtual dom  React通过对DOM的模拟,最大限度地减少与DOM的交互。所有输入都会当成字符串然后将虚拟dom转化成dom可消除除注入式攻击

    B.组件化 : 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。【模块化】

    C.单向响应的数据流 : React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。

    React能够提高开发效率,而且可以让代码更容易理解,维护和测试。

    相比于AngularReact更加轻量

    React相较于vue的优势
    更适合大型应用和更好的可测试性

    更大的生态系统,更多的支持和好用的工具

    演示1在react框架中引入d3.js文件加入svg代码,页面就可以很好的显示图表。

    演示2react框架中引入外部js文件实现拖动效果,页面元素就可以实现拖动功能。

    Ant designreact实现,开发和服务于企业级后台产品

    优点:UI组件样式友好度,用户体验好

    ElementiView(vue)都是使用Vue开发的UI组件

    缺点:响应式表现一般,antd的定位就是pc端,如果想要开发手机端,就用antdmobile

    Bootstrap是纯粹的UI框架,Ant Design给出框架的同时,也给出了设计规范。

    组件部分是Ant Design最大的亮点, 丰富的组件提供了覆盖大部分应用场景的能力。

     

    1、react开发环境搭建步骤;

    方式一:在终端书输入如下命令:

    使用react开发新项目:npm install -g create-react-app

    在现有项目中添加reactnpm init --save react react-dom

    或者是:yarn add react react-dom

    方式二:直接在页面中引入react文件

     

    React.js react库文件。React-dom.js是将react的虚拟dom转换为dom节点加入网页。Browser.js是将jsx代码转换成js

     

    搭建ant design+react 项目(安装webstorm+node.js(npm)

    a.npm install -g create-react-app yarn(对create-react-app这个脚手架进行全局安装)

    b.create-react-app antd-demo(创建名字为antd-demoreact项目)

    c.yarn add antd(引ant design 的组件库)

    d.npm start (启动项目)

     

    四、演示demo样例,进行操作演示,并结合demo代码进行讲解。

  • 相关阅读:
    JSON.parse解决Unexpected token ' in JSON at position 1报错
    angularjs $scope与this的区别,controller as vm有何含义?
    angularjs link compile与controller的区别详解,了解angular生命周期
    理解Promise.all,Promise.all与Promise.race的区别,如何让Promise.all在rejected失败后依然返回resolved成功结果
    angularjs 一篇文章看懂自定义指令directive
    js 记录几个因惯性思维引发的代码BUG,开发思维方式的自我反省
    js forEach参数详解,forEach与for循环区别,forEach中如何删除数组元素
    angularjs ng-if妙用,ng-if解决父子组件异步传值
    JS 从内存空间谈到垃圾回收机制
    Markdown数学公式语法
  • 原文地址:https://www.cnblogs.com/zyx-blog/p/9055770.html
Copyright © 2011-2022 走看看