React SSR样式及SEO的实践

news/2024/4/27 20:33:00/文章来源:https://blog.csdn.net/weixin_33713503/article/details/88659610

前一篇主要记录了一下SSR配置以及结合Redux的使用。这里简单说一下React SSR中样式处理和更优雅的SEO

SSR样式
在React客户端渲染,添加样式很容易。写一个css样式文件,在对应组件中引用。标签上通过className这个属性调用对应样式就万事Ok了。当然我们需要在webpack中配置loader来解析css文件。一般的配置如下(使用css modules):

module: {rules: [{test: /\.css?$/,use: ['style-loader', {loader: 'css-loader',options: {importLoader: 1,modules: true,localIdentName: '[name]_[local]_[hash:base64:5]'}}]}]
}

需要先通过css-loader解析css文件,之后再通过style-loader将样式放在html的style标签中。

那么SSR也这样行吗~

yarn dev

跑一下服务,发现命令行报这个错误:

return window && document && document.all && !window.atob;
^ReferenceError: window is not defined

原因在于服务器端渲染哪里有window对象,哪里有DOM啊。我们是通过虚拟DOM。renderToString这个方法生成出来的html字符串。stackoverflow搜了一下发现了isomorphic-style-loader这个专门用于同构的style-loader。

话不多少搞起来。客户端的webpack配置不需要变更还是使用css-loader+style-loader。服务器端就使用css-loader+isomorphic-style-loader了(和style-loader用法一波一样)

// webpack.server.jsmodule: {rules: [{test: /\.css?$/,use: ['isomorphic-style-loader', {loader: 'css-loader',options: {importLoader: 1,modules: true,localIdentName: '[name]_[local]_[hash:base64:5]'}}]}]}

配置好了Run一下,不报错了但是会闪一下屏。禁用掉js发现server端生成的html并没有样式,当客户端JS接管程序之后才会有样式出现。这样的体验相当糟糕。
当然我们确实没有向服务器端生成的HTML添加style标签。
现在服务器返给我们的html是这样的

return `<html><head><title>ssr</title></head><body><div id='root' >${ content }</div><script>window.context = {state: ${ JSON.stringify(store.getState()) }}</script><script src='/index.js' ></script></body></html>

这时我们想到了context这个玩意。在server端render之前。我们设置一个

let context = {css: []
}

我们还知道在服务端渲染的时候有this.props.staticContext这样一个props拿到我们设置context。另外isomorphic-style-loader提供给我们了
_getCss()这个方法。可以在SSR过程中拿到样式。有了这两个必要条件。我们就可以在每一个用到样式的Component中通过componentWillMount这个生命周期
添加这样一段代码:

componentWillMount () {if (this.props.staticContext) { // 只有服务端渲染时候有this.props.staticContext以及_getCss()this.props.staticContext.css.push(styles._getCss())}
}

这样样式就存储在context这个变量的css数组中咯,改造一下server端的html输出代码:

const cssStr = context.css.length ? context.css.join('\n') : ''return `<html><head><title>ssr</title><style>${cssStr}</style></head><body><div id='root' >${content}</div><script>window.context = {state: ${JSON.stringify(store.getState())}}</script><script src='/index.js' ></script></body></html>

万事?,当然我们可以进一步优化,把componentWillMount所做的事情提出来搞一个HOC(高阶组件)。

withStylesHOC.js

import React, {Component
} from 'react'export default (DecoratedComponent, styles) => {return class NewComponent extends Component {componentWillMount () {if (this.props.staticContext) {this.props.staticContext.css.push(styles._getCss())}}render () {return <DecoratedComponent {...this.props} />}}
}

这样简单的封装一个HOC,之后涉及样式的时候直接通过withStylesHOC包裹一下就好。例如一个结合Redux的Home组件:

export default connect(mapState, mapDispatch)(withStyle(Home, styles))

SSR-SEO
费大力气通过一个node中间层去实现首屏的SSR,除开首屏速度之外,就是SEO这一大块了,对于一个商业网站来讲真的很重要。
SEO(Search Engine Optimization)– 通过一些技术手段让网站在搜索引擎的排名尽量靠前一点。由于客户端渲染出来的网站只有<div id='root'>这样的html节点。大多数搜索引擎分析不出来网站上有什么。SSR直接渲染出来HTML,这样对搜索引擎就友好了很多。

SSR中的SEO
这里我们使用github上的一个库react-helmet首先需要在对应的页面组件中引入react-helmet,就可以在Helmet标签内自由添加title、meta咯

