内容简介:富婆来报道,今天想问题想不出来,随手抓了一下头发,没想到啊没想到,我那浓(mei)密(sheng)茂(ji)盛(gen)的秀发又少了好几根,一定要改掉这个想不出来问题就揪头发的坏习惯。你们遇到问题想不出来都会有啥奇特的习惯呢?想象一下妙龄美少女长发飘飘变成三毛的形象(科普:女性秃顶的概率是极低的不会变成英国皇室威廉王子那样代代传,可怜新出生的哈里王子的儿子,这个世界上又多了一个秃头的人),秃头要怎么办呢,只能努力学习挣钱,然后用掉头发挣来的钱再去植发。。。循环。。。今天分享一篇公司大佬的文章,非常厉害的大神
富婆来报道,今天想问题想不出来,随手抓了一下头发,没想到啊没想到,我那浓(mei)密(sheng)茂(ji)盛(gen)的秀发又少了好几根,一定要改掉这个想不出来问题就揪头发的坏习惯。你们遇到问题想不出来都会有啥奇特的习惯呢?
想象一下妙龄美少女长发飘飘变成三毛的形象(科普:女性秃顶的概率是极低的不会变成英国皇室威廉王子那样代代传,可怜新出生的哈里王子的儿子,这个世界上又多了一个秃头的人),秃头要怎么办呢,只能努力学习挣钱,然后用掉头发挣来的钱再去植发。。。循环。。。
今天分享一篇公司大佬的文章,非常厉害的大神(崇拜脸),讲讲react服务端渲染。大家也可以自己动手实践一下。
React服务端渲染
写过React组件的同学都知道,React组件一般是基于浏览器端使用js渲染的。它所生成的Dom结构都是后期由js计算生成。如下图,我们可以看到页面源文件中id为root中的dom结构实际是空的。但实际在element元素中,已经可以看到Dom树的生成了。
客户端渲染DOM结构图
服务端渲染DOM结构图
React服务端渲染(简称SSR),也就是在服务器端直接渲染React组件,使用户在首屏便能感受到Dom树的存在,在页面html文件生成的同时,Dom结构也就存在了。用户看到的源文件即为图2。 那么为什么要使用服务端渲染呢?客户端渲染不是更能减轻服务端负担吗? 我们来看下
为什么要使用服务端渲染
简单了解了React-SSR,那么我们使用服务端渲染的目的主要是为了解决如下几大难题:
1、搜索引擎优化(seo)
因React组件采用js在浏览器中渲染,实际搜索引擎爬虫爬到的数据也就是图一中的没有DOM结构的数据。,及其不友好,如图1。
2、可以解决首屏白屏问题
Js渲染的组件需要消耗性能,故在性能较差的终端中,浏览器端渲染组件所消耗的时间就会比较长。在浏览器执行js渲染组件时,对用户而言,就是所谓的白屏。
开启服务端渲染前
开启服务端渲染后
开启前后script计算时间对比
如果你的项目存在上面的问题,而又不想抛弃React组件,可以尝试使用React服务端渲染。 服务端渲染,它到底用了什么原理呢?
服务端渲染原理
服务端渲染的方式有很多,主流的服务端语言为使用nodejs渲染。下图为简单原理图:
服务端渲染简单流程图
简单概括就是这三步骤:
1、客户端发起请求
2、Nodejs服务器分析页面数据结构并渲染React组件
3、客户端展示html
实例解说
下面我们来看下具体实例,实例是基于express的React服务端组件渲染实例。Express提供页面以及中间层的API(点击tab切换调用的接口)服务,Webpack实现服务端和客户端的React组件打包。
界面预览
总共包含一个页面、两个组件。其中组件一、二均能将首屏数据返回,同时在客户端重新执行react组件渲染。
首屏DOM结构
实例地址:(这是一个express_react_ssr脚手架) github.com/webqdtalk/e…
运行环境
Nodejs:6.9.0 不限于此版本 Webpack:3.5.2 不限于此版本 Package.json及相关说明 复制代码
这是Package.json:
{ "name": "react-express-ssr", "version": "0.0.0", "private": true, "scripts": { "start": "webpack --progress && node ./bin/www" }, "dependencies": { "axios": "^0.18.0", //实现组件中ajax请求 "babel-core": "^6.24.0", //打包react组件 "babel-loader": "^6.4.1", //打包react组件 "babel-preset-es2015": "^6.24.0",//打包react组件 "babel-preset-react": "^6.23.0",//打包react组件 "cookie-parser": "~1.4.3", //express依赖 "css-loader": "^0.23.1", //express依赖 "debug": "~2.6.9", //express依赖 "ejs": "~2.5.7", //express依赖 "express": "~4.16.0", //express依赖 "extract-text-webpack-plugin": "^2.1.0",//打包scss文件依赖 "http-errors": "~1.6.2",//express依赖 "morgan": "~1.9.0",//express依赖 "node-sass": "^4.5.1", //打包scss文件依赖 "react": "^16.8.6",//打包react组件 "react-dom": "^16.8.6",//打包react组件, "sass-loader": "^6.0.3",//打包scss文件依赖 "style-loader": "^0.13.0",//打包scss文件依赖 "webpack": "^3.5.2" //打包react组件 }, "devDependencies": { "babel-preset-env": "^1.7.0", "babel-register": "^6.26.0" } } 复制代码
Clone项目后,直接在根目录执行npm i
安装完成后运行npm start并打开浏览器访问localhost:3000就可以访问了。
重要模块说明 页面入口文件配置 当执行npm start并访问localhost:3000后,express入口文件app.js中引入了server/index.js
App.js
服务端路由如何实现
Express提供router方法
router.get('/urlpath', function(req, res, next) { const html=ReactDOMServer.renderToStaticMarkup(<App />); res.render(‘pageejs’, { title:"服务端渲染",content: html }); }); 复制代码
如何实现服务端渲染
Webpack入口文件:server/index.js中引入了components中的组件,并执行 ReactDOMServer.renderToStaticMarkup 方法,将组件在服务端渲染为页面DOM结构字符串,再由express提供页面服务,在ejs模板中输出。
图四中的两个api接口是为了点击tab时请求数据用。图五为ejs模板文件。
Server/index.js
Views/index.ejs
服务端和客户端如何打包组件? Webpack配置如下:
Webpack.config.js
客户端渲染的入口文件为/components/app.js,也包含了服务端的入口文件,保证了服务端和客户端使用同一套组件输出,同时也保证在服务端渲染结束后,客户端组件能够继续正常运转。
Components/app.js
服务端渲染的入口文件为components/index.js
如下图中可以看到此入口文件中引用了两个额外的组件:swichtab和ssrplugin,就跟纯前端渲染的react组件基本一致!
Components/index.js
客户端打包组件后输出在public/main.css和public/index.js,在视图文件views/index.ejs中引用实现客户端渲染。
实践过程的注意点
1.express无法执行import 导致报错。
解决方案:npm i babel-register --save 同时在bin/www中配置babel-register
require('babel-register')({ presets: ['env'] }); 复制代码
2.服务端渲染css或者scss文件时报错
解决方案:因服务端直接运行css或者scss等文件会导致语法报错,故在实际组件中,需要对require的scss文件进行容错或者动态按需加载。
try{ require('./index.scss') //因服务端渲染不需要scss文件,但webpack仍会处理scss文件,打包scss会出错,此处需要作为容错处理或按需加载 }catch(e){ console.log(e.message); } 复制代码
服务端渲染虽好,但是对项目的改造影响还是比较大的,改造需谨慎评估~
以上所述就是小编给大家介绍的《秃头思考:react服务端渲染》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- B站 Up 主自制秃头生成器,圆你秃头梦想可好?
- 撩起秃头,直接学
- 拥有这样一份修炼指南,可以让你成为不秃头的数据工程师!
- 小帅一点资讯 V2.0.9.5 发布,增加一键秃头、生发、蚂蚁呀嘿、虚拟主播
- B站Up主自制秃头生成器,一键get张东升同款发型,网友:秃的太过真实
- Octane渲染入门-渲染设置图文版
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python高级编程(第二版)
[波兰] Michał Jaworski、[法] Tarek Ziadé / 张亮、阿信 / 人民邮电出版社 / 2017-9-19 / 89.00元
Python作为一种高级程序设计语言,凭借其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言之一。 本书基于Python 3.5版本进行讲解,通过13章的内容,深度揭示了Python编程的高级技巧。本书从Python语言及其社区的现状开始介绍,对Python语法、命名规则、Python包的编写、部署代码、扩展程序开发、管理代码、文档编写、测试开发、代码优化、并发编程、设计模式等重要话题......一起来看看 《Python高级编程(第二版)》 这本书的介绍吧!