以前公司里有优化的时候,打包优化和代码优化都是他来办,好家伙现在只剩下我一人了,为了在公司站住脚特意去度娘那里请教了一番,发现并不是那么难,以下就是我webpack打包的最终极版,把10MB变成300KB不在话下。
一,webpack配置
vue-cli3以后,我们修改webpack配置,需要自己在项目根路径下创建vue.config.js文件。
1,配置静态资源路径
module.exports = {
publicPath: './', // 静态资源路径(默认/,打包后会白屏)
outputDir: 'dist', // 打包后文件的目录 (默认为dist)
assetsDir: 'static', // outputDir的静态资源(js、css、img、fonts)目录 默认为‘’没有单独目录js/css/img在根目录中。
}
2,去处生产环境
module.exports = {
//去除生产环境的productionSourceMap
productionSourceMap: false,
}
区别
- 如果没有去除环境变量的时候,打包运行代码如果报错的话会指向没有打包格式化的代码,去除了的话则恰恰相反,会指向打包格式化的代码。
- 去除前10MB,去除后3MB。大约减少整体代码的3/2。
3,使用CDN加速优化
在开发一个项目的时候我常常会用到一些插件比如说,vant,element,axios,vuex,等。
而这些插件呢,我们是直接下载到项目里的,再说了我又不在这些代码里修改,是完完全全的死代码,那我只要使用网络的请求来获取一下它们,岂不是美哉?
const isProduction = process.env.NODE_ENV === 'production';
// externals
const externals = {
vue: 'Vue',
'vue-router': 'VueRouter',
vuex: 'Vuex',
vant: 'vant',
axios: 'axios'
}
// CDN外链,会插入到index.html中
const cdn = {
// 开发环境
dev: {
css: [],
js: []
},
// 生产环境
build: {
css: ['https://cdn.jsdelivr.net/npm/vant@2.12/lib/index.css'],
js: [
'https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js',
'https://cdn.jsdelivr.net/npm/vue-router@3.1.5/dist/vue-router.min.js',
'https://cdn.jsdelivr.net/npm/axios@0.19.2/dist/axios.min.js',
'https://cdn.jsdelivr.net/npm/vuex@3.1.2/dist/vuex.min.js',
'https://cdn.jsdelivr.net/npm/vant@2.12/lib/vant.min.js'
]
}
}
module.exports = {
configureWebpack: config => {
// 为生产环境修改配置...
if (isProduction) {
// externals
config.externals = externals
}
},
chainWebpack: config => {
/**
* 添加CDN参数到htmlWebpackPlugin配置中
*/
config.plugin('html').tap(args => {
if (isProduction) {
args[0].cdn = cdn.build
} else {
args[0].cdn = cdn.dev
}
return args
})
}
}
在 public/index.html 中添加
<!-- 使用CDN的CSS文件 -->
<% for (var i in
htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style" />
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" />
<% } %>
<!-- 使用CDN加速的JS文件,配置在vue.config.js下 -->
<% for (var i in
htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
这个时候3MB又变成了1.5MB,缩小2/1
4,对资源文件进行压缩
需要下载 compression-webpack-plugin
cnpm i compression-webpack-plugin -D
vue.config.js 中按照如下方式进行配置
const CompressionWebpackPlugin = require('compression-webpack-plugin')
module.exports = {
// 根据你的实际情况更改这里
publicPath,
assetsDir: 'assets',
lintOnSave: true,
configureWebpack: {
plugins:[
new CompressionWebpackPlugin({
filename: '[path].gz[query]',
algorithm: 'gzip',
// test: /\.js$|\.html$|\.json$|\.css/,
test: /\.js$|\.json$|\.css/,
threshold: 10240, // 只有大小大于该值的资源会被处理
minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
// deleteOriginalAssets: true // 删除原文件
})
],
},
}
压缩后会减少一部分空间,后需要配合后端nginx修改,配合前端
nginx演示
location ~ .*\.(js|json|css)$ {
gzip on;
gzip_static on; # gzip_static是nginx对于静态文件的处理模块,该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。
gzip_min_length 1k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/css application/javascript application/json;
root /dist;
}
后面看压缩包1.5MB减到700KB
5,减去控制台打印和备注
虽然减的不算多但是好歹是减了点,毕竟HR说能减就减1KB能有多少多少损失
需要下载uglifyjs-webpack-plugin
cnpm install uglifyjs-webpack-plugin --save-dev
在vue.config.js 中按照如下方式进行配置
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const isProduction = process.env.NODE_ENV === 'production';
configureWebpack: config => {
const plugins = [];
if (isProduction) {
plugins.push(
new UglifyJsPlugin({
uglifyOptions: {
output: {
comments: false, // 去掉注释
},
warnings: false,
compress: {
drop_console: true,
drop_debugger: false,
pure_funcs: ['console.log']//移除console
}
}
})
)
}
},
700KB减到了650KB
5,图片压缩
图片的话,一般公司为了减少包的体积都是采用网上请求的,但是有一小部分仍然使用的是项目里的图片,那将不得不进行图片压缩了
需要下载 image-webpack-loader
cnpm install image-webpack-loader --save-dev
在vue.config.js 中按照如下方式进行配置
module.exports = {
// 根据你的实际情况更改这里
publicPath,
assetsDir: 'assets',
lintOnSave: true,
// image 压缩 定义在chainWebpack中
chainWebpack: config => {
config.module
.rule('images')
.use('image-webpack-loader')
.loader('image-webpack-loader')
.options({
bypassOnDebug: true
})
.end()}
}
这回至少减原来图片3/2,650KB成300KB
如有不足之处,还请多多指教!
版权声明:本文为weixin_49356003原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。