React SSR樣式及SEO的實踐

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

    SSR樣式
    在React客戶端渲染,添加樣式很容易。愛掏網 - it200.com寫一個css樣式文件,在對應組件中引用。愛掏網 - it200.com標簽上通過className這個屬性調用對應樣式就萬事Ok了。愛掏網 - it200.com當然我們需要在webpack中配置loader來解析css文件。愛掏網 - 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標簽中。愛掏網 - it200.com

    那么SSR也這樣行嗎~

    yarn dev

    跑一下服務,發現命令行報這個錯誤:

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

    原因在于服務器端渲染哪里有window對象,哪里有DOM啊。愛掏網 - it200.com我們是通過虛擬DOM。愛掏網 - it200.comrenderToString這個方法生成出來的html字符串。愛掏網 - it200.comstackoverflow搜了一下發現了isomorphic-style-loader這個專門用于同構的style-loader。愛掏網 - it200.com

    話不多少搞起來。愛掏網 - it200.com客戶端的webpack配置不需要變更還是使用css-loader+style-loader。愛掏網 - it200.com服務器端就使用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一下,不報錯了但是會閃一下屏。愛掏網 - it200.com禁用掉js發現server端生成的html并沒有樣式,當客戶端JS接管程序之后才會有樣式出現。愛掏網 - it200.com這樣的體驗相當糟糕。愛掏網 - it200.com
    當然我們確實沒有向服務器端生成的HTML添加style標簽。愛掏網 - it200.com
    現在服務器返給我們的html是這樣的

    return `
      
       
        ssr${ content }
        
        
       
      

    這時我們想到了context這個玩意。愛掏網 - it200.com在server端render之前。愛掏網 - it200.com我們設置一個

    let context = {
     css: []
    }
    

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

    萬事

    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 精品一区二区三区四区电影| 久久精品无码一区二区三区免费| 久久se精品一区二区国产| 亚洲色大成网站www永久一区| 精品一区二区三区在线成人 | 91一区二区视频| 日本精品一区二区在线播放 | 国产在线一区二区杨幂| 亚洲A∨无码一区二区三区| 视频在线一区二区三区| 在线日产精品一区| 国产视频一区在线观看| 一区二区三区在线免费| 亚洲AV无码片一区二区三区 | 中文字幕人妻丝袜乱一区三区 | 国产亚洲一区二区在线观看| 国产伦精品一区二区三区四区| 精品国产一区AV天美传媒| 少妇人妻精品一区二区三区| 国产在线精品一区二区不卡麻豆| 国产一区二区三区免费看| 无码人妻一区二区三区av| 自拍日韩亚洲一区在线| AA区一区二区三无码精片| 无码视频一区二区三区在线观看 | 久久精品免费一区二区三区| V一区无码内射国产| 亚洲日本中文字幕一区二区三区| 国偷自产视频一区二区久| 在线视频一区二区三区四区| 欧美日本精品一区二区三区| 一区二区三区视频| 色综合视频一区中文字幕| 国产精品一区二区久久精品| 亚洲国产视频一区| 亚洲精品色播一区二区| 亚洲AV无码一区二区三区鸳鸯影院| 无码中文人妻在线一区二区三区| 亚洲欧美日韩国产精品一区 | 日韩免费视频一区| 日韩一区二区三区在线观看|