分享好友 最新动态首页 最新动态分类 切换频道
react的usestate的数据渲染到页面的延迟 react数据渲染的过程
2024-12-26 15:20

其实我们在访问客户端渲染的页面时,请求到的只是一个 html 空壳,里面引入了一个 js 文件,所有的内容都是通过 js 进行插入的,正是因为页面是由 js 渲染出来的,所以会带来如下几个问题:

react的usestate的数据渲染到页面的延迟 react数据渲染的过程

1、页面要等待 js 加载,并执行完成了才能展示,。

2、爬虫不能识别 js 内容,所以抓取不到任何数据,。

那如果请求到的直接是一个渲染好的页面,是不是就可以解决这 2 个问题了呢?

没错,服务器端渲染就是这个原理。

1、服务器端使用 renderToString 直接渲染出包含页面信息的。

2、客户端根据渲染出的静态 html 进行,做一些绑定事件等操作。

服务器端没有 DOM,Window 等概念,所以只能渲染出字符串,不能进行事件绑定,样式渲染等。

只有第一次访问页面时才使用服务器端渲染,之后会被客户端渲染接管。

接下来我们一起来写一个 React 服务器端渲染 Demo。

这里使用 react-router 对前后端代码进行同构。

1、客户端

使用 react-router-dom 下的  进行前端路由控制。

2、服务器端

使用 react-router-dom 下的  进行静态路由控制,具体操作如下:

  • 使用 react-router-config 下的 matchRoutes 匹配后端路由,使用 renderRoutes 渲染匹配到的路由。
  • 使用 react-router-dom/server 下的 renderToString 方法,渲染出 html 字符串,并返回给前端。

使用 StaticRouter 中通过 context 可以和前端页面通信,传参。

在 React 中,我们常常使用 redux 来存储数据,管理状态。

1、客户端

使用 redux 进行状态管理,使用 react-redux 提供的 Provider 为组件注入 store。

2、服务器端

和客户端一样,但每一次接收到请求需产生一个新的 store,避免多个用户操作同一个 store。

1、客户端

使用 axios 在 componentDidMount 中请求数据。

2、服务器端

同样使用 axios 去请求数据,但是服务器端不会触发 componentDidMount 生命周期。我们可以在后端匹配到路由的时候,进行数据请求,并把数据存入 redux 中的 store,然后渲染出包含数据的 html 页面,为了避免客户端二次请求,服务器端向 window 中注入 REDUX_STORE 数据,客户端直接使用此数据作为客户端 redux 的初始数据,以免发生数据抖动。

具体操作如下:

  • 在 routes 对象上挂载一个自定义方法 loadData。
  • 在服务器端 matchRoutes 后,如果有 loadData,则进行请求数据,并把请求到的数据写入 store 中。
  • 服务器端等待请求完成后,再进行 renderToString 渲染。

1、客户端

使用 css-loader,style-loader 打包编写好的 css 代码并插入到页面中。

2、服务器端

由于 style-loader 会插入到页面,而服务器端并没有 document 等概念,所以这里使用 isomorphic-style-loader 打包 css 代码。

  • 引入 isomorphic-style-loader 后,客户端就可以通过 styles._getCss 方法获取到 css 代码。
  • 通过 staticRouter 中的 context 把 css 代码传入到后端。
  • 后端拼接好 css 代码,然后插入到 html 中,最后返回给前端。

SEO 主要是针对搜索引擎进行优化,为了提高网站在搜索引擎中的自然排名,但搜索引擎只能爬取落地页内容(查看源代码时能够看到的内容),而不能爬取 js 内容,我们可以在服务器端做优化。

常规的 SEO 主要是优化:,,

  • 内部链接尽量保持相关性
  • 外部链接尽可能多
  • 多媒体尽量丰富

由于网页上的文字,链接,图片等信息都是产品设计好的,技术层面不能实现优化。我们需要做的就是优化页面的 title,description 等,让爬虫爬到页面后能够展示的更加友好。

这里借助于 react-helmet 库,在服务期端进行 title,meta 等信息注入。

现在,我们成功地通过服务器端渲染解决了和 。但也带来了一些问题:

  • 服务器端压力增大。
  • 引入了 node 中间层,可维护性增大。

