当前位置: 首页 > news >正文

webpack + vite 打包优化

打包优化

    • webpack 优化
      • 1、依赖转化,兼容低版本浏览器
      • 2、生产环境关闭sourceMap
      • 3、打包输出目录名称修改和静态资源的存放
      • 4、修改图标
      • 5、修改webpack配置
        • 5-1、写在此处的配置可以覆盖掉脚手架本来就预设上有的配置
        • 5-2、写在此处的都是预设没有配置的,脚手架本来就有的配置是不会覆盖的
      • 6、完整配置
    • vite 优化

webpack 优化

1、依赖转化,兼容低版本浏览器

// 对依赖进行转换
transpileDependencies: true,

2、生产环境关闭sourceMap

// 生产关闭sourceMap
productionSourceMap: false,

3、打包输出目录名称修改和静态资源的存放

outputDir: 'bundle', // 打包后文件的目录 (默认为dist)
assetsDir: 'static', //  outputDir的静态资源(js、css、img、fonts)目录  默认为‘’没有单独目录js/css/img在根目录中。

4、修改图标

// 修改浏览器的icon图标,不加下面的,修改浏览器图标不生效
pwa: {iconPaths: {favicon32: 'favicon.ico',favicon16: 'favicon.ico',appleTouchIcon: 'favicon.ico',maskIcon: 'favicon.ico',msTileImage: 'favicon.ico',}
}

5、修改webpack配置

