vue打包优化-webpack打包器

性能优化的目的

1、项目启动速度,和性能
2、必要的清理数据
3、减少打包后的体积

性能优化的方向

  • 路由懒加载
  • 去除生产版console.log的打印输出
  • 开发版使用依赖项,生产版使用在线CDN
  • 项目打包及配置

1. 路由懒加载

使用import()函数引用路由组件

import {createWebHashHistory,createRouter} from 'vue-router'
const routes = [{
	path:'/foo',
	component:()=> import('./Foo.vue')
}]
export default createRouter({
	routes,
	history:createWebHashHistory()
})

2. 第三方组件按需加载

我们在项目中经常会需要引入第三方插件,如果我们直接引入整个插件,会导致项目的体积太大,我们可以借助 babel-plugin-component ,然后可以只引入需要的组件,以达到减小项目体积的目的。由于我在项目中使用的是element-UI,以下为项目中引入 element-ui 组件库为例。
配置babel.config.js

module.exports = {
  presets: ["@vue/cli-plugin-babel/preset"],
  //elementUI按需引入
  plugins: [
    [
      "component",
      {
        libraryName: "element-ui",
        styleLibraryName: "theme-chalk",
      },
    ],
  ],
}

3. 常用工具库使用CDN加速

在我们的项目中会使用到很多的第三方库,这些插件往往都是不会更改的,所以我们可以选择将这些插件库使用CDN引入的方式,而不将这些库打包到我们的项目目录中

<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>

实现这种效果可以借助webpack-cdn-plugin

npm install webpack-cdn-plugin -D
// vue.config.js
const defineConfig = require('@vue/cli-service');
const CDNPlugin = require('webpack-cdn-plugin');
defineCofig({
	configureWebpack(config){
		config.externals = {
			vue:'Vue'	
		}
		config.plugins.push(new CDNPlugin({
			modules:[{
	            name: 'vue',
	            var:'Vue',
	            path: 'dist/vue.global.prod.js'
			}],
			product:true,
			publicPath:'node_modules'
		}));
	}
});

4. 使用gzip压缩

gzip 是 GNUzip 的缩写,最早用于 UNIX 系统的文件压缩。通过gzip压缩可以有效的减少代码体积。
先安装compression-webpack-plugin

npm install compression-webpack-plugin -D

在vue.config.js中配置

const webpack = require("webpack")
const CompressionWebpackPlugin = require("compression-webpack-plugin")
const productionGzipExtensions = ["js", "css"]

module.exports = {
  configureWebpack: (config) => {
  	const plugins = []
  	//start 生成gzip压缩文件
  	plugins.push(
	  // Ignore all locale files of moment.js
	  new webpack.IgnorePlugin(/^\.\/locale$/,/moment$/),

	  // 配置compression-webpack-plugin压缩
	  new CompressionWebpackPlugin({
	  	algorithm: "gzip",
	  	test: new RegExp("\\.(" +productionGzipExtensions.join("|") + ")$"),
	  	threshold: 10240,	//对10K以上的数据进行压缩
	  	minRatio: 0.8,
	  }),
	  new webpack.optimize.LimitChunkCountPlugin({
		maxChunks: 5,
		minChunkSize: 100,
	  })
	)
	//end 结束生成gzip压缩文件
	config.plugins = [...config.plugins, ...plugins]
  }
}

但是这样打包后的文件直接部署到服务器上会找不到对应的js文件,因为压缩后的文件后缀是.gz,需要配置服务器返回对应的gz文件。

5. 打包不生成map文件

在vue.config.js中配置

module.exports = {
  productionSourceMap: false,
}

6. 关闭prefetch

在vue.config.js中配置

module.exports = {
  chainWebpack: config => {
    // 移除 prefetch 插件
    config.plugins.delete('prefetch')

    // 或者
    // 修改它的选项:
    config.plugin('prefetch').tap(options => {
      options[0].fileBlacklist = options[0].fileBlacklist || []
      options[0].fileBlacklist.push(/myasyncRoute(.)+?\.js$/)
      return options
    })
  }
}

7. 代码压缩

安装uglifyjs-webpack-plugin

npm install uglifyjs-webpack-plugin -D

在vue.config.js中配置

//在configureWebpack中加入
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
// 核心代码
module.exports = {
  chainWebpack: config => {
   	config.plugins = [...config.plugins,new UglifyJsPlugin({
    	uglifyOptions: {
        	//生产环境自动删除console
        	compress: {
            	drop_debugger: true,
           	 	drop_console: true,
           	 	pure_funcs: ['console.log']
       	 	}	
    	},
   	 	sourceMap: false,
    	parallel: true
	})]
  }
}

