所谓server render 即服务端渲染,这是为了解决现代前端框架下的单页应用在SEO方面不友好的问题。

react 的SSR主要思路就是

1.将应用的根组件导出 如 <App />

2.在服务器node端 引用 <App /> ,通过'react-dom/server'下的ReactSSR将组件转换成真实的DOM字符串,像这种

<div data-reactroot="">this is app component</div>

3.然后通过node 的fs 模块 导入要渲染的HTML文件,注意,此处要指定编码格式

const template = fs.readFileSync(path.join(__dirname,'../../dist/index.html'),'utf8')

该HTML文件即前端打包后的HTML文件,比如这种

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"><!-- app --></div>
<script type="text/javascript" src="/public/vendor.197e0591260e3f2808db.js"></script><script type="text/javascript" src="/public/app.197e0591260e3f2808db.js"></script></body>
</html>

这里面的<!-- app -->左右都不能有空格有换行,否则会有一个warning

4.通过fs模块取到的html是个字符串,这里面包含了打包后的js,我们的目的是不让js去渲染页面,也就是一打开就必须有内容,不能白屏,所以返回的页面中要包含之前取到的真实DOM字符串

,那么只要将html中的<!-- app -->替换了就行了

最后启动node 又报了个warning

react-dom.development.js:10253 Warning: render(): Calling ReactDOM.render() to hydrate server-rendered markup will stop working in React v17. Replace the ReactDOM.render() call with ReactDOM.hydrate() if you want React to attach to the server HTML.

意思就是要把之前的render换成hydrate,由于返回的页面已经带有内容,这个方法会检查页面上的内容跟js要生成的DOM是否一直,如果不一致则会按jS中的重新渲染。

代码组织

由于要使用node的服务器返回页面,所以会有两套环境,一套前端一套后端

由于在服务器端没有dom,

render(<App />,document.getElementById('app'))

所以这段代码是不能运行在Node上的,只需要将<App />导出就行了

由于服务器端和前端用的js不一样 所以webpack会有两个,服务器用的webpack.config.js可在之前的文件上修改

1.添加target:"node",

2.打包后的文件名不需要加hash

3.在output中添加libraryTarget:'commonjs2'

4.删除多余元素

最后像这样

import path from "path"

export default {
target:"node",
entry:{
serverEntry: path.join(__dirname,"../src/client/server-entry.js")
},
output:{
filename:"[name].js",
path: path.join(__dirname,"../dist"),
publicPath:'/public',
libraryTarget:'commonjs2'
},
module:{
rules:[
{
test:/\.jsx$/,
loader:'babel-loader'
},
{
test: /\.js$/,
exclude: /node_modules\/(?!(dom7|ssr-window|swiper)\/).*/,
loader: "babel-loader"
},
]
}
}

最后运行脚本

React 的 server render 初步学习的更多相关文章

  1. React初步学习-利用React构建个人博客

    React初步学习-利用React构建个人博客 用React和Webpack写了一个很简单的个人博客,主要是想要熟悉一下react中各种基本基本属性及方法的使用.在构建过程中碰到不少问题,通过阅读官方 ...

  2. 状态保持以及AJAX的初步学习

    嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...

  3. 初步学习pg_control文件之十五

    接前文  初步学习pg_control文件之十四 再看如下这个: int MaxConnections; 应该说,它是一个参考值,在global.c中有如下定义 /* * Primary determ ...

  4. 初步学习pg_control文件之十三

    接前文,初步学习pg_control文件之十二 看这个: * backupStartPoint is the redo pointer of the backup start checkpoint, ...

  5. 初步学习pg_control文件之九

    接前文,初步学习pg_control文件之八 来看这个: pg_time_t time; /* time stamp of last pg_control update */ 当初初始化的时候,是这样 ...

  6. json2.js的初步学习与了解

    json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...

  7. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  8. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...

  9. EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库

    前提:搭建成功codefirst相关代码,参见EF Codefirst  初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...

随机推荐

  1. 编写高质量代码改善C#程序的157个建议——建议132:考虑用类名作为属性名

    建议132:考虑用类名作为属性名 一般来说,若果属性对应一个类型,应该直接用类型名命名属性名.如下: class Person { public Company Company { get; set; ...

  2. access函数使用

    调用open函数时,是以有效用户而不是实际用户的身份去验证进程对要打开的文件的读写权限.但是有时候我们想知道的是实际用户而非有效用户对某一文件的权限,此时就要用到access函数.   函数原型:in ...

  3. 基于Struts2开发快递收发系统 毕业设计 源码

    基于Struts2开发快递收发系统 开发环境:  Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat6+MySql数据库 运行效果图: 此源码经过详细测试 保证 ...

  4. [LeetCode 题解]: Permutations

    Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...

  5. SQL Server分页模板

    SQL Server分页模板 WITH T AS ( SELECT ROW_NUMBER() OVER(ORDER BY AlbumId ) AS row_number, * FROM (SELECT ...

  6. MVC MVC常见错误及解决办法

    MVC常见错误及解决办法 问题1: 必须添加对程序集“EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5 ...

  7. 波利亚(Polya)罐子模型

    (波利亚(Polya)罐子模型)罐中有a个白球,b个黑球,每次从罐中随机抽取一球,观察其颜色后,连同附加的c个同色球   (波利亚(Polya)罐子模型)罐中有a个白球,b个黑球,每次从罐中随机抽取一 ...

  8. Camel Games借助AWS在爆发式增长中提供优质游戏体验

    关于Camel Games Camel Games 成立于2009年,是中国首家得到google市场官方认证的顶尖开发公司.长期以来,Camel Games始终依靠于率先的技术背景,致力于成为国际一流 ...

  9. “全栈2019”Java第二十二章:控制流程语句中的决策语句if-else

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. 数据库管理工具navicat基本使用方法——以MySql为例

    mysq数据库管理工具navicat基本使用方法 https://www.cnblogs.com/neuedu/p/5876874.html