5-1、写在此处的配置可以覆盖掉脚手架本来就预设上有的配置
chainWebpack: config => {config.optimization.minimizer('terser').tap(args => {// 删除代码中的注释和打印,减少一点代码体积args.forEach(item => {if (item.hasOwnProperty('terserOptions')) {Object.assign(item['terserOptions'].compress, {drop_debugger: true,drop_console: true,pure_funcs: ['console.log']})}item['terserOptions']['format'] = {comments: false}})return args})// 开启 gzip 压缩if (process.env.NODE_ENV === "production") {config.plugin('CompressionPlugin').use(new CompressionWebpackPlugin({test: /\.(js|css|less|scss|html)$/,   // 将 css、scss、less、html 进行压缩threshold: 10240, // 超过10kb的文件就压缩deleteOriginalAssets: false, // 不删除源文件minRatio: 0.8,   // 最小压缩率 0.8algorithm: 'gzip'}))}
}
5-2、写在此处的都是预设没有配置的,脚手架本来就有的配置是不会覆盖的
configureWebpack: {// 代码分割optimization: {splitChunks: {chunks: "all",// 定义一个cache组,将第三方的包抽离出来cacheGroups: {elementUI: {// 抽离出来的名字name: "element-chunk-vendors",// 在node_modules包里面找test: /[\\/]node_modules[\\/]_?element-ui(.*)/,// 权重,越大优先打包priority: 30,},vue: {name: "vue-chunk-vendors",test: /[\\/]node_modules[\\/]vue(.*)[\\/]/,chunks: "initial",priority: 20,reuseExistingChunk: true,},vueRouter: {name: "vueRouter-chunk-vendors",test: /[\\/]node_modules[\\/]vue-router(.*)[\\/]/,chunks: "initial",priority: 19,},vuex: {name: "vuex-chunk-vendors",test: /[\\/]node_modules[\\/]vuex(.*)[\\/]/,chunks: "initial",priority: 18,},echarts: {name: "echarts-chunk-vendors",test: /[\\/]node_modules[\\/]echarts(.*)[\\/]/,chunks: "initial",priority: 17,},// 剩下的别忘记单独抽离libs: {name: "chunk-libs-vendors",test: /[\\/]node_modules[\\/]/,priority: 1, // 权重最低,优先考虑前面内容chunks: "initial",},// 针对自己写的代码,重复使用的满足下面的配置就会抽离出来单独打包,比如 utils 下面的包default: {// 其他没有写的配置会使用上面的默认值test: /[\\/]src(.*)[\\/]/,name: "common-chunk",minSize: 20000, // 超过 20kb,就会拆包minChunks: 2,  // 引用两次就会拆包priority: -10,reuseExistingChunk: true}}}},// 配置别名resolve: {alias: {"#": path.resolve(__dirname, "src")}},// 分析插件plugins: [new BundleAnalyzer({analyzerMode: 'server',analyzerHost: '127.0.0.1',analyzerPort: 8088,reportFilename: 'report.html',defaultSizes: 'parsed',openAnalyzer: true,generateStatsFile: false,statsFilename: 'state.json',statsOptions: null,logLevel: 'info'})]
}

6、完整配置

const path = require("path")
const { defineConfig } = require('@vue/cli-service')
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const BundleAnalyzer = require('webpack-bundle-analyzer').BundleAnalyzerPluginmodule.exports = defineConfig({// 对依赖进行转换transpileDependencies: true,// 生产关闭sourceMapproductionSourceMap: false,outputDir: 'bundle', // 打包后文件的目录 (默认为dist)assetsDir: 'static', //  outputDir的静态资源(js、css、img、fonts)目录  默认为‘’没有单独目录js/css/img在根目录中。// 修改浏览器的icon图标pwa: {iconPaths: {favicon32: 'favicon.ico',favicon16: 'favicon.ico',appleTouchIcon: 'favicon.ico',maskIcon: 'favicon.ico',msTileImage: 'favicon.ico',}},// webpack 配置(写在此处的配置可以覆盖掉脚手架本来就预设上有的配置)chainWebpack: config => {config.optimization.minimizer('terser').tap(args => {// 删除代码中的注释和打印,减少一点代码体积args.forEach(item => {if (item.hasOwnProperty('terserOptions')) {Object.assign(item['terserOptions'].compress, {drop_debugger: true,drop_console: true,pure_funcs: ['console.log']})}item['terserOptions']['format'] = {comments: false}})return args})// 开启 gzip 压缩,对应的 nginx 也需要配置if (process.env.NODE_ENV === "production") {config.plugin('CompressionPlugin').use(new CompressionWebpackPlugin({test: /\.(js|css|less|scss|html)$/,   // 将 css、scss、less、html 进行压缩threshold: 10240, // 超过10kb的文件就压缩deleteOriginalAssets: false, // 不删除源文件minRatio: 0.8,   // 最小压缩率 0.8algorithm: 'gzip'}))}},// webpack 配置(写在此处的都是预设没有配置的,脚手架本来就有的配置是不会覆盖的)configureWebpack: {// 代码分割optimization: {splitChunks: {chunks: "all",// 定义一个cache组,将第三方的包抽离出来cacheGroups: {elementUI: {// 抽离出来的名字name: "element-chunk-vendors",// 在node_modules包里面找test: /[\\/]node_modules[\\/]_?element-ui(.*)/,// 权重,越大优先打包priority: 30,},vue: {name: "vue-chunk-vendors",test: /[\\/]node_modules[\\/]vue(.*)[\\/]/,chunks: "initial",priority: 20,reuseExistingChunk: true,},vueRouter: {name: "vueRouter-chunk-vendors",test: /[\\/]node_modules[\\/]vue-router(.*)[\\/]/,chunks: "initial",priority: 19,},vuex: {name: "vuex-chunk-vendors",test: /[\\/]node_modules[\\/]vuex(.*)[\\/]/,chunks: "initial",priority: 18,},echarts: {name: "echarts-chunk-vendors",test: /[\\/]node_modules[\\/]echarts(.*)[\\/]/,chunks: "initial",priority: 17,},// 剩下的别忘记单独抽离libs: {name: "chunk-libs-vendors",test: /[\\/]node_modules[\\/]/,priority: 1, // 权重最低,优先考虑前面内容chunks: "initial",},// 针对自己写的代码,重复使用的满足下面的配置就会抽离出来单独打包,比如 utils 下面的包default: {// 其他没有写的配置会使用上面的默认值test: /[\\/]src(.*)[\\/]/,name: "common-chunk",minSize: 20000, // 超过 20kb,就会拆包minChunks: 2,  // 引用两次就会拆包priority: -10,reuseExistingChunk: true}}}},// 配置别名resolve: {alias: {"#": path.resolve(__dirname, "src")}},plugins: [new BundleAnalyzer({analyzerMode: 'server',analyzerHost: '127.0.0.1',analyzerPort: 8088,reportFilename: 'report.html',defaultSizes: 'parsed',openAnalyzer: true,generateStatsFile: false,statsFilename: 'state.json',statsOptions: null,logLevel: 'info'})]}
})// 打包分析工具加了之后 启动需要加上:"build": "vue-cli-service build","build:analyze": "cross-env NODE_ENV=production npm_config_report=true vue-cli-service build"

https://juejin.cn/post/6951297954770583565

vite 优化

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import viteCompression from "vite-plugin-compression";// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),Components({//自定义的模块dirs: ['src/components'],extensions: ['vue', 'ts'],resolvers: [ElementPlusResolver()]}),AutoImport({ // 插件进行自动导入相关的依赖库//安装两行后你会发现在组件中不用再导入ref,reactive等imports: ['vue', 'vue-router'],// 可选,用于自动导入组件类型dts: 'src/components.d.ts'}),// 开启gzip压缩viteCompression({verbose: true,disable: false,threshold: 10240,algorithm: 'gzip',ext: '.gz',})],// 打包build: {// 打包删除 console 和 debugger minify: "terser",terserOptions: {compress: {drop_console: true,drop_debugger: true}},rollupOptions: {output: {  //静态资源分类打包chunkFileNames: 'static/js/[name]-[hash].js',entryFileNames: 'static/js/[name]-[hash].js',assetFileNames: 'static/[ext]/[name]-[hash].[ext]',manualChunks(id: string) { // node_modules 拆包if (id.indexOf('node_modules') !== -1) {if (id.indexOf('vue') !== -1) {return id.toString().split('node_modules/')[1].split('/')[0].toString();}if (id.indexOf('vue-router') !== -1) {return id.toString().split('node_modules/')[1].split('/')[0].toString();}if (id.indexOf('pinia') !== -1) {return id.toString().split('node_modules/')[1].split('/')[0].toString();}if (id.indexOf('element-plus') !== -1) {return id.toString().split('node_modules/')[1].split('/')[0].toString();}}}}}}
});

