React部署到騰訊云上訪問(wèn)速度慢(上)---- 前端解決方案

原因主要還是React打包生成的.js文件過(guò)大耻台,導(dǎo)致訪問(wèn)的速度很慢诚欠,所以要想辦法壓縮.js文件的大小。

這是項(xiàng)目部署時(shí)草丧,各個(gè)文件的大小狸臣。

image.png

app.js的文件達(dá)到了1400多kb,騰訊云的訪問(wèn)速度大概需要15~20s(首屏渲染時(shí)間超過(guò)1.5s都是不能忍的)昌执。

拋開(kāi)代碼內(nèi)部可優(yōu)化的問(wèn)題烛亦,主要是因?yàn)槭褂昧薬ntd-design的庫(kù)(已經(jīng)使用了antd-design的按需加載)诈泼,這個(gè)東西挺大的。

下圖是我在使用按需加載之后煤禽,且把a(bǔ)ntd-design的打包至vender.js中后的結(jié)果铐达。

app.js明顯減小,但vender.js明顯增大檬果。

image.png

這個(gè)問(wèn)題瓮孙,暫時(shí)還沒(méi)找打很好的解決方法,下面把自己打包的配置記錄一下(查閱了很多資料选脊,做個(gè)記錄)杭抠。

1 優(yōu)化思路

  1. 前臺(tái)js代碼壓縮
  2. 后臺(tái)優(yōu)化

2 前臺(tái)優(yōu)化方法

1 壓縮時(shí)去掉js所有注釋?zhuān)╟opyright信息。

在webpack.config.js文件的plugins數(shù)組里面添加及配置插件即可恳啥。

new webpack.optimize.UglifyJsPlugin({
      output: {
        comments: false,  // remove all comments
      },
      compress: {
        warnings: false
      }
    })

2 將React切換到產(chǎn)品環(huán)境偏灿,參考如下:

在plugins里面添加:

 new webpack.DefinePlugin({
      'process.env': {
          NODE_ENV: JSON.stringify(process.env.NODE_ENV),
      },
    }),

這時(shí)候注意打包的時(shí)候要帶上node的環(huán)境設(shè)置,例如:
NODE_ENV=production webpack --config webpack.production.config.js --progress

3 分離css

先安裝webpack插件:
npm install extract-text-webpack-plugin --save

在webpack配置文件中使用插件:

var ExtractTextPlugin = require("extract-text-webpack-plugin");

