很多用Vue开发的项目中,都会遇到首屏加载慢,chunk-vendor.js动不动就好几MB,那么如何通过Vue的内部配置去优化我们的Vue项目呢?这是手头的一个项目,同样的源码,同样的服务器,打开了Disable cache,目前完全加载是6.82秒
优化后,加载时间才2.59秒,提升了60%的加载
其实出发点还是比较好理解的,压缩js和使用CDN因为我这边用的Linux服务器,然后安装的宝塔,使用的Nginx,默认是开启了Gzip,所以我们可以先安装compression-webpack-pluginyarn add compression-webpack-plugin或者npm install compression-webpack-plugin
然后,我们在vue.config.js中做如下的配置const CompressionWebpackPlugin = require('compression-webpack-plugin')module.exports = { productionSourceMap: false, configureWebpack: config => { if (isProduction) { // 开启gzip压缩 config.plugins.push(new CompressionWebpackPlugin({ algorithm: 'gzip', test: /\.js$|\.html$|\.json$|\.css/, threshold: 10240, minRatio: 0.8 })) } }}
这样,Gzip就可以在打包的时候生成了,如下图,打包前后体积还是很明显的,但是这样是不够的
为了防止文件过大,我们先把公共代码分离config.optimization = { runtimeChunk: 'single', splitChunks: { chunks: 'all', maxInitialRequests: Infinity, minSize: 20000, cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name(module) { const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1] return `npm.${packageName.replace('@', '')}` } } } }}
打包后的效果,如下图
那么,在最后就是用CDN这里就引入一个vue.js作为例子config.externals = { vue: 'Vue'}
需要在你的public/index.html的body标签中引用对应版本的vue.js
然后整体打包,ok,附上完整的vue.config.jsconst path = require('path')const CompressionWebpackPlugin = require('compression-webpack-plugin')const appname = 'index'function resolve(dir) { return path.join(__dirname, dir)}const isProduction = process.env.NODE_ENV === 'production'// vue.config.jsmodule.exports = { productionSourceMap: false, outputDir: appname + 'OutPutFile', // 运行时生成的生产环境构建文件的目录(默认""dist"",构建之前会被清除) assetsDir: appname + 'public', //放置生成的静态资源(s、css、img、fonts)的(相对于 outputDir 的)目录(默认"") indexPath: appname + '.html', //指定生成的 index.html 的输出路径(相对于 outputDir)也可以是一个绝对路径。 configureWebpack: config => { if (isProduction) { // 开启gzip压缩 config.plugins.push(new CompressionWebpackPlugin({ algorithm: 'gzip', test: /\.js$|\.html$|\.json$|\.css/, threshold: 10240, minRatio: 0.8 })) config.optimization = { runtimeChunk: 'single', splitChunks: { chunks: 'all', maxInitialRequests: Infinity, minSize: 20000, cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name(module) { const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1] return `npm.${packageName.replace('@', '')}` } } } } } config.performance = { hints: 'warning', //入口起点的最大体积 maxEntrypointSize: 50000000, //生成文件的最大体积 maxAssetSize: 30000000, //只给出 js 文件的性能提示 assetFilter: function(assetFilename) { return assetFilename.endsWith('.js') } } config.externals = { vue: 'Vue' } } }, chainWebpack: (config) => { config.resolve.alias .set('@$', resolve('src')) .set('@api', resolve('src/api')) .set('@assets', resolve('src/assets')) .set('@comp', resolve('src/components')) .set('@views', resolve('src/views')) .set('@layout', resolve('src/layout')) .set('@static', resolve('src/static')) }, css: { }, lintOnSave: undefined}
最后的一点建议,如果条件允许,能走cdn尽量走cdn,效果还是比较惊人的。
79岁老人欲取离世儿子41万存款被拒,银行:“要先证明是死者唯一继承人”
79岁老人欲取离世儿子41万存款被拒,银行:“要先证明是死者唯一继承人”,存款,储户,法院,原告,离世,公证处,存折账户,唯一继承人(0)人阅读时间:2023-06-04清华学者周波:在“香会”听中美防长演讲,听出了什么?
清华学者周波:在“香会”听中美防长演讲,听出了什么?,印太,香会,清华,中美防长演讲,外交部发言人毛宁,周波(1962年)(0)人阅读时间:2023-06-04这国“进一步向中国靠拢”之际,美高官连续到访
这国“进一步向中国靠拢”之际,美高官连续到访,沙特,伊朗,利雅得,以色列,美国,外交大臣(0)人阅读时间:2023-06-042020中秋国庆茂名易拥堵路段汇总 今天茂名上来广州堵车
2020年中秋国庆长假是今年最后一个长假,在这段期间呢,高速公路毫无疑问也是非常热闹的。接下来小编给大家带来一份中秋茂名易拥堵路段汇总。(0)人阅读时间:2023-06-04水墨画竹子的画法 水墨画竹子的画法简单
1、画横幅的竹,先立杆,再添枝箨。注意用笔要苍劲有力、果断和和笔墨浓淡变化。2、画竹时,竹叶的美最重要,所以画叶必须功夫扎实才能使画面完美。3、画第二层竹叶,用墨要比第一层淡,并注意疏密和节奏变化。4、用最淡的墨画第三层..2023-06-05梦见人死了是什么意思 做梦梦见人死了是什么意思
1、梦见人要死了,得此梦者多主你近期内事业压力大,而你本人事业终要面对的事情多,则导致你的情绪不稳定,郁结于心,发之于梦,从事与业务工作相关者近期内你的麻烦会更多,切不可对自己要求过高,一切随遇而安最好。2、小孩儿梦到亲..2023-06-05什么是辟谷(什么是辟谷 如何辟谷)
1、“辟谷”源自道家养生中的“不食五谷”,是古人常用的一种养生方式。它源于先秦,流行于唐朝,又称却谷、去谷、绝谷、绝粒、却粒、休粮等。辟谷最早的记载源自《庄子·逍遥游》:“藐姑射之山,有神人居焉。肌肤若冰雪,淖约若处子,..2023-06-05如何使用牙签做插针生活小窍门 牙签插眼图片
牙签在日常生活中在平常不过了,很多人往往使用牙签,只是对于在饭局上用到。下面教大家如何巧用牙签在Iphone设备上起到的作用。首先,准..2023-06-04