相关文章:

  • RPA除了和OCR、NLP技术结合,还能和什么技术结合?
  • 【数据分析】上市公司半年报数据分析
  • react-markdown支持83版本的Chrome,解决Object.hasOwn is not a function问题
  • 基于JAYA算法的无人机航迹规划-附代码
  • Linux命令(110)之umask
  • uniapp如何使用mumu模拟器
  • 【设计模式】第24节:行为型模式之“模板方法模式”
  • Jenkins项目部署
  • 医学AI智能导诊系统源码
  • NB-IOT的粮库挡粮门异动监测装置
  • 【设计模式之原型模式 】– C++
  • <多线程章节八> 单例模式中的饿汉模式与懒汉模式的讲解,以及懒汉模式中容易引起的Bug
  • 13.7性能测试工具(LoadRunner)(简单扫盲)
  • 【设计模式】第25节:行为型模式之“访问者模式”
  • 通过gosec白盒扫描Go代码中的SQL注入
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 345-反转字符串中的元音字母
  • Android系统模拟器绘制实现概述
  • ES6核心特性
  • in typeof instanceof ===这些运算符有什么作用
  • JS字符串转数字方法总结
  • rc-form之最单纯情况
  • React的组件模式
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SQLServer之创建显式事务
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • windows下如何用phpstorm同步测试服务器
  • 番外篇1:在Windows环境下安装JDK
  • 回顾 Swift 多平台移植进度 #2
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 批量截取pdf文件
  • 实现菜单下拉伸展折叠效果demo
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微服务入门【系列视频课程】
  • 异步
  • 怎么把视频里的音乐提取出来
  • 国内开源镜像站点
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (23)Linux的软硬连接
  • (6)STL算法之转换
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C#)一个最简单的链表类
  • (c语言)strcpy函数用法
  • (ibm)Java 语言的 XPath API
  • (pojstep1.3.1)1017(构造法模拟)
  • (多级缓存)缓存同步
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (轉貼) UML中文FAQ (OO) (UML)
  • .net FrameWork简介,数组,枚举
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