vite构建打包性能优化

目录

1、清除console和debugger

二、gzip静态资源压缩

第一步:客户端打包开启

第二步:部署服务端开启

三、 静态文件按类型分包

四、超大静态资源拆分(代码分割)

第一种:提高静态资源的容量大小

第二种:合并路由打包

第三种:最小拆分打包

五、打包分析插件

六、组件按需导入

七、图片资源压缩

八、CDN加速 


我的博客原文:https://code-nav.top/article/1071

最近在用Vite4+Typescript+Vue3.2+SSR重构我的博客,由于项目内容较多,所以遇到了一些性能问题,所以在构建生产环境时做了一些优化,在这里做一个记录,方便大家参考。

1、清除console和debugger

安装 terser插件

npm install  terser  -D

 build里添加terserOptions配置

// 打包环境移除console.log,debugger
terserOptions: {
  compress: {
    drop_console: true,
    drop_debugger: true
  }
},

二、gzip静态资源压缩

第一步:客户端打包开启

首先下载 vite-plugin-compression

npm i vite-plugin-compression -D

在vite.config.ts中引入

// 引入
import viteCompression from 'vite-plugin-compression'

//在plugins配置数组里添加gzip插件
viteCompression({
  verbose: true, // 默认即可
  disable: false, // 开启压缩(不禁用),默认即可
  deleteOriginFile: false, // 删除源文件
  threshold: 5120, // 压缩前最小文件大小
  algorithm: 'gzip', // 压缩算法
  ext: '.gz' // 文件类型
})

打包出的效果图: 

第二步:部署服务端开启

  nginx中添加压缩配置

    # 开启或者关闭gzip模块(on|off)
    gzip on;
    # 允许压缩的页面最小字节数, 默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大
    gzip_min_length 1k; 
    # 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。
    gzip_buffers 4 16k; 
    # 识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。
    #gzip_http_version 1.0;
    # gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。
    gzip_comp_level 2;
    # 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    # 和http头有关系,加个vary头,给代理服务器用的
    gzip_vary off;
    # 表示IE6及以下禁止压缩
    gzip_disable "MSIE [1-6]\.";

三、 静态文件按类型分包

  build中添加如下代码:

build: {
    rollupOptions: {
      output: {
        chunkFileNames: 'static/js/[name]-[hash].js',
        entryFileNames: 'static/js/[name]-[hash].js',
        assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
      }
    }
  }

四、超大静态资源拆分(代码分割)

第一种:提高静态资源的容量大小
build: {
 chunkSizeWarningLimit: 1500,
}
第二种:合并路由打包

  build里的output设置内,添加以下代码

manualChunks: {
  // vue vue-router合并打包
  vue: ['vue', 'vue-router'],
  lodash: ['lodash'],
  // 两个文件合并成一个a文件
  helloWorld: ['src/components/a.vue','src/components/b.vue'],
}
第三种:最小拆分打包
// 插件打包做处理
manualChunks(id) {
  if (id.includes('node_modules')) {
    return id.toString().split('node_modules/')[1].split('/')[0].toString();
  }
  return;
}

五、打包分析插件

Rollup Plugin Visualizer,这是一个依赖分析插件,它提供了多种模式的依赖分析,包括直观的视图分析,sunburst(循环层次图,像光谱)、treemap(矩形层次图,看起来比较直观,也是默认参数)、network(网格图,查看包含关系)、raw-data(原数据模式,json格式), list(列表模式),你可以选择任意一种你喜欢的观察模式。

安装rollup-plugin-visualizer插件

npm i rollup-plugin-visualizer

在vite.config.ts中引入并配置

// 引入
import { visualizer } from 'rollup-plugin-visualizer';

// 在plugins配置数组里添加
visualizer({
  open:true, // 注意这里要设置为true,否则无效,如果存在本地服务端口,将在打包后自动展示
  gzipSize:true,
  file: "stats.html", //分析图生成的文件名
  brotliSize:true
}),

将在打包后自动展示,效果图:

六、组件按需导入

安装unplugin-vue-components插件

npm i unplugin-vue-components -D

在vite.config.ts中引入并配置