以上两个问题归根结底还是钱的问题。服务器压力大,可以通过买更多的服务器来解决。可维护性增大,可以招募更多人来维护。但是对于小型团队来说,增加服务器,招募更多维护人员,都会额外增加的支出,所以在选择服务器端渲染时,要权衡好利弊。

如果只是想优化 SEO,不妨使用预渲染来实现,推荐使用 prerender 库来实现。

prerender 库的原理:,这样爬虫获取到的页面就是已经渲染好的页面。prerender 库在使用时会开启一个服务,通过传递 url 来解析客户端渲染页面,这就需要我们对服务器端架构进行调整。

1、 nginx 判断访问类型

2.1、 用户访问 :直接走客户端渲染

2.2、 爬虫访问 :走预渲染


最新文章
2024年绝缘子十大品牌
一、什么是绝缘子绝缘子是安装在不同电位的导体或导体与接地构件之间的能够耐受电压和机械应力作用的器件。绝缘子种类繁多,形状各异。不同类型绝缘子的结构和外形虽有较大差别,但都是由绝缘件和连接金具两大部分组成的。绝缘子是一种特殊
2025广东选调生报名推荐表填写全流程_开平市文化广电旅游体育局四级主任科员以下岗位已有1人报名
  广东选调生考试网提供以下选调生选调生信息:2025广东选调生报名推荐表填写全流程_开平市文化广电旅游体育局四级主任科员以下岗位已有1人报名,更多关于2025广东选调生报名推荐表填写全流程,开平市文化广电旅游体育局四级主任科员以下
2024年抖音广告淘积木页面广告怎么搭建投放的
2024年抖音广告淘积木页面广告怎么搭建投放的创建淘积木页面:首先,你需要在阿里妈妈后台创建淘积木页面。这可以通过进入智钻,点击顶部菜单栏的“淘积木”,然后选择“创建新页面”来完成。选择合适的模板,点击“开始制作”,在弹窗中输
36漫画app最新
在当今科技飞速发展的时代,移动应用程序一日千里,为我们的生活提供了许多便利。例如36漫画这样的应用程序,为漫画爱好者带来了新的阅读体验。这款应用堪称漫画控的福音,它集合了众多热门日韩漫画,并且提供免费阅读。下面就让我们详细了
100个WordPress常用插件精选
下文是老文了,但发现还是很有参考价值,留下来备忘!插件的安装方法:进入后台——插件——添加新插件,然后在里面搜索插件的名字,在线安装即可。如图所示:WordPress是目前最流行的博客系统,良好的扩展性让它拥有源源不绝的插件支持。
AI的新探索:如何利用AI写出热门的短视频剧本?
在当今内容爆炸的时代,短视频以其快速、简洁的特点逐渐成为广大用户的首选。但对于运营及自媒体人员而言,如何在不违反平台规定和广告法的前提下,创作出引人入胜的短视频内容,却一直是一个挑战。本文将详细探讨如何利用AI工具,打破内容
360借条怎么协商延期3年还款
小编导语在当今社会,随着消费观念的变化和网络金融的发展,越来越多的人选择通过借款来满足日常生活的需要。360借条作为一种普遍的借款方式,受到了许多人的青睐。有时候由于个人经济状况的变化,借款人可能面临还款困难。在这种情况下,
AI写作平台:全方位助力内容创作!
### AI写作平台:全方位助力内容创作!在数字化时代,内容创作已成为连接世界的重要桥梁无论是新闻报道、学术论文、创意小说,还是商业文案、社交媒体帖子,优质的内容创作不仅丰富了人们的精神世界,更是推动了社会进步和经济发展的关键力
12月16日精选热点:豆包再传重磅利好,这些概念股有望涨停潮
1、豆包概念:字节跳动与北京大学成立“豆包大模型系统软件联合实验室”近日,北京大学-字节跳动“豆包大模型系统软件联合实验室”签约仪式暨“面向大模型的智能化软件技术与生态”学术研讨会在北京大学英杰交流中心隆重举行。与会专家们一
AI生成PPT免费工具有哪些?教你又快又好地完成PPT制作任务
如今,在现代职场与学术交流中,PPT演示已然成为传递信息、打动观众的关键手段。 然而,面对繁复的设计抉择、内容编排与视觉呈现的压力,很多人并不能处理好各种因素之间的关系,因此让PPT演示的整体效果受
相关文章
推荐文章
发表评论
0评