// Home.jax
import { Helmet } from 'react-helmet'
class Home extends Component {render() {return (<Fragment><Helmet><title>SRR-Home</title><meta name='description' content='this is a home Component' /></Helmet>......</<Fragment>>)}
}

之后按照readme所说的。在server端这样处理

ReactDOMServer.renderToString(<Handler />);
const helmet = Helmet.renderStatic();

并在返回的html字符串中 ${helmet.title.toString()} ${helmet.meta.toString()}进行填充

<html><head>${helmet.title.toString()}${helmet.meta.toString()}<style>${cssStr}</style></head><body><div id='root' >${content}</div><script>window.context = {state: ${JSON.stringify(store.getState())}}</script><script src='/index.js' ></script></body>
</html>

重新跑一下 搞定!

当然SSR-SEO绝不这么简单。仅仅在页面上添加head标签内加上title 和meta标签影响是有限的。8102年的搜索爬虫已经不单单去匹配title和 description,而是全稳的匹配(也就是说title和descript有影响但是影响很小)搜索爬虫会把整个网站所有的文本收集起来进行分析。

那么如何做好SEO
题外话顺便说一下如何做好SEO。一个网站无非三大块内容,文字、多媒体、链接。要做到的是文字的原创性,图片的原创性以及高清度还有站内链接尽量和站内内容相关。
为了学习工作与休闲娱乐互不冲突,现新建圈【码农茶水铺】用于程序员生活,爱好,交友,求职招聘,吐槽等话题交流,希望各位大神工作之余到茶水铺来喝茶聊天。了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_769509.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

塞尼铁克详解网站建设的三项必要职能

塞尼铁克详解网站建设的三项必要职能,网站建设在如今的社会是比较重要的&#xff0c;企业没有网站进行宣传&#xff0c;则客户通过网络获取不到相应的信息就会对企业产生不好的印象&#xff0c;甚至于对企业散失了兴趣。现在各行各业竞争这么厉害&#xff0c;企业本身应该尽量多…

在阿里云云服务器上发布自己的网站(建站|详细)

一、选购云服务器 到阿里云官网进行选购 1.2 云服务器购买方式 如果是可以学生优惠的话&#xff0c;可用学生优惠方式&#xff0c;其它用市场价购买 阿里云还有企业和个人的免费使用的云服务器 阿里云还提供通用代金券&#xff0c;可叠加官网常规优惠使用 1.3 选择系统 Windows…

zabbix免客户端监控网站URL

1.我们需要在zabbix服务器端(这台服务器需要能正常上网)同时安装zabbix-agent客户端&#xff0c;使其正常监控zabbix服务器 2.创建web监测 点击web监测 创建web监测 3.配置异常报警&#xff0c;在添加里找到类似的值和对应的刚才添加的网站&#xff0c;后面那个参数一般选择200…

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样&#xff0c;你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

如何仅使用javascript建立网站

JavaScript is one of the versatile language in the world. It allow us developers to build websites, servers, mobile apps, hardware and even AI. So it’s not a surprise that it’s one of the most popular programming languages in the world.JavaScript是世界上…

【前端教程】给网站添加暗黑模式指南

导读&#xff1a;给网站添加暗黑模式是随着macOS中的暗黑模式&#xff08;Dark Mode&#xff09;出现之后的一个热门话题。社区中有关于这方面的讨论也很多&#xff0c;都在围绕着怎么给网站添加暗黑模式。今天在这篇文章再次和大家一起聊聊这个已久的话题&#xff0c;不同的是…

html5 微软 跑分,微软Surface Phone现身HTML5跑分网站

IT之家讯 最近有关微软Win10新设备Surface Phone的消息日渐增多&#xff0c;但微软官方却从未提及此事&#xff0c;因此这些消息本身还都处于“流言”状态。不过“无风不起浪”&#xff0c;这些传闻可能最终还是要有“转正”的一天。最近这款Win10 Mobile新机Surface Phone又曝…

