<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        React SSR樣式及SEO的實踐

        來源:懂視網 責編:小采 時間:2020-11-27 22:05:56
        文檔

        React SSR樣式及SEO的實踐

        React SSR樣式及SEO的實踐:前一篇主要記錄了一下SSR配置以及結合Redux的使用。這里簡單說一下React SSR中樣式處理和更優雅的SEO SSR樣式 在React客戶端渲染,添加樣式很容易。寫一個css樣式文件,在對應組件中引用。標簽上通過className這個屬性調用對應樣式就萬事Ok了。當然我們需
        推薦度:
        導讀React SSR樣式及SEO的實踐:前一篇主要記錄了一下SSR配置以及結合Redux的使用。這里簡單說一下React SSR中樣式處理和更優雅的SEO SSR樣式 在React客戶端渲染,添加樣式很容易。寫一個css樣式文件,在對應組件中引用。標簽上通過className這個屬性調用對應樣式就萬事Ok了。當然我們需

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

        話不多少搞起來??蛻舳说膚ebpack配置不需要變更還是使用css-loader+style-loader。服務器端就使用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一下,不報錯了但是會閃一下屏。禁用掉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。一個網站無非三大塊內容,文字、多媒體、鏈接。要做到的是文字的原創性,圖片的原創性以及高清度還有站內鏈接盡量和站內內容相關。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        React SSR樣式及SEO的實踐

        React SSR樣式及SEO的實踐:前一篇主要記錄了一下SSR配置以及結合Redux的使用。這里簡單說一下React SSR中樣式處理和更優雅的SEO SSR樣式 在React客戶端渲染,添加樣式很容易。寫一個css樣式文件,在對應組件中引用。標簽上通過className這個屬性調用對應樣式就萬事Ok了。當然我們需
        推薦度:
        標簽: rea seo React
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 成年免费a级毛片免费看无码| 久久国产亚洲观看| 国产大片线上免费看| 精品国产一区二区三区免费看| 中字幕视频在线永久在线观看免费 | 国色精品卡一卡2卡3卡4卡免费| 国产精品免费观看| 日韩视频在线精品视频免费观看| 四虎永久在线观看免费网站网址 | 黄色免费在线网址| 羞羞漫画小舞被黄漫免费| 亚洲av无码兔费综合| 亚洲欧美黑人猛交群| 亚洲6080yy久久无码产自国产 | 亚洲AV无码久久| 久久亚洲精品成人综合| 亚洲国产一区在线| 亚洲精品视频专区| 亚洲国产精品综合久久久| 亚洲精品福利你懂| 精品久久久久久亚洲中文字幕| 朝桐光亚洲专区在线中文字幕 | 亚洲AV无码一区二区乱子仑 | 亚洲一级特黄特黄的大片| 亚洲午夜一区二区三区| 亚洲国产精品日韩av不卡在线| 国产亚洲日韩在线a不卡| 亚洲精品视频免费| 日韩精品无码免费一区二区三区| 黄网站色在线视频免费观看| 日韩在线天堂免费观看 | 在线精品免费视频无码的| www.亚洲一区| 亚洲V无码一区二区三区四区观看| 久久亚洲国产成人精品性色| 国产精品高清视亚洲一区二区| 曰批全过程免费视频观看免费软件| 99久久免费国产精精品| 91在线视频免费看| 亚洲精品线路一在线观看| 婷婷久久久亚洲欧洲日产国码AV|