1. 使用 gzip 压缩打包后的 js 文件

这个方法优化浏览器下载时的文件大小(打包后的文件大小没有改变)

webpack.config.prod.js 中

var  CompressionWebpackPlugin  =  require('compression-webpack-plugin');
// 在 plugins 中添加
new CompressionWebpackPlugin({ //gzip 压缩
asset: '\[path\].gz\[query\]',
algorithm: 'gzip',
test: new RegExp(
'\\\.(js|css)$' //压缩 js 与 css
),
threshold: 10240,
minRatio: 0.8
})

这样打包出的 css js,会有 css.gz js.gz,即压缩过的 js 和 css。

之后在服务器端的 nginx 配置中开启 gzip:

查看配置文件:vim /usr/local/etc/nginx/nginx.conf

// 写在 http 中就可以
gzip on;
gzip_types application/javascript text/css image/jpeg;

这样浏览器下载文件时还是之前的 js,但是服务器返回的压缩过的 .gz 文件,再在本地解压,时间缩短了很多。

2. echart 使用外链 js 文件,不引入 npm 包

在 html 中引入 echarts.min.jschina.jsecharts-gl.min.jsecharts-wordcloud.min.js,不引入 npm 包

在 webpack生产打包配置中增加:

externals: {
"react": "React", // 左边引入时的自定义名字,右边全局变量名
"react-dom": "ReactDOM",
"jquery": "jQuery",
"echarts": "echarts"
}

https://doc.webpack-china.org/configuration/externals/#externals

打包后文件大小减小 0.5M

3. 配置打包去掉注释,删除debugger,删除console

new webpack.optimize.UglifyJsPlugin({
comments: false, //去掉注释
compress: {
warnings: false,
drop_debugger: true,
drop_console: true
}
}),

4. ant design 按需引入

https://github.com/ant-design/ant-design/issues/2656

  1. 可以直接写,缺点每个组件需要单写一行

    import Button from "antd/lib/button"
  2. 用对象的方式写

    import { Button } from 'antd';

    如果单用这种方式写,打包的时候每个文件会把 antd 的所有模块都加载进去,参见:

    https://ant.design/docs/react/getting-started-cn#按需加载

    需要引入 babel-plugin-import 使每个模块按需加载,并在 webpack.config.js 里配置
loaders: [
...
{
text: /\.(js|jsx)$/,
include: paths.appSrc,
loader: 'babel',
query: {
cacheDirectory: true,
plugins: [["import", { libraryName: "antd", style: "css" }]] // 这一句
}
},
...
]

每个引入antd的文件减小0.5M

5. 删除无用依赖

6. echart 图表懒加载

https://www.npmjs.com/package/react-lazyload

import LazyLoad from 'react-lazyload';
// 在需要懒加载的元素外包裹
<LazyLoad height={300} offset={10}><!--元素--></LazyLoad>

7. 使用 webpack-parallel-uglify-plugin 替代 UglifyJS 插件

https://jeffjade.com/2017/08/12/125-webpack-package-optimization-for-speed/#增强代码代码压缩工具

使用 webpack-parallel-uglify-plugin 替代 webpack.optimize.UglifyJsPlugin 并行混淆压缩 js 文件,打包时间从四分钟减到两分钟。用法和 UglifyJsPlugin 相同。

var ParallelUglifyPlugin=require('webpack-parallel-uglify-plugin') ;
new ParallelUglifyPlugin({
uglifyJS: {
output: {
comments: false //去掉注释
},
compress: {
warnings: false,
drop_debugger: true,
drop_console: true
}
}
}),

8. happypack 多进程执行 loader

原理

配置方式

引入 happypack

支持的loader列表

module.exports  = {
module: {
loaders: [
{
test: /.jsx?$/,
loader: "happypack/loader?id=happybabel",
exclude: /node_modules/
},
{
test: /\.json$/,
exclude: /node_modules/,
loader: 'happypack/loader?id=happyjson',
include: [
path.join(rootPath, "src/components"),
path.join(rootPath, "src/mockdata"),
path.join(rootPath, "src/views"),
]
},
{
test: /\.less$/,
loader: ExtractTextPlugin.extract("style", "happypack/loader?id=happyless"),
include: [
path.join(rootPath, "src/components/"),
path.join(rootPath, "src/assets"),
path.join(rootPath, "node_modules/antd"),
]
},
]
},
plugins: [
createHappyPlugin('happybabel', [{
loader: 'babel-loader',
query: {
cacheDirectory: true,
plugins: [
["import", { "libraryName": "antd", "style": true }] // `style: true` 会加载 less 文件
]
},
}]),
createHappyPlugin('happyjson', ['json-loader']),
createHappyPlugin('happyless', ['css-loader?sourceMap!less']),
]
}
function createHappyPlugin(id, loaders) {
return new HappyPack({
id: id,
loaders: loaders,
threadPool: happyThreadPool,
verbose: true
});
}

打包时间减少了 15s

9. 检查 loader 中的 include 和 exclude 使其更加精确

https://jeffjade.com/2017/08/12/125-webpack-package-optimization-for-speed/#设置-test-amp-include-amp-exclude

