webpack + react 优化:缩小js包体积

一,前言

学校这边的项目刚组建好开发团队,前一段时间都在考虑如何前后端分离,如何多人协作开发的问题,恰好上一周陪女朋友去承德写生,能暂时放下工作和学校的事物,有了更多的思考时间。假期期间学习了webpack,并将前端代码进行了迁移,实现了前后端分离。

最近上线的时候发现打包压缩后的js包达到了477k,首屏渲染时间高达4s,首屏渲染时间超过1.5s都是不能忍的,于是开始尝试研究一下webpack,毕竟只看了几个小时就拿来用了。

剧透,剧透,后面优化到284k,首屏渲染1.5s-2s。

这个时候想起以前boss和我聊职业规划的时候说过,“会用一项技术的人有很多,而出了问题懂得最大程度优化处理的人却没几个”,虽然他举的例子是搜索引擎优化,要高大上得多,但深入学习,积极对待的心态是一样的。谢谢他的引导。

二,思路

前面啰嗦有点多,下面简单说说这次优化的思路。要想解决问题,必先了解问题,我去看了打包后的js,发现了一些问题及优化点。

  1. js确实混淆压缩了,可是里面含有大量的开源库的copyright信息,可以去掉。

    (开源大牛们要相信我是尊重以及无敌崇拜你们的,为了性能暂时去掉这些信息,后期会在产品上单开一个页面说明自己用了哪些库以及给出链接(Facebook和Instagram都这样)

  2. 引入的React没有切换到产品版本,React给出了下面的提示,良心!

    Warning: It looks like you’re using a minified copy of the development build of React. When deploying React apps to production, make sure to use the production build which skips development warnings and is faster. See http://facebook.github.io/react/downloads.html for more details.

  3. 之前将css也打包进js里面了,因为css和js并行加载,所以可以将css分离出来,因为js远大于css,所以首屏渲染时间绝大部分只受js下载时间影响,看图:

    css,js下载时间

三,动手

①压缩时去掉js所有注释,包括copyright信息。
在webpack.config.js文件的plugins数组里面添加及配置插件即可。
关于uglify的更多配置,请点击这里.

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

从477k 缩小到了408k,go ahead.

②将React切换到产品环境,参考如下:

React doesn’t switch to production mode

同样在plugins里面添加:

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

这时候注意打包的时候要带上node的环境设置,例如:

NODE_ENV=production webpack --config webpack.production.config.js --progress

从408k缩小到326k,还可以更进一步。

③分离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")
]

最后326k = 284k(js) + 37.6k(css).

附上完整的webpage配置文件:
var webpack = require('webpack');
var path = require('path');
var ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
  entry: [
    path.resolve(__dirname, 'app/main.jsx')
  ],
  output: {
    path: __dirname + '/server/public',
    publicPath: '/',
    filename: './bundle.js'
  },
  module: {
    loaders:[
      {
          test: /\.css$/,
          loader: ExtractTextPlugin.extract("style-loader", "css-loader")
      },
      {
          test: /\.less$/,
          loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
      },
      { test: /\.(jpg|png)$/, loader: "url" },
      { test: /\.js[x]?$/, include: path.resolve(__dirname, 'app'), exclude:/node_modules/,loader: 'babel-loader' },
    ]
  },
  resolve: {
    extensions: ['', '.js', '.jsx'],
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      output: {
        comments: false,
      },
      compress: {
        warnings: false
      }
    }),
    new webpack.DefinePlugin({
      'process.env': {
          NODE_ENV: JSON.stringify(process.env.NODE_ENV),
      },
    }),
    new ExtractTextPlugin("bundle.css")
  ]
};

四,更进一步

1.5s-2s的首屏渲染时间还不理想,但学校的项目要求也不高,不过对自己的要求应该一如既往,后期会尝试从下面几个方向去优化,希望能有更多的实践经验和大家分享。

  1. 将js分离,不同页面加载不同的js;
  2. 将React剥离出去,使用cdn;
  3. 既然用了React,可以尝试后端渲染;

虽然还不完美,但是进步总是值得肯定的,一步步来吧。


2016-09-16更新

进一步优化:

前端性能优化:webpack分离 + LocalStorage缓存

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
redux、reactwebpack是目前非常流行的前端技术,它们可以帮助我们快速构建复杂的单页面应用。而热加载是一种非常方便的开发工具,能够在我们修改代码后自动重新编译并刷新页面,极大地提高了开发效率。 然而,IE8是一个老旧的浏览器,在支持新技术的同时也存在很多兼容性问题。要使我们的应用在IE8上运行,我们需要进行一些特殊的处理。 下面是一些可能有用的技巧: 1. 使用babel进行ES6代码转换:redux和react都使用了一些ES6语法,而IE8并不支持这些语法。我们可以使用babel将ES6代码转换为ES5代码,从而在IE8上运行。同时,我们还需要使用babel-polyfill来提供一些ES6新特性的支持。 2. 使用es5-shim来提供一些ES5新特性的支持:IE8对ES5的支持也不完整,我们可以使用es5-shim来提供一些ES5新特性的支持。 3. 使用es6-shim来提供一些ES6新特性的支持:IE8对ES6的支持更加有限,我们可以使用es6-shim来提供一些ES6新特性的支持。 4. 使用webpack的兼容性插件:webpack提供了一些兼容性插件,可以自动处理一些兼容性问题,比如babel-loader、es3ify-webpack-plugin等。 5. 使用react-ie8来提供react在IE8上的支持:react-ie8是一个为react提供在IE8上支持的库,可以很方便地解决一些兼容性问题。 6. 使用redux-ie8来提供redux在IE8上的支持:redux-ie8是一个为redux提供在IE8上支持的库,可以很方便地解决一些兼容性问题。 总之,要使我们的应用在IE8上运行,需要进行一些特殊的处理,括使用babel进行ES6代码转换、使用es5-shim和es6-shim来提供一些新特性的支持、使用webpack的兼容性插件、使用react-ie8和redux-ie8来提供在IE8上的支持等。这些技巧需要不断地更新和完善,以适应不断变化的前端技术。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值