国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

React SSR樣式及SEO的實(shí)踐

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:05:56
文檔

React SSR樣式及SEO的實(shí)踐

React SSR樣式及SEO的實(shí)踐:前一篇主要記錄了一下SSR配置以及結(jié)合Redux的使用。這里簡(jiǎn)單說一下React SSR中樣式處理和更優(yōu)雅的SEO SSR樣式 在React客戶端渲染,添加樣式很容易。寫一個(gè)css樣式文件,在對(duì)應(yīng)組件中引用。標(biāo)簽上通過className這個(gè)屬性調(diào)用對(duì)應(yīng)樣式就萬事Ok了。當(dāng)然我們需
推薦度:
導(dǎo)讀React SSR樣式及SEO的實(shí)踐:前一篇主要記錄了一下SSR配置以及結(jié)合Redux的使用。這里簡(jiǎn)單說一下React SSR中樣式處理和更優(yōu)雅的SEO SSR樣式 在React客戶端渲染,添加樣式很容易。寫一個(gè)css樣式文件,在對(duì)應(yīng)組件中引用。標(biāo)簽上通過className這個(gè)屬性調(diào)用對(duì)應(yīng)樣式就萬事Ok了。當(dāng)然我們需

原因在于服務(wù)器端渲染哪里有window對(duì)象,哪里有DOM啊。我們是通過虛擬DOM。renderToString這個(gè)方法生成出來的html字符串。stackoverflow搜了一下發(fā)現(xiàn)了isomorphic-style-loader這個(gè)專門用于同構(gòu)的style-loader。

話不多少搞起來。客戶端的webpack配置不需要變更還是使用css-loader+style-loader。服務(wù)器端就使用css-loader+isomorphic-style-loader了(和style-loader用法一波一樣)

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

配置好了Run一下,不報(bào)錯(cuò)了但是會(huì)閃一下屏。禁用掉js發(fā)現(xiàn)server端生成的html并沒有樣式,當(dāng)客戶端JS接管程序之后才會(huì)有樣式出現(xiàn)。這樣的體驗(yàn)相當(dāng)糟糕。

當(dāng)然我們確實(shí)沒有向服務(wù)器端生成的HTML添加style標(biāo)簽。

現(xiàn)在服務(wù)器返給我們的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>
 `

這時(shí)我們想到了context這個(gè)玩意。在server端render之前。我們?cè)O(shè)置一個(gè)

let context = {
 css: []
}

我們還知道在服務(wù)端渲染的時(shí)候有this.props.staticContext這樣一個(gè)props拿到我們?cè)O(shè)置context。另外isomorphic-style-loader提供給我們了

_getCss()這個(gè)方法。可以在SSR過程中拿到樣式。有了這兩個(gè)必要條件。我們就可以在每一個(gè)用到樣式的Component中通過componentWillMount這個(gè)生命周期

添加這樣一段代碼:

componentWillMount () {
 if (this.props.staticContext) { // 只有服務(wù)端渲染時(shí)候有this.props.staticContext以及_getCss()
 this.props.staticContext.css.push(styles._getCss())
 }
}

這樣樣式就存儲(chǔ)在context這個(gè)變量的css數(shù)組中咯,改造一下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>
 `

萬事👌,當(dāng)然我們可以進(jìn)一步優(yōu)化,把componentWillMount所做的事情提出來搞一個(gè)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} />
 }
 }
}

這樣簡(jiǎn)單的封裝一個(gè)HOC,之后涉及樣式的時(shí)候直接通過withStylesHOC包裹一下就好。例如一個(gè)結(jié)合Redux的Home組件:

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

SSR-SEO

費(fèi)大力氣通過一個(gè)node中間層去實(shí)現(xiàn)首屏的SSR,除開首屏速度之外,就是SEO這一大塊了,對(duì)于一個(gè)商業(yè)網(wǎng)站來講真的很重要。

SEO(Search Engine Optimization)– 通過一些技術(shù)手段讓網(wǎng)站在搜索引擎的排名盡量靠前一點(diǎn)。由于客戶端渲染出來的網(wǎng)站只有<div id='root'>這樣的html節(jié)點(diǎn)。大多數(shù)搜索引擎分析不出來網(wǎng)站上有什么。SSR直接渲染出來HTML,這樣對(duì)搜索引擎就友好了很多。

SSR中的SEO

這里我們使用github上的一個(gè)庫react-helmet首先需要在對(duì)應(yīng)的頁面組件中引入react-helmet,就可以在Helmet標(biāo)簽內(nèi)自由添加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()}進(jìn)行填充

<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>

重新跑一下 搞定!

當(dāng)然SSR-SEO絕不這么簡(jiǎn)單。僅僅在頁面上添加head標(biāo)簽內(nèi)加上title 和meta標(biāo)簽影響是有限的。8102年的搜索爬蟲已經(jīng)不單單去匹配title和 description,而是全穩(wěn)的匹配(也就是說title和descript有影響但是影響很小)搜索爬蟲會(huì)把整個(gè)網(wǎng)站所有的文本收集起來進(jìn)行分析。

那么如何做好SEO

題外話順便說一下如何做好SEO。一個(gè)網(wǎng)站無非三大塊內(nèi)容,文字、多媒體、鏈接。要做到的是文字的原創(chuàng)性,圖片的原創(chuàng)性以及高清度還有站內(nèi)鏈接盡量和站內(nèi)內(nèi)容相關(guān)。

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

React SSR樣式及SEO的實(shí)踐

React SSR樣式及SEO的實(shí)踐:前一篇主要記錄了一下SSR配置以及結(jié)合Redux的使用。這里簡(jiǎn)單說一下React SSR中樣式處理和更優(yōu)雅的SEO SSR樣式 在React客戶端渲染,添加樣式很容易。寫一個(gè)css樣式文件,在對(duì)應(yīng)組件中引用。標(biāo)簽上通過className這個(gè)屬性調(diào)用對(duì)應(yīng)樣式就萬事Ok了。當(dāng)然我們需
推薦度:
標(biāo)簽: rea seo React
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 91www成人久久| 欧美日韩精品一区二区三区四区 | 精品久久久久久久一区二区手机版 | 国产精品久久网 | www.亚洲欧美| 欧美日韩亚洲第一页 | 国产成人久久综合二区 | 一本一本久久α久久精品66 | 欧美日韩大尺码免费专区 | 在线免费观看国产精品 | 91亚洲国产成人久久精品网站 | 欧美亚洲综合视频 | 国产欧美日韩中文字幕 | 久久久91精品国产一区二区 | 日韩欧美在线综合网高清 | 精品一区二区三区的国产在线观看 | 久久频道毛片免费不卡片 | 亚洲精品视频在线观看免费 | 另类欧美亚洲 | 亚洲三级一区 | 91精品欧美一区二区三区 | 欧洲毛片| 国产精品亚洲精品不卡 | 领导边摸边吃奶边做爽在线观看 | 亚洲欧美中文日韩在线v日本 | 日韩第三页 | 免费一区二区三区在线视频 | 国产又黄又爽的视频 | 免费的一级毛片 | 国产精品视频不卡 | 亚洲精品视频在线观看免费 | 欧美在线精品一区二区三区 | 亚洲十欧美十日韩十国产 | 欧美性xxxx | 亚洲欧洲一区 | 国产日韩欧美精品 | 一级成人毛片免费观看 | 国产日产欧美精品一区二区三区 | 久久亚洲伊人中字综合精品 | 日韩第一页在线 | 国产欧美一区二区三区鸳鸯浴 |