...

    loaders:[
      {
          test: /\.css$/,
          loader: ExtractTextPlugin.extract("style-loader", "css-loader")
      },
      {
          test: /\.less$/,
          loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
      },

      ...

...

plugins: [
    ...

    new ExtractTextPlugin("bundle.css")
]

4 分離出業(yè)務(wù)代碼和第三方庫(kù)

entry: {
    bundle: path.join(__dirname, '../src/index'),
    vendor: ['react', 'react-dom', 'jquery','react-router']
  },

  plugins: [
    new webpack.optimize.CommonsChunkPlugin('vendor',  'vendor.js'),
  ]

附上完整的webpage配置文件:

var webpack = require("webpack");
var path = require('path');
var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var HtmlWebpackPlugin = require('html-webpack-plugin');

var ROOT_PATH = path.resolve(__dirname); // 項(xiàng)目跟路徑
var APP_PATH = path.resolve(ROOT_PATH, 'app'); // 項(xiàng)目開(kāi)發(fā)目錄src
var APP_FILE = path.resolve(APP_PATH, 'index.jsx'); // 項(xiàng)目入口的index.js
var DIST_PATH = path.resolve(ROOT_PATH, 'dist'); // 項(xiàng)目打包輸出路徑

module.exports = {
  entry: {
    app: APP_FILE,
    venders: [
      'react',
      'react-dom',
      'react-router',
      'antd',//這里直接會(huì)把所有antd打包
    ]
  },
  output: {
    path: DIST_PATH,
    //表示資源的發(fā)布地址钝的,當(dāng)配置過(guò)該屬性后翁垂,打包文件中所有通過(guò)相對(duì)路徑引用的資源都會(huì)被配置的路徑所替換
    //publicPath: '/',
    filename: '[name].js',
    chunkFilename: 'js/[name].[chunkhash:5].min.js'
  },
  module: {
    loaders: [
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract('style', ['css', 'autoprefixer'])
      },
      {
        test: /\.less$/,
        loader: ExtractTextPlugin.extract('style', ['css', 'autoprefixer', 'less'])
      },
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loaders: ['react-hot', 'babel?presets[]=es2015,presets[]=react,presets[]=stage-0']
      },
      {
        test: /\.(png|jpg)$/,
        loader: 'url-loader?limit=8192&name=image/[hash:8].[name].[ext]'
      }
    ]
  },
  resolve: {
    extensions: ['', '.js', '.jsx', '.json', '.less']
  },
  plugins: [
    // new webpack.ProvidePlugin({ $: "jquery" }), // 這是將jquery變成全局變量,不用在自己文件require('jquery')了
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: JSON.stringify('production') //定義生產(chǎn)環(huán)境
      }
    }),
    new webpack.optimize.CommonsChunkPlugin('venders', 'venders.js'), // 這是妮第三方庫(kù)打包生成的文件
    new uglifyJsPlugin({
      output: {
        comments: false, // remove all comments
      },
      compress: {
        warnings: false
      }
    }),
    // new webpack.optimize.DedupePlugin(), //刪除類(lèi)似的重復(fù)代碼
        // new webpack.optimize.UglifyJsPlugin(), //最小化一切
    // new webpack.optimize.AggressiveMergingPlugin(),//合并塊
    // new webpack.optimize.OccurenceOrderPlugin(),
    new ExtractTextPlugin("[name].css"),
    new HtmlWebpackPlugin({
      template: './app/index.tmpl.html', // html模板路徑
      htmlWebpackPlugin: {
        files: {
          css: ["app.css"],
          js: ["bundle.js", "venders.js"]
        }
      },
      minify: {
        removeComments: true, // 移除HTML中的注釋
        collapseWhitespace: true, // 刪除空白符與換行符
        removeAttributeQuotes: true // 移除HTML中的屬性引號(hào)
      },
      filename: 'index.html',
    })
  ]
};

package.json打包命令扁藕。

  "scripts": {
    "start": "set NODE_ENV=dev && webpack-dev-server --progress --colors",
    "build": "rimraf dist/* && set NODE_ENV=production && webpack --config ./webpack.production.config.js --progress --colors",
    "mock": "node --harmony ./app/common/mock.js"
  },

參考鏈接

https://www.cnblogs.com/wangyue99599/p/8136108.html

https://blog.csdn.net/xuelang532777032/article/details/65635188

https://blog.csdn.net/code_for_free/article/details/51583737

https://blog.csdn.net/wu_shuxuan/article/details/78902772

http://www.reibang.com/p/a64735eb0e2b

https://github.com/fouber/blog/issues/6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疚脐,隨后出現(xiàn)的幾起案子亿柑,更是在濱河造成了極大的恐慌,老刑警劉巖棍弄,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件望薄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡呼畸,警方通過(guò)查閱死者的電腦和手機(jī)痕支,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛮原,“玉大人卧须,你說(shuō)我怎么就攤上這事∪逶桑” “怎么了花嘶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蹦漠。 經(jīng)常有香客問(wèn)我椭员,道長(zhǎng),這世上最難降的妖魔是什么笛园? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任隘击,我火速辦了婚禮侍芝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埋同。我一直安慰自己州叠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布莺禁。 她就那樣靜靜地躺著留量,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哟冬。 梳的紋絲不亂的頭發(fā)上楼熄,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音浩峡,去河邊找鬼可岂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翰灾,可吹牛的內(nèi)容都是我干的缕粹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纸淮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼平斩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起咽块,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绘面,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后侈沪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體揭璃,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年亭罪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘦馍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡应役,死狀恐怖情组,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箩祥,我是刑警寧澤呻惕,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站滥比,受9級(jí)特大地震影響亚脆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盲泛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一濒持、第九天 我趴在偏房一處隱蔽的房頂上張望键耕。 院中可真熱鬧,春花似錦柑营、人聲如沸屈雄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酒奶。三九已至,卻和暖如春奶赔,著一層夾襖步出監(jiān)牢的瞬間惋嚎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工站刑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留另伍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓绞旅,卻偏偏與公主長(zhǎng)得像摆尝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子因悲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容