vue本身就集成了terser-plugin,我们可以直接修改config对象中的terser-plugin配置

module.exports = defineConfig({
  configureWebpack:(config) => {
    // 去除代码中的console,通过查看config的optimization.minimizer可以得知optimization.minimizer的第一个元素就是terser-plugin
    config.optimization.minimizer[0].options.minimizer.options.compress = Object.assign(config.optimization.minimizer[0].options.minimizer.options.compress, {
      drop_debugger: true,
      drop_console: true
    });
   
  },
})

8. 图片压缩

安装image-webpack-loader

npm install image-webpack-loader -D

在vue.config.js中配置

module.exports = {
  chainWebpack: config => {
   	config.plugins.delete('prefetch')
	config.module.rule('images')
	.test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
	.use('image-webpack-loader')
	.loader('image-webpack-loader')
	.options({ bypassOnDebug: true, mozjpeg: {
          progressive: true,
        },
        // optipng.enabled: false will disable optipng
        optipng: {
          enabled: false,
        },
        pngquant: {
          quality: [0.65, 0.90],
          speed: 4
        },
        gifsicle: {
          interlaced: false,
        },
        // the webp option will enable WEBP
        webp: {
          quality: 75
        }});
  }
}

除了上面的插件外image-minimizer-webpack-plugin也可以对图片进行压缩
安装image-minimizer-webpack-plugin

npm install iimage-minimizer-webpack-plugin imagemin imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo -D

在vue.config.js中配置

const ImageminWebpackPlugin = require('imageminimizer-webpack-plugin);
module.exports = {
	configWebpack:(config)=>{
		config.plugins.push(new ImageminimizerWebpackPlugin({
        minimizer: {
          implementation: ImageMinimizerPlugin.imageminMinify,
          options: {
            // Lossless optimization with custom option
            // Feel free to experiment with options for better result for you
            plugins: [
              ["gifsicle", { interlaced: true }],
              ["jpegtran", { progressive: true }],
              ["optipng", { optimizationLevel: 5 }],
              // Svgo configuration here https://github.com/svg/svgo#configuration
              [
                "svgo",
                {
                  plugins: [
                    {
                      name: "preset-default",
                      params: {
                        overrides: {
                          removeViewBox: false,
                          addAttributesToSVGElement: {
                            params: {
                              attributes: [
                                { xmlns: "http://www.w3.org/2000/svg" },
                              ],
                            },
                          },
                        },
                      },
                    },
                  ],
                },
              ],
            ],
          },
        },
      });
	}
}

在安装之前需要把199.232.4.133 raw.githubusercontent.com 配置到C:\Windows\System32\drivers\etc\hosts中,然后在Microsoft Store 下载watt toolkit打开github加速,在加速之前,点击右上角的...点击安装证书,然后点击打开证书文件夹,在cmd中执行npm config set ca <证书地址>

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
为了优化webpack打包vue项目,你可以考虑以下几个方面: 1. 使用代码分割:将代码拆分成多个小块,按需加载,减小初始加载的文件大小。可以使用webpack的SplitChunksPlugin插件来进行代码分割。 2. 使用懒加载:对于一些不常用或者较大的模块,可以使用懒加载的方式来延迟加载,减小初始加载的文件大小。可以通过vue-router的异步路由或者webpack的import函数来实现。 3. 压缩代码:使用webpack的UglifyJsPlugin插件来压缩代码,减小文件体积。 4. 使用缓存:通过设置webpack的output.filename和output.chunkFilename选项来生成带有hash的文件名,以便浏览能够缓存文件,减少重复请求。 5. 图片优化:将图片进行压缩和转换为base64编码,以减小文件大小。可以使用url-loader或者file-loader插件来处理图片。 6. 清除无用代码:使用webpack的Tree Shaking特性去除未使用的代码,减少输出文件体积。 7. 配置合理的Devtool选项:在开发环境中使用sourcemap来方便调试代码,而在生产环境中使用cheap-source-map或者none等选项来减小构建时间和文件大小。 8. 优化打包时的性能:使用happypack插件来多线程处理webpack的loader和babel-loader,使用ParallelUglifyPlugin插件来并行压缩代码,提高构建速度。 以上是一些常见的webpack打包vue项目的优化方法,你可以根据具体情况选择适合你项目的优化策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端御书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值