{
test: /\.json$/,
exclude: /node_modules/,
loader: 'happypack/loader?id=happyjson',
include: [
path.join(rootPath, "src/components"),
path.join(rootPath, "src/mockdata"),
path.join(rootPath, "src/views"),
]
},
{
test: /\.less$/,
loader: ExtractTextPlugin.extract("style", "happypack/loader?id=happyless"),
include: [
path.join(rootPath, "src/components/"),
path.join(rootPath, "src/assets"),
path.join(rootPath, "node_modules/antd"),
]
},

搜索文件范围变窄,可以减小一点打包时间。

webpack打包性能优化的更多相关文章

  1. webpack 打包性能优化

    webpack 打包性能优化 开启多线程打包 thread-loader https://www.npmjs.com/package/thread-loader https://github.com/ ...

  2. 最全 webpak4.0 打包性能优化清单

    最全 webpak4.0 打包性能优化清单 webpack4.0如何进行打包优化? 无非是从两个角度进行优化,其一:优化打包速度,其二:优化打包体积,送你一份打包性能优化清单 1.使用loader的时 ...

  3. webpack打包性能分析

    1. 如何定位webpack打包速度慢的原因 首先需要定位webpack打包速度慢的原因,才能因地制宜采取合适的方案,我们可以在终端输入: webpack --profile --json > ...

  4. webpack打包体积优化

    优化: 1:外部引入模块(cdn)     如 jquery,zepto,d3, bootstrap这些固定的lib 使用cdn直接引用就可以,没有必要打包到build,有效利用302. 2:图标优化 ...

  5. 深入浅出的webpack构建工具---tree shaking打包性能优化(十二)

    阅读目录 1. 什么是tree-shaking? 2. 在webpack中如何使用 tree-shaking 呢? 3. 使用webpack-deep-scope-plugin 优化 回到顶部 1. ...

  6. Webpack打包效率优化篇

    Webpack基础配置: 语法解析:babel-loader 样式解析:style-loader css解析:css-loader less解析:less-loader 文件解析:url-loader ...

  7. vue 应用生产环境的 webpack 打包配置优化

    转:https://blog.csdn.net/robin_star_/article/details/83856363 前言:很好的打包优化的帖子,还没来的急去实测验证 1. 去掉 console ...

  8. webpack 打包性能分析工具

    webpack-bundle-analyzer,推荐使用 新版 vue-cli (旧版按照新版的进行配置即可)已经集成该插件,在项目的 package.json 文件中注入如下命令,然后运行(npm ...

  9. 彻底解决Webpack打包慢的问题

    转载 这几天写腾讯实习生 Mini 项目的时候用上了 React 全家桶,当然同时引入了 Webpack 作为打包工具.但是开发过程中遇到一个很棘手的问题就是,React 加上 React-Route ...

随机推荐

  1. Java基于TCP的Socket编程练习

    环境:Notpad ++ 6.0 + JDK 6.0.31 问题:使用套接字编写客户-服务器程序,实现客户-服务器交互计算.客户将三角形3个边的长度发给服务器,服务器把计算出的三角形的面积返回给客户. ...

  2. Open source operational tools

    操作系统:Centos,Ubuntu,Redhat,suse,Freebsd 网站服务:nginx,apache,lighttpd,php,tomcat,resin 数据   库:MySQL,Mari ...

  3. 以太坊挖矿源码:ethash算法

    本文具体分析以太坊的共识算法之一:实现了POW的以太坊共识引擎ethash. 关键字:ethash,共识算法,pow,Dagger Hashimoto,ASIC,struct{},nonce,FNV ...

  4. Django+xadmin打造在线教育平台(三)

    五.完成注册.找回密码和激活验证码功能 5.1.用户注册 register.html拷贝到templates目录 (1)users/views.py class RegisterView(View): ...

  5. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListene解决办法

    照着以前写的项目搭一个框架,项目用到的是ssm,spring+spring mvc+mybatis,由Eclipse转战IDEA上,项目的文件夹有一些改变,在之前的小项目中喜欢把lib文件夹放在项目根 ...

  6. Dubbo学习1-Hello world

    前言 互联网技术到今天已经非常成熟和稳定了,其中为了解决高并发.大规模的服务请求,出现了微服务.RPC这样的分布式架构.今天就从头开始学习RPC框架dubbo. 为什么要学Dubbo 关于分布式的解决 ...

  7. react 实用的性能优化方式

    react 组件渲染分为初始化渲染和更新渲染,当我们更新某个组件的时候,只是想关键路径上组件的render,但react的默认做法是调用所以组件的reder,再生成虚拟dom进行对比,如不变则不进行更 ...

  8. python爬虫解决gbk乱码问题

    今天尝试了下爬虫,爬取一本小说,忘语的凡人修仙仙界篇,当然这样不好,大家要支持正版. 爬取过程中是老套路,先获取网页源代码 # -*- coding:UTF-8 -*- from bs4 import ...

  9. Jquery瀑布流布局,jQuery Wookmark Load 示例

    瀑布流布局非常适合大量图片的展示,一改过去裁剪图片尺寸同意的排版,每张图片都能完全展示,并错落有致,让人眼前一亮. 注意事项:img元素的width和weight属性需要写,否则定位会不准确. 查看j ...

  10. [15单片机] STC15F104W开发入门及模拟串口程序

    STC15F104W开发入门及模拟串口程序 Saturday, 31. March 2018 09:42AM - beautifulzzzz 前言 最近找到一款51内核的SOP8封装的8脚单片机STC ...