react框架基础问题(按需导入?)

React是近几年来前端项目开发非常火的一个框架,其背景是Facebook团队的技术支持,市场占有率也很高。很多初学者纠结一开始是学react还是vue。个人觉得,有时间的话,最好两个都掌握一下。

(5)数据流解决方案redux

react的优缺点以及特点

ponent创建的组件,其成员函数不会自动绑定this,如果我们没有手动绑定this,就不能获取当前组件实例对象。

ponent有三种手动绑定方法

如何选择哪种方式创建组件

只要有可能,尽量使用无状态组件。

如果需要state、生命周期方法等,使用class的创建组件

react在哪个生命周期做优化?

因为 dom 的重绘非常消耗性能,所以可以在这个方法中去做dom的diff算法的优化,这样就可以极大的提高性能。

但对于我们中级工程师来说,一般我不会去修改shouldComponentUpdate这个方法。而是直接去使用。True/false

react组件间传值。(组件间通信方式)

   (1)props传值,父组件通过props向子组件传值,子组件通过回调函数向父组件传值

跨级组件间双向通信:使用 context 对象,根组件和其他所有子孙通信,

不太适合组件间通信(可以实现,不好维护)

   (4)使用事件订阅实现非嵌套组件间通信,也可以实现跨级组件间通信

props:一般用于父组件向子组件通信,在组件之间通信使用。

state:一般用于组件内部的状态维护,更新组件内部的数据状态,更新子组件的props等。

在react如何阻止冒泡事件?

阻止冒泡事件分两种情况

补充:如何阻止事件冒泡、阻止默认动作?

对react中事件机制的理解

Reac事件是合成事件,不是原生事件。

合成事件和原生事件的区别:

在React中如何获取真实dom?

通过refs获得 DOM 元素或者某个组件实例。

我们可以为元素添加 ref 属性,在回调函数中接收该DOM元素,该DOM元素会作为回调函数的第一个参数返回。

为什么虚拟DOM可以提高性能?

当数据变化的时候,无需整体的重新渲染,而是局部刷新。虚拟DOM它是以js的形式存在,计算性能会比较好。而且由于减少对真实DOM的操作次数。性能会有很大提升。

diff算法原理 / 什么是diff算法(diff算法的理解)

对新旧两棵DOM树进行同层比较。

给每层元素添加唯一的 key 值。提高diff算法效率。

调用组件setState 方法的时候, React 将它标记为 dirty.到每一个事件循环结束, React 检查所有标记 dirty 的组件 重新渲染.这样就实现了局部刷新的效果。

在开发过程中,我们需要保证某个元素的 key 在其同级元素中具有唯一性。在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建的还是被移动而来的元素,从而减少不必要的元素重渲染。此外,React 还需要借助 Key 值来判断元素与本地状态的关联关系,因此我们绝不可忽视转换函数中 Key 的重要性。

}

全网最完整的 React SSR 同构技术原理解析与实践,从零开始手把手带你打造自己的同构应用开发骨架,帮助大家彻底深入理解服务端渲染及底层实现原理,学完本课程,你也可以打造自己的同构框架。


前段时间一直在研究react ssr技术,然后写了一个完整的ssr开发骨架。今天写文,主要是把我的研究成果的精华内容整理落地,另外通过再次梳理希望发现更多优化的地方,也希望可以让更多的人少踩一些坑,让跟多的人理解和掌握这个技术。

相信看过本文(前提是能对你的胃口,也能较好的消化吸收)你一定会对 react ssr 服务端渲染技术有一个深入的理解,可以打造自己的脚手架,更可以用来改造自己的实际项目,当然这不仅限于 react ,其他框架都一样,毕竟原理都是相似的。

为什么要服务端渲染(ssr)

至于为什么要服务端渲染,我相信大家都有所闻,而且每个人都能说出几点来。

在 SPA 模式下,所有的数据请求和 Dom 渲染都在浏览器端完成,所以当我们第一次访问页面的时候很可能会存在“白屏”等待,而服务端渲染所有数据请求和 html内容已在服务端处理完成,浏览器收到的是完整的 html 内容,可以更快的看到渲染内容,在服务端完成数据请求肯定是要比在浏览器端效率要高的多。

有些网站的流量来源主要还是靠搜索引擎,所以网站的 SEO 还是很重要的,而 SPA 模式对搜索引擎不够友好,要想彻底解决这个问题只能采用服务端直出。改变不了别人(搜索yinqing),只能改变自己。

只实现 SSR 其实没啥意义,技术上没有任何发展和进步,否则 SPA 技术就不会出现。

