Vue Cli 项目打包体积过大,优化vue项目体积
最新打包vue cli 4.5 项目时,体积尽然达到了9M,页面访问的速度,因此进行尝试进行优化,最终压缩到 968k ,效果明显。下面是优化方法。
首先新建文件'vue.config.js',放在项目根目录下,与package.json在同一级目录下
1.BundleAnalyzer
作用:展示打包图形化信息,会打开一个html页面,帮助自己分析哪些文件过大,可针对其进行优化,上线前 注释掉
安装 webpack-bundle-analyzer
插件
npm install webpack-bundle-analyzer --save-dev
在 vue.config.js:
里面:
1 // 引入 2 const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; 3 4 // 展示图形化信息 5 chainWebpack: config => { 6 config 7 .plugin('webpack-bundle-analyzer') 8 .use(BundleAnalyzerPlugin) 9 }
2.抽离 css 支持按需加载
安装 mini-css-extract-plugin
插件
npm install mini-css-extract-plugin -D
在 vue.config.js
里面:
1 chainWebpack: config => { 2 let miniCssExtractPlugin = new MiniCssExtractPlugin({ 3 filename: 'assets/[name].[hash:8].css', 4 chunkFilename: 'assets/[name].[hash:8].css' 5 }) 6 config.plugin('extract-css').use(miniCssExtractPlugin) 7 }
3.图片按需加载
安装image-webpack-loader
插件
npm install image-webpack-loader -D
在 vue.config.js
里面:
1 config.module.rule('images') 2 .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/) 3 .use('image-webpack-loader') 4 .loader('image-webpack-loader') 5 .options({ 6 bypassOnDebug: true 7 }) 8 .end()
4.gzip压缩代码
安装 compression-webpack-plugin
插件
npm install compression-webpack-plugin -D
在 vue.config.js
里面:
1 const CompressionWebpackPlugin = require('compression-webpack-plugin'); 2 3 // 开启gzip压缩 4 config.plugins.push( 5 new CompressionWebpackPlugin( 6 { 7 filename: info => { 8 return `${info.path}.gz${info.query}` 9 }, 10 algorithm: 'gzip', 11 threshold: 10240, // 只有大小大于该值的资源会被处理 10240 12 test: new RegExp('\\.(' + ['js'].join('|') + ')$' 13 ), 14 minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理 15 deleteOriginalAssets: false // 删除原文件 16 } 17 ) 18 )
5.element-ui 按需加载
安装 babel-plugin-component
插件
npm install babel-plugin-component --save-dev
在 babel.config.js
里面:
1 module.exports = { 2 presets: [ 3 '@vue/app' 4 ], 5 plugins: [ 6 [ 7 "component", 8 { 9 libraryName: "element-ui", 10 styleLibraryName: "theme-chalk" 11 } 12 ] 13 ] 14 }
6.Echarts 按需加载
安装 babel-plugin-equire
插件:
npm install babel-plugin-equire -D
创建 echarts.js
:
1 // eslint-disable-next-line 2 const echarts = equire([ 3 // 写上你需要的 echarts api 4 "tooltip", 5 "line" 6 ]); 7 export default echarts;
在 babel.config.js
里面:
1 module.exports = { 2 presets: [ 3 '@vue/app' 4 ], 5 plugins: [ 6 [ 7 "component", 8 { 9 libraryName: "element-ui", 10 styleLibraryName: "theme-chalk" 11 } 12 ], 13 "equire" 14 ] 15 }
具体页面应用:
1 // 直接引用 2 import echarts from '@/lib/util/echarts.js' 3 4 this.myChart = echarts.init(this.$refs.chart)
7.lodash 按需加载
安装 lodash-webpack-plugin
插件
npm install lodash-webpack-plugin --save-dev
在 babel.config.js
里面:
1 module.exports = { 2 presets: [ 3 '@vue/app' 4 ], 5 plugins: [ 6 [ 7 "component", 8 { 9 libraryName: "element-ui", 10 styleLibraryName: "theme-chalk" 11 } 12 ], 13 "lodash", 14 "equire" 15 ] 16 }
在 vue.config.js
里面:
1 const LodashModuleReplacementPlugin = require("lodash-webpack-plugin"); 2 3 chainWebpack: config => { 4 config 5 .plugin("loadshReplace") 6 .use(new LodashModuleReplacementPlugin()); 7 8 }
8.prefetch 和 preload
删除无用的插件,避免加载多余的资源(如果不删除的话,则会在 index.html 里面加载 无用的 js 文件)
chainWebpack: config => { // 移除prefetch插件,避免加载多余的资源 config.plugins.delete('prefetch') / 移除 preload 插件,避免加载多余的资源 config.plugins.delete('preload'); }
总结
通过如上的几个步骤,能够很好地优化项目打包体积大小,从而优化项目。
vue.config.js文件中完整代码
1 onst MiniCssExtractPlugin = require('mini-css-extract-plugin'); 2 const CompressionWebpackPlugin = require('compression-webpack-plugin'); 3 const LodashModuleReplacementPlugin = require("lodash-webpack-plugin"); 4 5 module.exports = { 6 productionSourceMap: false, // 关闭生产环境的 source map 7 lintOnSave: false, 8 publicPath: process.env.VUE_APP_PUBLIC_PATH, 9 devServer: { 10 host: "localhost", 11 port: 3002, 12 proxy: { 13 '/api': { 14 target: "https://tapi.quanziapp.com/api/", 15 ws: true, 16 changeOrigin: true, 17 pathRewrite: { 18 '^/api': '' 19 } 20 }, 21 } 22 }, 23 24 chainWebpack: config => { 25 26 // 移除 prefetch 插件 27 config.plugins.delete('prefetch'); 28 // 移除 preload 插件,避免加载多余的资源 29 config.plugins.delete('preload'); 30 31 config.optimization.minimize(true); 32 33 config.optimization.splitChunks({ 34 chunks: 'all' 35 }) 36 37 config 38 .plugin('webpack-bundle-analyzer') 39 .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin) 40 41 if (process.env.NODE_ENV !== 'development') { 42 43 let miniCssExtractPlugin = new MiniCssExtractPlugin({ 44 filename: 'assets/[name].[hash:8].css', 45 chunkFilename: 'assets/[name].[hash:8].css' 46 }) 47 config.plugin('extract-css').use(miniCssExtractPlugin) 48 config.plugin("loadshReplace").use(new LodashModuleReplacementPlugin()); 49 50 config.module.rule('images') 51 .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/) 52 .use('image-webpack-loader') 53 .loader('image-webpack-loader') 54 .options({ 55 bypassOnDebug: true 56 }) 57 .end() 58 .use('url-loader') 59 .loader('file-loader') 60 .options({ 61 name: 'assets/[name].[hash:8].[ext]' 62 }).end() 63 config.module.rule('svg') 64 .test(/\.(svg)(\?.*)?$/) 65 .use('file-loader') 66 .loader('file-loader') 67 .options({ 68 name: 'assets/[name].[hash:8].[ext]' 69 }) 70 } 71 }, 72 configureWebpack: config => { 73 // config.plugins.push(["equire"]); 74 75 if (process.env.NODE_ENV !== 'development') { 76 config.output.filename = 'assets/[name].[hash:8].js' 77 config.output.chunkFilename = 'assets/[name].[hash:8].js' 78 } 79 // 公共代码抽离 80 config.optimization = { 81 // 分割代码块 82 splitChunks: { 83 cacheGroups: { 84 //公用模块抽离 85 common: { 86 chunks: 'initial', 87 minSize: 0, //大于0个字节 88 minChunks: 2, //抽离公共代码时,这个代码块最小被引用的次数 89 }, 90 //第三方库抽离 91 vendor: { 92 priority: 1, //权重 93 test: /node_modules/, 94 chunks: 'initial', 95 minSize: 0, //大于0个字节 96 minChunks: 2, //在分割之前,这个代码块最小应该被引用的次数 97 }, 98 }, 99 } 100 } 101 // 开启gzip压缩 102 config.plugins.push( 103 new CompressionWebpackPlugin( 104 { 105 filename: info => { 106 return `${info.path}.gz${info.query}` 107 }, 108 algorithm: 'gzip', 109 threshold: 10240, // 只有大小大于该值的资源会被处理 10240 110 test: new RegExp('\\.(' + ['js'].join('|') + ')$' 111 ), 112 minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理 113 deleteOriginalAssets: false // 删除原文件 114 } 115 ) 116 ) 117 }, 118 css: { 119 extract: true, 120 sourceMap: false, 121 loaderOptions: { 122 sass: { 123 }, 124 }, 125 }, 126 } 127
————————————————
版权声明:本文为CSDN博主「木不是丁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/D102601560/article/details/109025683
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具