import Components from 'unplugin-vue-components/vite'
// ui库解析器,也可以自定义,需要安装相关UI库,unplugin-vue-components/resolvers
// 提供了以下集中解析器,使用的时候,需要安装对应的UI库,这里以element为示例
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  plugins: [
    Components({
      dirs: ['src/components'], // 目标文件夹
      extensions: ['vue','jsx'], // 文件类型
      dts: 'src/components.d.ts', // 输出文件,里面都是一些import的组件键值对
      // ui库解析器,也可以自定义,需要安装相关UI库
      resolvers: [
        ElementPlusResolver(),
      ],
    })
  ]
})

注意:部分同学这个插件下载失败,可以试试以下方案:

npm i vite-plugin-imagemin --ignore-scripts

实在无法下载依赖包的,需要的话找博主私发你,可以部署到自己的npm上。

如何部署npm看我另一篇文章:https://code-nav.top/article/1014

七、 图片资源压缩

安装 vite-plugin-imagemin插件

npm i vite-plugin-imagemin -D

 在vite.config.js里面配置

// 引入
import viteImagemin from 'vite-plugin-imagemin'

// 在plugins配置数组里添加
plugin: [
    viteImagemin({
      gifsicle: {
        optimizationLevel: 7,
        interlaced: false
      },
      optipng: {
        optimizationLevel: 7
      },
      mozjpeg: {
        quality: 20
      },
      pngquant: {
        quality: [0.8, 0.9],
        speed: 4
      },
      svgo: {
        plugins: [
          {
            name: 'removeViewBox'
          },
          {
            name: 'removeEmptyAttrs',
            active: false
          }
        ]
      }
    })
]

八、CDN加速 

内容分发网络(Content Delivery Network,简称 CDN)就是让用户从最近的服务器请求资源,提升网络请求的响应速度。通常我们请求依赖模块使用 CDN ,而请求项目代码依然使用自己的服务器。还是以 lodash 为例:

安装插件 vite-plugin-cdn-import

npm install vite-plugin-cdn-import --save-dev

 在vite.config.js里面配置

import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';

export default defineConfig({
  plugins: [
     importToCDN({
      // 需要 CDN 加速的模块
      modules: [
        // 支持自动导入
        autoComplete('axios'),
        {
          name: 'lodash',
          var: '_',
          path: `https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js`
        }
      ]
    })
  ]
})

 配置完成后,打包自动会在index.html中引入script资源,如下图:

自动导入CDN的功能(autoComplete),有很多常用的依赖不需要自己再找(如vue、reac、antd、axios等),autoComplete功能可以在文档中查找使用。

支持自动完成的模块:

 

注意:自动完成记得在main.ts中引入模块

 在main.ts引入对应模块然后挂载,注意名称要和你CDN加速的name名称相同,不然引不进来,一般不用怎么修改,只有遇到问题后再检查一下自己是不是忘记引入或者引入错误了。

CDN网站查看: https://cdnjs.com/

注意:build打包时候如果遇到报错importToCDN is not a function,这个错误应该和版本有关,将import importToCDN from 'vite-plugin-cdn-import'引入改成import { Plugin as importToCDN } from 'vite-plugin-cdn-import'即可

完整的vite.config.ts 

import path from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
import { viteCommonjs } from '@originjs/vite-plugin-commonjs';
import AutoImport from 'unplugin-auto-import/vite';
import WindiCSS from 'vite-plugin-windicss';
import viteCompression from 'vite-plugin-compression';
import { visualizer } from 'rollup-plugin-visualizer';
import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';
// 引入
import viteImagemin from 'vite-plugin-imagemin';
import Components from 'unplugin-vue-components/vite';
// ui库解析器,也可以自定义,需要安装相关UI库,unplugin-vue-components/resolvers
// 提供了以下集中解析器,使用的时候,需要安装对应的UI库,这里以element为示例
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';

