You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constexpress=require('express')constapp=express()app.get('/',(req,res)=>res.send(`<html> <head> <title>ssr demo</title> </head> <body> Hello world </body></html>`))app.listen(3000,()=>console.log('Exampleapp listening on port 3000!'))
一、是什么
在SSR中,我们了解到
Server-Side Rendering
,简称SSR
,意为服务端渲染指由服务侧完成页面的
HTML
结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程其解决的问题主要有两个:
二、如何做
在
react
中,实现SSR
主要有两种形式:这里主要以手动搭建一个
SSR
框架进行实现首先通过
express
启动一个app.js
文件,用于监听3000端口的请求,当请求根目录时,返回HTML
,如下:然后再服务器中编写
react
代码,在app.js
中进行应引用为了让服务器能够识别
JSX
,这里需要使用webpakc
对项目进行打包转换,创建一个配置文件webpack.server.js
并进行相关配置,如下:接着借助
react-dom
提供了服务端渲染的renderToString
方法,负责把React
组件解析成html
上面的过程中,已经能够成功将组件渲染到了页面上
但是像一些事件处理的方法,是无法在服务端完成,因此需要将组件代码在浏览器中再执行一遍,这种服务器端和客户端共用一套代码的方式就称之为同构
重构通俗讲就是一套React代码在服务器上运行一遍,到达浏览器又运行一遍:
浏览器实现事件绑定的方式为让浏览器去拉取
JS
文件执行,让JS
代码来控制,因此需要引入script
标签通过
script
标签为页面引入客户端执行的react
代码,并通过express
的static
中间件为js
文件配置路由,修改如下:然后再客户端执行以下
react
代码,新建webpack.client.js
作为客户端React代码的webpack
配置文件如下:这种方法就能够简单实现首页的
react
服务端渲染,过程对应如下图:在做完初始渲染的时候,一个应用会存在路由的情况,配置信息如下:
然后可以通过
index.js
引用路由信息,如下:这时候控制台会存在报错信息,原因在于每个
Route
组件外面包裹着一层div
,但服务端返回的代码中并没有这个div
解决方法只需要将路由信息在服务端执行一遍,使用使用
StaticRouter
来替代BrowserRouter
,通过context
进行参数传递这样也就完成了路由的服务端渲染
三、原理
整体
react
服务端渲染原理并不复杂,具体如下:node server
接收客户端请求,得到当前的请求url
路径,然后在已有的路由表内查找到对应的组件,拿到需要请求的数据,将数据作为props
、context
或者store
形式传入组件然后基于
react
内置的服务端渲染方法renderToString()
把组件渲染为html
字符串在把最终的html
进行输出前需要将数据注入到浏览器端浏览器开始进行渲染和节点对比,然后执行完成组件内事件绑定和一些交互,浏览器重用了服务端输出的
html
节点,整个流程结束参考文献
The text was updated successfully, but these errors were encountered: