webpack打包性能优化
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.js,china.js,echarts-gl.min.js,echarts-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
- 可以直接写,缺点每个组件需要单写一行
import Button from "antd/lib/button" - 用对象的方式写
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 使其更加精确
{
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打包性能优化的更多相关文章
- webpack 打包性能优化
webpack 打包性能优化 开启多线程打包 thread-loader https://www.npmjs.com/package/thread-loader https://github.com/ ...
- 最全 webpak4.0 打包性能优化清单
最全 webpak4.0 打包性能优化清单 webpack4.0如何进行打包优化? 无非是从两个角度进行优化,其一:优化打包速度,其二:优化打包体积,送你一份打包性能优化清单 1.使用loader的时 ...
- webpack打包性能分析
1. 如何定位webpack打包速度慢的原因 首先需要定位webpack打包速度慢的原因,才能因地制宜采取合适的方案,我们可以在终端输入: webpack --profile --json > ...
- webpack打包体积优化
优化: 1:外部引入模块(cdn) 如 jquery,zepto,d3, bootstrap这些固定的lib 使用cdn直接引用就可以,没有必要打包到build,有效利用302. 2:图标优化 ...
- 深入浅出的webpack构建工具---tree shaking打包性能优化(十二)
阅读目录 1. 什么是tree-shaking? 2. 在webpack中如何使用 tree-shaking 呢? 3. 使用webpack-deep-scope-plugin 优化 回到顶部 1. ...
- Webpack打包效率优化篇
Webpack基础配置: 语法解析:babel-loader 样式解析:style-loader css解析:css-loader less解析:less-loader 文件解析:url-loader ...
- vue 应用生产环境的 webpack 打包配置优化
转:https://blog.csdn.net/robin_star_/article/details/83856363 前言:很好的打包优化的帖子,还没来的急去实测验证 1. 去掉 console ...
- webpack 打包性能分析工具
webpack-bundle-analyzer,推荐使用 新版 vue-cli (旧版按照新版的进行配置即可)已经集成该插件,在项目的 package.json 文件中注入如下命令,然后运行(npm ...
- 彻底解决Webpack打包慢的问题
转载 这几天写腾讯实习生 Mini 项目的时候用上了 React 全家桶,当然同时引入了 Webpack 作为打包工具.但是开发过程中遇到一个很棘手的问题就是,React 加上 React-Route ...
随机推荐
- python全栈开发-Day3 字符串
python全栈开发-Day3 字符串 一.按照以下几个点展开字符串的学习 #一:基本使用 1. 用途 #首先字符串主要作用途径:名字,性别,国籍,地址等描述信息2.定义方式 在单引号\双引号\三引 ...
- Java中常见的数据结构
---恢复内容开始--- 常用的有四种: 堆栈结构: 算法第一站 应用场景:括号匹配,算式计算, 队列结构: 常用于排队购物 应用场景:排队购物,打印机任务调度. 数组结构: 查找快(利用下标,指哪打 ...
- [poj3740]Easy Finding_状态压缩_dfs
Easy Finding poj-3470 题目大意:给你一个01矩阵,问能否选出一些行,使得这些行所新组成的01矩阵每列中有且只有1个1. 注释:1<=行数<=16,1<=列数&l ...
- Struts2 之 Action 类访问 WEB 资源
接着上次博客的内容我继续分享我所学到的知识,和自己在学习过程中所遇到问题以及解决方案.当然,如果读者发现任何问题均可以在下方评论告知我,先谢! 在 Action 中访问 WEB 资源 web 资源 所 ...
- 使用Java客户端操作elasticsearch
Java REST客户端有两种风格: Java低级别REST客户端(Java Low Level REST Client,以后都简称低级客户端算了,难得码字):Elasticsearch的官方low- ...
- Alpha冲刺No.6
站立式会议 继续页面设计 在安卓内构件数据库相应类 解决摄像头.照片的使用的异常问题 二.实际项目进展 页面设计完成百分80 类架构完成 在虚拟机中,能够完成摄像头的调用和程序的使用 三.燃尽图 四. ...
- python的Flask 介绍
Flask 介绍 知识点 微框架.WSGI.模板引擎概念 使用 Flask 做 web 应用 模板的使用 根据 URL 返回特定网页 实验步骤 1. 什么是 Flask? Flask 是一个 web ...
- python的测试
测试 知识点 单元测试概念 使用 unittest 模块 测试用例的编写 异常测试 测试覆盖率概念 使用 coverage 模块 实验步骤 1. 应该测试什么? 如果可能的话,代码库中的所有代码都要测 ...
- 个人技术博客(alpha)
APP的权限校验不同于web网页端,web一般使用session记录用户的状态信息,而app则使用token令牌来记录用户信息.有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在 ...
- 《高级软件测试》web测试实践--12月30日记录
考完数学,我们正式开始web测试实践的作业,今天,我们主要进行了方案的选择和人员的分工.任务计划和安排如上图所示. 任务进展:完成题目选择和人员分工: 遇到问题:暂无: 下一步任务:完成软件评测.用户 ...