const pathSrc = path.resolve(__dirname, 'src');
export default defineConfig({
  resolve: {
    alias: {
      '@/': `${pathSrc}/`
    }
  },
  plugins: [
    vueJsx(),
    WindiCSS(),
    vue(),
    visualizer(),
    viteCommonjs(),
    Components({
      dirs: ['src/components'], // 目标文件夹
      extensions: ['vue', 'jsx'], // 文件类型
      dts: 'src/components.d.ts', // 输出文件,里面都是一些import的组件键值对
      // ui库解析器,也可以自定义,需要安装相关UI库
      resolvers: [
        ElementPlusResolver()
      ]
    }),
    // 自动导入vue3的hooks
    AutoImport({
      resolvers: [ElementPlusResolver()],
      imports: ['vue', 'vue-router', 'vuex', '@vueuse/core'],
      // 生成路径
      dts: path.resolve(pathSrc, 'auto-imports.d.ts')
    }),
    // 自动导入组件
    Components({
      resolvers: [
        ElementPlusResolver({
          importStyle: 'sass'
        })
      ],
      dts: path.resolve(pathSrc, 'components.d.ts')
    }),
    viteCompression({
      // gzip静态资源压缩配置
      verbose: true,
      disable: false,
      threshold: 10240,
      algorithm: 'gzip',
      ext: '.gz'
    }),
    importToCDN({
      // 需要 CDN 加速的模块
      modules: [
        autoComplete('axios'),
        {
          name: 'lodash',
          var: '_',
          path: `https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js`
        }
      ]
    }),
    viteImagemin({
      gifsicle: {
        optimizationLevel: 7,
        interlaced: false
      },
      optipng: {
        optimizationLevel: 7
      },
      mozjpeg: {
        quality: 20
      },
      pngquant: {
        quality: [0.8, 0.9],
        speed: 4
      },
      svgo: {
        plugins: [
          {
            name: 'removeViewBox'
          },
          {
            name: 'removeEmptyAttrs',
            active: false
          }
        ]
      }
    })
  ],
  server: {
    watch: { usePolling: true },
    open: false,
    hmr: true,
    /* 设置为0.0.0.0则所有的地址均能访问 */
    host: '0.0.0.0',
    port: 8080,
    https: false,
    proxy: {
      '/api': {
        /* 目标代理服务器地址 */
        target: 'https://code-nav.top/',
        /* 允许跨域 */
        changeOrigin: true
      }
    }
  },
  build: {
    outDir: 'JcCloudWeb',
    minify: 'terser',
    cssCodeSplit: true,
    chunkSizeWarningLimit: 1500,
    rollupOptions: {
      input: 'index.html',
      output: {
        // 静态资源打包做处理
        chunkFileNames: 'assets/js/[name]-[hash].js',
        entryFileNames: 'assets/js/[name]-[hash].js',
        assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString();
          }
        }
      }
    },
    terserOptions: {
      // 清除console和debugger
      compress: {
        drop_console: true,
        drop_debugger: true
      }
    }
  }
});

如果你的项目已经在用 Vite ,不妨试验一下以上方案,看看项目会不会变得更加丝滑。欢迎在评论区交流。

如果文章对你有所帮助,❤️关注+点赞❤️鼓励一下博主会持续更新。。。。

我的线上博客:富朝阳的博客

往期回顾

Webpack性能优化

vite构建如何兼容低版本浏览器

前端性能优化9大策略(面试一网打尽)!

vue3.x使用prerender-spa-plugin预渲染达到SEO优化

 vite构建打包性能优化