但是单纯的 SPA又不够完美,所以最好的方案就是这两种体验和技术的结合,第一次访问页面是服务端渲染,基于第一次访问后续的交互就是 SPA 的效果和体验,还不影响SEO 效果,这就有点完美了。

单纯实现 ssr 很简单,毕竟这是传统技术,也不分语言,随便用 php 、jsp、asp、node 等都可以实现。

但是要实现两种技术的结合,同时可以最大限度的重用代码(同构),减少开发维护成本,那就需要采用 react 或者 vue 等前端框架相结合 node (ssr) 来实现。

本文主要说 React SSR 技术 ,当然 vue 也一样,只是技术栈不同而已。

整体来说 react 服务端渲染原理不复杂,其中最核心的内容就是同构。

在把最终的 html 进行输出前需要将数据注入到浏览器端(注水),server 输出(response)后浏览器端可以得到数据(脱水),浏览器开始进行渲染和节点对比,然后执行组件的componentDidMount 完成组件内事件绑定和一些交互,浏览器重用了服务端输出的 html 节点,整个流程结束。

技术点确实不少,但更多的是架构和工程层面的,需要把各个知识点进行链接和整合。

路由匹配其实就是对 组件path 规则的匹配,如果规则不复杂可以自己写,如果情况很多种还是使用官方提供的库来完成。

//将组件渲染为 html 字符串

 
 

react-router-config 这个库由react 官方维护,功能是实现嵌套路由的查找,代码没有多少,有兴趣可以看看。

文章走到这里,相信你已经知道了路由同构,所以上面的第一个问题 : 【双端路由如何维护?】 解决了。

这里开始解决我们最开始发现的第二个问题 - 【获取数据的方法和逻辑写在哪里?】

数据预取同构,解决双端如何使用同一套数据请求方法来进行数据请求。

先说下流程,在查找到要渲染的组件后,需要预先得到此组件所需要的数据,然后将数据传递给组件后,再进行组件的渲染。

我们可以通过给组件定义静态方法来处理,组件内定义异步数据请求的方法也合情合理,同时声明为静态(static),在 server 端和组件内都也可以直接通过组件(function) 来进行访问。

//数据预取方法 静态 异步 方法

Async 容器组件接收一个 props 传过来的 load 方法,返回值是 Promise类型,用来动态导入组件。

没有介绍结合 redux 状态管理的 ssr 实现,其实也不复杂,关键还是看业务中是否需要使用redux,因为文中已经实现了使用 context 传递数据,直接改成按store 传递也很容易,但是更多的还是对 react-redux 的应用。


//渲染入口 代码仅供参考 

服务端同构渲染虽然可以提升首屏的出现时间,利于 SEO,对低端用户友好,但是开发复杂度有所提高,代码需要兼容双端运行(runtime),还有一些库只能在浏览器端运行,在服务端加载会直接报错,这种情况就需要进行做一些特殊处理。

同时也会大大的增加服务端负载,当然这都容易解决,可以改用renderToNodeStream() 方法通过流式输出来提升服务端渲染性能,可以进行监控和扩容,所以是否需要 ssr 模式,还要看具体的产品线和用户定位。

本文最初从 react ssr 的整体实现原理上进行说明,然后逐步的抛出问题,循序渐进的逐步解决,最终完成了整个React SSR 所需要处理的技术点,同时对每个技术点和问题做了详细的说明。

但实现方式并不唯一,还有很多其他的方式, 比如 next.js, umi.js,但是原理相似,具体差异我会接下来进行对比后输出。

由于上面文中的代码较为零散,恐怕不能直接运行。为了方便大家的参考和学习,我把涉及到代码进行整理、完善和修改,增加了一些基础配置和工程化处理,目前已形成一个完整的开发骨架,可以直接运行看效果,所有的代码都在这个骨架里,欢迎star 欢迎 下载,交流学习。

很多东西都可以基于你现有的知识创造出来。

只要明白了其中的原理,然后梳理出实现的思路,剩下的就是撸代码了,期间会大量的自动或被动的从你现有的知识库里进行调取,一步一步的,只要不怕麻烦,都能搞得定。

这也是我为什么上来先要说下reac ssr 原理 的原因,因为它指导了我的实践。

全文都是自己亲手一个一个码出,也全部都是出自本人的理解,但个人文采有限,所以导致很多表达说的都是大白话,表达不够清楚的地方还请指出和斧正,但是真正的核心已全部涵盖。

希望本文的内容对你有所帮助,也可以对得住我这个自信的标题。



更多精彩好玩有用的前端内容,请关注公众号《前端张大胖》

}

我要回帖

更多关于 react前端框架 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信