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
posted on   文仲玉  阅读(1333)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示