03-08
<think>嗯,用户让我介绍一下Vite,我需要先回忆一下Vite的相关知识。Vite是一个前端构建工具,对吧?它是由Vue.js的作者尤雨溪开发的,主要特点是速度快,尤其是在开发服务器启动和热更新方面。我记得它利用了浏览器原生ES模块导入的特性,所以不需要打包,直接按需加载,这样开发环境下的启动速度特别快。 接下来要组织一下回答的结构。用户可能需要知道Vite是什么,核心优势,使用场景,基本用法,还有可能和Webpack这样的传统工具对比。不过用户没有明确说要对比,可能先重点介绍Vite本身。 用户可能对Vite的优势比较感兴趣,比如快速的冷启动、即时热模块替换(HMR)、支持多种框架如Vue、React、Svelte等。另外,生产环境构建方面,Vite使用Rollup,这也是一个优势,因为Rollup在打包方面效率很高。 可能需要提到Vite的插件生态系统,虽然相比Webpack可能还不够丰富,但正在快速发展。还有Vite配置相对简单,对新手友好,这也是一个卖点。 然后,用户可能想知道如何开始使用Vite,所以需要给出一个简单的示例,比如创建项目的命令,以及目录结构和基本配置。可能还要提到vite.config.js这个配置文件,以及如何通过插件扩展功能。 还要注意用户可能的背景,比如是否是前端开发者,是否熟悉现有的构建工具。如果用户之前用过Webpack,可能会关心迁移到Vite的难易程度,或者Vite解决了哪些痛点。不过用户的问题只是介绍,所以可能不需要深入比较,但简要提一下差异还是有帮助的。 另外,用户可能关心Vite适合什么样的项目,比如单页应用(SPA)、库开发,或者是否需要特定的框架支持。可以提到Vite默认支持TypeScript、CSS预处理器等,这些都是现代前端开发的常见需求。 需要确认一下最新的Vite版本是否有新特性,比如是否支持SSR(服务器端渲染)或者其他的优化。不过作为一般介绍,可能不需要太深入,保持基础信息准确即可。 最后,可能需要给出一些资源链接,比如官方文档,或者社区推荐的插件,但用户的问题里没有要求,所以可能不需要,但可以建议查阅官方文档获取更多信息。 总结一下,回答的结构应该是:定义、核心优势、适用场景、基本用法、简单示例,可能的话,加上生态系统和配置说明。确保用中文,口语化,避免技术术语堆砌,但必要的术语需要解释清楚。</think>Vite 是一款**现代化前端构建工具**,由 Vue.js 作者尤雨溪主导开发,专注于提升开发体验和构建效率。以下是其核心特性和使用场景的详细介绍: --- ### **一、核心优势** 1. **闪电般的启动速度** - 利用浏览器原生支持的 **ES Modules**(ESM),开发服务器无需打包整个项目,实现**按需编译**。 - 冷启动时间通常**秒级完成**,尤其适合大型项目。 2. **即时热更新(HMR)** - 模块热替换速度极快,修改代码后几乎**无感知刷新**,保持应用状态不丢失。 3. **开箱即用的功能** - 内置对 **TypeScript、CSS 预处理器(Sass/Less)、PostCSS** 的支持。 - 默认支持 **JSX、Vue、React、Svelte** 等多种框架。 4. **高效的生产构建** - 生产环境使用 **Rollup** 进行打包,自动优化代码(如 Tree-shaking、代码分割)。 --- ### **二、适用场景** - **单页应用(SPA)**:快速原型开发或企业级项目。 - **库开发**:轻量级构建,生成多种格式的模块(ESM、CommonJS)。 - **多框架支持**:Vue、React、Lit 等均可无缝集成。 --- ### **三、基础使用** 1. **创建项目** ```bash # 使用 npm npm create vite@latest # 选择框架(如 Vue/React)和模板 ``` 2. **目录结构** ``` my-project/ ├─ src/ │ ├─ main.js # 入口文件 ├─ public/ # 静态资源 ├─ vite.config.js # 配置文件 ``` 3. **常用命令** ```bash npm run dev # 启动开发服务器 npm run build # 构建生产版本 npm run preview # 本地预览生产构建 ``` --- ### **四、配置示例(`vite.config.js`)** ```javascript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 3000, // 自定义端口 open: true // 自动打开浏览器 }, build: { minify: 'terser' // 代码压缩方式 } }) ``` --- ### **五、与传统工具(如 Webpack)对比** | **特性** | Vite | Webpack | |----------------|--------------------------|-----------------------| | **启动速度** | 极快(按需编译) | 较慢(全量打包) | | **HMR 速度** | 毫秒级 | 依赖项目规模 | | **配置复杂度** | 简单,约定大于配置 | 复杂,需手动配置 | | **生产构建** | Rollup(高效但插件较少) | 自研生态(插件丰富) | --- ### **六、生态系统** - **官方插件**:支持 Vue、React、Lit 等框架。 - **社区插件**:如 `vite-plugin-pwa`(PWA 支持)、`unplugin`(统一插件格式)。 --- 如果你需要进一步探索,可以参考 [Vite 官方文档](https://vitejs.dev/),其设计哲学是**“为开发者提供更愉悦的体验”** 🚀。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

富朝阳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值