如何在react中添加同構(gòu)

目的

這問題首先我們要給出為什么使用服務(wù)端渲染,主要基于以下三點(diǎn)
1.利于SEO:React服務(wù)器渲染的方案使你的頁(yè)面在一開始就有一個(gè)HTML DOM結(jié)構(gòu),方便Google等搜索引擎的爬蟲能爬到網(wǎng)頁(yè)的內(nèi)容。
2.提高首屏渲染的速度:服務(wù)器直接返回一個(gè)填滿數(shù)據(jù)的HTML,而不是在請(qǐng)求了HTML后還需要異步請(qǐng)求首屏數(shù)據(jù)
3.前后端都共用代碼,提供開發(fā)效率
其中提到了共用代碼,即前后端共用一套,如下圖,這一具體實(shí)現(xiàn)就需要使用同構(gòu)

image.png

為什么要用webpack-isomorphic-tools

webpack可以將任意資源打包,那是在客戶端,但是當(dāng)其運(yùn)行在服務(wù)端時(shí),對(duì)于非js文件是無法正常import的,這里我的處理辦法是webpack-isomorphic-tools

需要做什么

我們接著上一篇加了路由的基礎(chǔ)上看看改了什么,上面為修改的,下面為新增的

image.png

1.package.json

image.png

可以看出,安裝了依賴包,主要是webpack-isomorphic-tools,另外的包是用來加載scss的,可忽略

2.src/server/index.js

require('babel-register')
require('babel-polyfill')

const Webpack_isomorphic_tools = require('webpack-isomorphic-tools')
global.webpack_isomorphic_tools = new Webpack_isomorphic_tools(require('../webpack/webpack-isomorphic-tools-configuration'))
  .server('./')
  .then(() => {
    require('./app');
  })

頭兩句用來是app.js支持es6的語(yǔ)法,主要看第三行開始的代碼,可以看出引入了同構(gòu)的包,然后使用構(gòu)造函數(shù)來新建了一個(gè)對(duì)象,這個(gè)構(gòu)造函數(shù)加載了一個(gè)文件(下面會(huì)提到),然后調(diào)用了server,它引用了一個(gè)路徑,這個(gè)路徑用來生成配置文件中的一些文件的路徑,此處是用于生成webpack-assets.json,然后去引用了app.js,這一段照抄即可

3.src/server/app.js

這個(gè)文件比較龐大,其實(shí)它就是router的那一部分內(nèi)容,就不貼出代碼了

4.src/webpack/webpack-isomorphic-tools-configuration.js

這是同構(gòu)的配置文件,即核心文件,一般情況下不需要修改,直接用即可,只提其中的一句

webpack_assets_file_path: __dirname + '/webpack-assets.json',

這用來配置生成的對(duì)照文件文件

5.src/webpack/webpack-assets.json

這個(gè)文件就是上面說的對(duì)照文件,我們看看它長(zhǎng)什么樣

{
  "javascript": {
    "main": "/static/bundle.js"
  },
  "styles": {},
  "assets": {
    "./src/containers/About/main.scss": {
      "test": "test_1qbej",
      "_style": ".test_1qbej {\n  color: red; }\n"
    }
  }
}

很明顯,它就是生成的一些映射關(guān)系,我在搭環(huán)境時(shí),遇到了一個(gè)坑,假如不手動(dòng)去生成這個(gè)文件,而是由同構(gòu)自己去生成,那么會(huì)陷入死循環(huán),一直如下

[webpack-isomorphic-tools] (waiting for the first Webpack build to finish)
[webpack-isomorphic-tools] (waiting for the first Webpack build to finish)
[webpack-isomorphic-tools] (waiting for the first Webpack build to finish)
[webpack-isomorphic-tools] (waiting for the first Webpack build to finish)
[webpack-isomorphic-tools] (waiting for the first Webpack build to finish)
[webpack-isomorphic-tools] (waiting for the first Webpack build to finish)
[webpack-isomorphic-tools] (waiting for the first Webpack build to finish)
[webpack-isomorphic-tools] (waiting for the first Webpack build to finish)

有遇到這個(gè)情況的,還望多多指教

6.src/webpack/webpack.config.js

直接上代碼吧

var webpack = require('webpack')
var path = require('path')
const Webpack_isomorphic_tools_plugin = require('webpack-isomorphic-tools/plugin');
const webpack_isomorphic_tools_plugin =
  new Webpack_isomorphic_tools_plugin(require('./webpack-isomorphic-tools-configuration')).development()


module.exports = {
  devtool: 'inline-source-map',
  entry: [
    'webpack-hot-middleware/client?path=http://localhost:3001/__webpack_hmr',
    './src/index.js'
  ],
  output: {
    filename: 'bundle.js',
    path: path.join(__dirname, 'dist'),
    publicPath: '/static/'
  },
  module: {
    loaders: [{
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      loader: ['babel-loader']
    }, {
      test: /\.scss$/,
      loader: [
        'style-loader',
        'css-loader?modules&importLoaders=2&sourceMap&localIdentName=[local]_[hash:base64:5]',
        'sass-loader?sourceMap'
      ].join('!')
    },  {
      test: webpack_isomorphic_tools_plugin.regular_expression('images'),
      loader: 'url-loader?limit=10240'
    }]
  },
  plugins: [
    webpack_isomorphic_tools_plugin,
    new webpack.optimize.OccurrenceOrderPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoEmitOnErrorsPlugin()
  ]
}

就加了同構(gòu)工具的引用,已經(jīng)配置,還有scss文件的loader,比較簡(jiǎn)單,就不贅述了。
好了,基本上react腳手架的東西差不多就這么多了,還剩的應(yīng)該就是具體的開發(fā)了,如生命周期,Immutable之類的,有時(shí)間我再繼續(xù)寫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • react+redux+webpack+babel+npm+shell+git這方面的內(nèi)容我會(huì)隨時(shí)更新,更新內(nèi)容放...
    liangklfang閱讀 711評(píng)論 0 1
  • GitChat技術(shù)雜談 前言 本文較長(zhǎng),為了節(jié)省你的閱讀時(shí)間,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,899評(píng)論 7 110
  • 在現(xiàn)在的前端開發(fā)中,前后端分離、模塊化開發(fā)、版本控制、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,669評(píng)論 1 32
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,673評(píng)論 2 71
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,374評(píng)論 7 35

友情鏈接更多精彩內(nèi)容