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

前一篇主要記錄了一下SSR配置以及結(jié)合Redux的使用。愛掏網(wǎng) - it200.com這里簡(jiǎn)單說一下React SSR中樣式處理和更優(yōu)雅的SEO

SSR樣式
在React客戶端渲染,添加樣式很容易。愛掏網(wǎng) - it200.com寫一個(gè)css樣式文件,在對(duì)應(yīng)組件中引用。愛掏網(wǎng) - it200.com標(biāo)簽上通過className這個(gè)屬性調(diào)用對(duì)應(yīng)樣式就萬事Ok了。愛掏網(wǎng) - it200.com當(dāng)然我們需要在webpack中配置loader來解析css文件。愛掏網(wǎng) - it200.com一般的配置如下(使用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標(biāo)簽中。愛掏網(wǎng) - it200.com

那么SSR也這樣行嗎~

yarn dev

跑一下服務(wù),發(fā)現(xiàn)命令行報(bào)這個(gè)錯(cuò)誤:

return window && document && document.all && !window.atob;
^

ReferenceError: window is not defined

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

話不多少搞起來。愛掏網(wǎng) - it200.com客戶端的webpack配置不需要變更還是使用css-loader+style-loader。愛掏網(wǎng) - it200.com服務(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ì)閃一下屏。愛掏網(wǎng) - it200.com禁用掉js發(fā)現(xiàn)server端生成的html并沒有樣式,當(dāng)客戶端JS接管程序之后才會(huì)有樣式出現(xiàn)。愛掏網(wǎng) - it200.com這樣的體驗(yàn)相當(dāng)糟糕。愛掏網(wǎng) - it200.com
當(dāng)然我們確實(shí)沒有向服務(wù)器端生成的HTML添加style標(biāo)簽。愛掏網(wǎng) - it200.com
現(xiàn)在服務(wù)器返給我們的html是這樣的

return `
  
   
    ssr${ content }
    
    
   
  

這時(shí)我們想到了context這個(gè)玩意。愛掏網(wǎng) - it200.com在server端render之前。愛掏網(wǎng) - it200.com我們?cè)O(shè)置一個(gè)

let context = {
 css: []
}

我們還知道在服務(wù)端渲染的時(shí)候有this.props.staticContext這樣一個(gè)props拿到我們?cè)O(shè)置context。愛掏網(wǎng) - it200.com另外isomorphic-style-loader提供給我們了
_getCss()這個(gè)方法。愛掏網(wǎng) - it200.com可以在SSR過程中拿到樣式。愛掏網(wǎng) - it200.com有了這兩個(gè)必要條件。愛掏網(wǎng) - it200.com我們就可以在每一個(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 `
   
    
     ssr${content}
     
     
    
   

萬事

聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
發(fā)表評(píng)論
更多 網(wǎng)友評(píng)論0 條評(píng)論)
暫無評(píng)論

返回頂部

主站蜘蛛池模板: 精品国产人成亚洲区| 中文字幕日韩欧美一区二区三区| 38部杂交小说大黄| 污视频网站免费| 好好的曰com久久| 国产99久久精品一区二区| 久久91这里精品国产2020| 视频在线观看国产| 日本人强jizz多人| 国产伦精品一区二区三区免费下载| 久久精品一区二区三区av| 高清中文字幕免费观在线| 日韩欧美无线在码| 国产在线麻豆精品| 久久久久99精品成人片直播| 非常h很黄的变身文| 日日操天天操夜夜操| 国产丰满老熟女重口对白| 久久一本色系列综合色| 边亲边摸边做视频免费| 我和室友香蕉第二部分| 全彩成人18h漫画在线| jizzjizz成熟丰满舒服| 狼人久久尹人香蕉尹人| 在公车上忘穿内裤嗯啊色h文| 任你躁国产自任一区二区三区| a毛片视频免费观看影院| 污污污污污污www网站免费| 国产精品成人va在线播放| 亚洲av无码片在线播放| 国产a免费观看| 日日摸日日碰夜夜爽97纠| 免费看黄视频app| 97人人超人超人国产第一页| 欧美又大又粗又爽视频| 国产成人免费观看| 久久人爽人人爽人人片av| 老司机一级毛片| 天天插天天狠天天透| 亚洲国产AV无码一区二区三区| 黑人精品videos亚洲人|