网站控制台的招聘信息使用console.log打印

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title> </head><body><script>let string1 () > {/*你在电脑前看这段文字&#xff0c;写文字的人…

CDN有什么用?我的网站到底需不需要CDN加速?

CDN的关键技术主要包括内容存储和分发技术。简单的讲尽量避开互联网上有可能zhi影响数据传输速率和稳定性的短板和环节&#xff0c;使内容传送得更快、更稳定。而从广义的角度&#xff0c;CDN代表了一种基于互联网而搭建的高质量、高效率、具有鲜明网络秩序的网络应用服务模式。…

大数据学习路线,从Linux基础到大型网站高并发处理项目实战

相信大家在学习大数据的时候都不知道怎么来学习&#xff0c;因为知识点太多了&#xff0c;也太杂了&#xff0c;没有一个系统的路线来引导大家学习. 为了解决大家这个困惑&#xff0c;小编整理了从Linux基础到大型网站高并发处理项目实战的学习路线和知识点&#xff0c;希望大家…

云服务优缺点_角点科技:建外贸网站用阿里云还是wordpress好?

建外贸网站用阿里云还是wordpress好&#xff1f;外贸网站更适合用wordpress&#xff0c;但是阿里云更加适合新手&#xff0c;因为新手用wordpress搭建网站还是蛮难的&#xff0c;接下来角点科技的小编就来大家分享一下阿里云和wordpress的优缺点&#xff0c;具体选择哪个还是可…

hyperv linux 编译配置,虚拟机的配置 - Hyper-V安装使用教程_Linux教程_Linux公社-Linux系统门户网站...

在Hyper-V成功新建一台虚拟机&#xff0c;在正式使用之前&#xff0c;必须配置VM使用的硬件资源&#xff0c;并授予用户访问VM的权限等&#xff0c;本文罗列出一些常见的配置&#xff0c;供读者参阅。一&#xff0c;为虚拟机分配使用的内存在Hyper-V Manager中&#xff0c;选中…

mysql做wp网站_30分钟教你搭建一个网站(四):以WordPress为例创建网站

30分钟教你搭建一个网站&#xff0c;全章分四节。上一节已经用wdcp搭建了环境&#xff0c;有了可视化的服务器管理后台&#xff0c;今天以WordPress为例创建网站应用&#xff0c;之前是搭基础配置&#xff0c;今天正式进入正文&#xff0c;教你真正用30分钟搭建网站。一、购买和…

面包屑导航是重新刷新页面?_怎样在wordpress网站模板中,添加面包屑导航功能模块?...

几乎在所有的wordpress网站中&#xff0c;我们都可以看到面包屑导航的身影(如下图)。面包屑导航&#xff0c;可以很方便地让我们了解到我们在这个wordpress网站中所在的位置&#xff0c;而且&#xff0c;我们还可以通过点击面包屑导航中的链接&#xff0c;进入到对应的页面。​…

用树莓派构建一台服务器,永久运行网站

目录 前言 树莓派是什么&#xff1f; 1. 用我的话理解 2. 市面上的型号 3. 树莓派 zero w 4. 更多树莓派 树莓派zero w安装系统 1. 准备 2. 第一步下载系统镜像 3. 使用 Win32DiskImager 往内存卡中写入镜像 4. 修改 boot 分区的文件 4.1 新建 ssh 文件 4.2 新建 …

bilibili解析网站_SEO优化:网站优化推广方案

网站优化推广方案&#xff1a;本文章简单的说明了百度关键词排名计算的规则成果&#xff0c;支持百度排名的因素&#xff0c;简单从的关键词的内外链、网站权重、关键词的布局、关键词的密度、关键词的用户点击率等等九个方面谈了百度关键词排名基本规则。一.SEO优化&#xff1…

建站模板论坛_怎么建贴吧只需几个步骤,你也可以建一个论坛网站

世界那么大&#xff0c;谢谢你来看我&#xff01;&#xff01;关注我你就是个网络、电脑、手机小达人Discuz建站可以说是最方便的论坛程序了&#xff0c;使用的网站有上百万个&#xff0c;目前已被腾讯收购&#xff0c;是最受欢迎的论坛软件系统之一。作为开源网站&#xff0c;…

python模拟登录网站_用python实现模拟登录人人网

我决定从头说起。懂的人可以快速略过前面理论看最后几张图。 web基础知识 从OSI参考模型&#xff08;从低到高&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层&#xff09;来说&#xf…

spring boot 入门_SpringBoot入门建站全系列(二十一)Mybatis使用乐观锁与悲观锁

SpringBoot入门建站全系列&#xff08;二十一&#xff09;Mybatis使用乐观锁与悲观锁一、概述之前有两篇《SpringBoot入门建站全系列&#xff08;三&#xff09;Mybatis操作数据库》和《SpringBoot入门建站全系列&#xff08;四&#xff09;Mybatis使用进阶篇:动态SQL与分页》介…

帝国网站管理系统后台e/class/config.php不存在,帝国CMS7.0使用常见问题小结

一、7.0版本的数据库配置文件是哪个文件&#xff1f;7.0版本数据库配置文件&#xff1a;/e/config/config.php6.6及以下版本数据库配置文件&#xff1a;/e/class/config.php二、忘记后台登陆认证码怎么办&#xff1f;查看 /e/config/config.php 文件里的“$ecms_config[\’esaf…