当前位置:   article > 正文

vite构建打包优化配置_vite-plugin-compression

vite-plugin-compression

目录

一、gzip静态资源压缩

二、静态资源的打包处理(按分类存放相应的文件)

三、大的静态资源拆分/代码分割

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

第二种:合并路由打包

第三种:最小拆分打包

四、组件按需导入

五、清除console和debugger

六、 图片资源压缩

七、使用CDN加速 

八、安装打包分析插件


最近使用Vite4+Typescript+Vue3构建项目,由于项目内容较多,所以遇到了一些性能问题,所以在构建生产环境时做了一些优化,在这里做一个记录。

一、gzip静态资源压缩

首先下载 vite-plugin-compression

npm i vite-plugin-compression -D

vite中使用vite-plugin-compression插件

  1. import viteCompression from 'vite-plugin-compression'
  2. export default defineConfig({
  3. plugins:[
  4. //在plugins配置数组里添加gzip插件
  5. viteCompression({
  6. verbose: true, // 默认即可
  7. disable: false, // 开启压缩(不禁用),默认即可
  8. deleteOriginFile: false, // 删除源文件
  9. threshold: 5120, // 压缩前最小文件大小
  10. algorithm: 'gzip', // 压缩算法
  11. ext: '.gz' // 文件类型
  12. })
  13. ]
  14. })
二、静态资源的打包处理(按分类存放相应的文件)

  build中添加如下代码:

  1. build: {
  2. rollupOptions: {
  3. output: {
  4. // 静态资源打包做处理
  5. chunkFileNames: 'static/js/[name]-[hash].js',
  6. entryFileNames: 'static/js/[name]-[hash].js',
  7. assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
  8. manualChunks(id) {
  9. if (id.includes('node_modules')) {
  10. return id.toString().split('node_modules/')[1].split('/')[0].toString();
  11. }
  12. },
  13. }
  14. }
  15. }
三、大的静态资源拆分/代码分割
第一种:提高静态资源的容量大小
  1. build: {
  2. chunkSizeWarningLimit: 1500,//加大
  3. }
第二种:合并路由打包

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

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

安装unplugin-vue-components插件:

npm i unplugin-vue-components -D

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

  1. import Components from 'unplugin-vue-components/vite'
  2. // ui库解析器,也可以自定义,需要安装相关UI库,unplugin-vue-components/resolvers
  3. // 提供了以下集中解析器,使用的时候,需要安装对应的UI库,这里以element为示例
  4. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
  5. export default defineConfig({
  6. plugins: [
  7. Components({
  8. dirs: ['src/components'], // 目标文件夹
  9. extensions: ['vue','jsx'], // 文件类型
  10. dts: 'src/components.d.ts', // 输出文件,里面都是一些import的组件键值对
  11. // ui库解析器,也可以自定义,需要安装相关UI库
  12. resolvers: [
  13. ElementPlusResolver(),
  14. ],
  15. })
  16. ]
  17. })
五、清除console和debugger

安装 terser插件:

npm install  terser  -D

 build里添加terserOptions的配置

  1. // 打包环境移除console.log,debugger
  2. terserOptions: {
  3. compress: {
  4. drop_console: true,
  5. drop_debugger: true
  6. }
  7. },
六、 图片资源压缩

安装 vite-plugin-imagemin插件:

npm i vite-plugin-imagemin -D

 在vite.config.js里面配置

  1. // 引入
  2. import viteImagemin from 'vite-plugin-imagemin'
  3. // 在plugins配置数组里添加
  4. plugin: [
  5. viteImagemin({
  6. gifsicle: {
  7. optimizationLevel: 7,
  8. interlaced: false
  9. },
  10. optipng: {
  11. optimizationLevel: 7
  12. },
  13. mozjpeg: {
  14. quality: 20
  15. },
  16. pngquant: {
  17. quality: [0.8, 0.9],
  18. speed: 4
  19. },
  20. svgo: {
  21. plugins: [
  22. {
  23. name: 'removeViewBox'
  24. },
  25. {
  26. name: 'removeEmptyAttrs',
  27. active: false
  28. }
  29. ]
  30. }
  31. });
  32. ]
七、使用CDN加速 

内容分发网络(Content Delivery Network,简称 CDN)就是让用户从最近的服务器请求资源,提升网络请求的响应速度。通常我们请求依赖模块使用 CDN ,而请求项目代码依然使用自己的服务器。安装插件 vite-plugin-cdn-import

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

在vite.config.js里面配置

  1. import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';
  2. export default defineConfig({
  3. plugins: [
  4. importToCDN({
  5. // 需要 CDN 加速的模块
  6. modules: [
  7. // 支持自动导入
  8. autoComplete('axios'),
  9. {
  10. name: 'lodash',
  11. var: '_',
  12. path: `https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js`
  13. }
  14. ]
  15. })
  16. ]
  17. })
八、安装打包分析插件

安装rollup-plugin-visualizer插件

npm i rollup-plugin-visualizer

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

  1. // 引入
  2. import { visualizer } from 'rollup-plugin-visualizer';
  3. // 在plugins配置数组里添加
  4. plugins: [
  5. visualizer({
  6. open:true, // 注意这里要设置为true,否则无效,如果存在本地服务端口,将在打包后自动展示
  7. gzipSize:true,
  8. file: "stats.html", //分析图生成的文件名
  9. brotliSize:true
  10. }),
  11. ]

vite常用基本配置

  1. {
  2. root: process.cwd(), // 项目根目录(index.html 文件所在的位置),
  3. base: '/', // 开发或生产环境服务的公共基础路径 配置引入相对路径
  4. mode: 'development', // 模式
  5. plugins: [vue()], // 需要用到的插件数组
  6. publicDir: 'public', // 静态资源服务的文件夹
  7. cacheDir: 'node_modules/.vite', // 存储缓存文件的目录
  8. resolve: {
  9. alias: [ // 文件系统路径别名
  10. {
  11. find: //@//,
  12. replacement: pathResolve('src') + '/'
  13. }
  14. ],
  15. dedupe: [], // 强制 Vite 始终将列出的依赖项解析为同一副本
  16. conditions: [], // 解决程序包中 情景导出 时的其他允许条件
  17. mainFields: [], // 解析包入口点尝试的字段列表
  18. extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json'], // 导入时想要忽略的扩展名列表
  19. preserveSymlinks: false, // 启用此选项会使 Vite 通过原始文件路径确定文件身份
  20. },
  21. css: {
  22. modules: {
  23. scopeBehaviour: 'global' | 'local',
  24. // ...
  25. },
  26. postcss: '', // 内联的 PostCSS 配置 如果提供了该内联配置,Vite 将不会搜索其他 PostCSS 配置源
  27. preprocessorOptions: { // css的预处理器选项
  28. scss: {
  29. additionalData: `$injectedColor: orange;`
  30. }
  31. }
  32. },
  33. json: {
  34. namedExports: true, // 是否支持从.json文件中进行按名导入
  35. stringify: false, // 开启此项,导入的 JSON 会被转换为 export default JSON.parse("...") 会禁用按名导入
  36. },
  37. esbuild: { // 最常见的用例是自定义 JSX
  38. jsxFactory: 'h',
  39. jsxFragment: 'Fragment'
  40. },
  41. assetsInclude: ['**/*.gltf'], // 指定额外的 picomatch 模式 作为静态资源处理
  42. logLevel: 'info', // 调整控制台输出的级别 'info' | 'warn' | 'error' | 'silent'
  43. clearScreen: true, // 设为 false 可以避免 Vite 清屏而错过在终端中打印某些关键信息
  44. envDir: '/', // 用于加载 .env 文件的目录
  45. envPrefix: [], // 以 envPrefix 开头的环境变量会通过 import.meta.env 暴露在你的客户端源码中
  46. server: {
  47. host: '127.0.0.1', // 指定服务器应该监听哪个 IP 地址
  48. port: 5000, // 指定开发服务器端口
  49. strictPort: true, // 若端口已被占用则会直接退出
  50. https: false, // 启用 TLS + HTTP/2
  51. open: true, // 启动时自动在浏览器中打开应用程序
  52. proxy: { // 配置自定义代理规则
  53. '/api': {
  54. target: 'http://jsonplaceholder.typicode.com',
  55. changeOrigin: true,
  56. rewrite: (path) => path.replace(/^/api/, '')
  57. }
  58. },
  59. cors: true, // 配置 CORS
  60. force: true, // 强制使依赖预构建
  61. hmr: { // 禁用或配置 HMR 连接
  62. // ...
  63. },
  64. watch: { // 传递给 chokidar 的文件系统监听器选项
  65. // ...
  66. },
  67. middlewareMode: '', // 以中间件模式创建 Vite 服务器
  68. fs: {
  69. strict: true, // 限制为工作区 root 路径以外的文件的访问
  70. allow: [], // 限制哪些文件可以通过 /@fs/ 路径提供服务
  71. deny: ['.env', '.env.*', '*.{pem,crt}'], // 用于限制 Vite 开发服务器提供敏感文件的黑名单
  72. },
  73. origin: 'http://127.0.0.1:8080/', // 用于定义开发调试阶段生成资产的 origin
  74. },
  75. build: {
  76. target: ['modules'], // 设置最终构建的浏览器兼容目标
  77. polyfillModulePreload: true, // 是否自动注入 module preload 的 polyfill
  78. outDir: 'dist', // 指定输出路径
  79. assetsDir: 'assets', // 指定生成静态文件目录
  80. assetsInlineLimit: '4096', // 小于此阈值的导入或引用资源将内联为 base64 编码
  81. cssCodeSplit: true, // 启用 CSS 代码拆分
  82. cssTarget: '', // 允许用户为 CSS 的压缩设置一个不同的浏览器 target 与 build.target 一致
  83. sourcemap: false, // 构建后是否生成 source map 文件
  84. rollupOptions: {}, // 自定义底层的 Rollup 打包配置
  85. lib: {}, // 构建为库
  86. manifest: false, // 当设置为 true,构建后将会生成 manifest.json 文件
  87. ssrManifest: false, // 构建不生成 SSR 的 manifest 文件
  88. ssr: undefined, // 生成面向 SSR 的构建
  89. minify: 'esbuild', // 指定使用哪种混淆器
  90. terserOptions: {}, // 传递给 Terser 的更多 minify 选项
  91. write: true, // 启用将构建后的文件写入磁盘
  92. emptyOutDir: true, // 构建时清空该目录
  93. brotliSize: true, // 启用 brotli 压缩大小报告
  94. chunkSizeWarningLimit: 500, // chunk 大小警告的限制
  95. watch: null, // 设置为 {} 则会启用 rollup 的监听器
  96. },
  97. preview: {
  98. port: 5000, // 指定开发服务器端口
  99. strictPort: true, // 若端口已被占用则会直接退出
  100. https: false, // 启用 TLS + HTTP/2
  101. open: true, // 启动时自动在浏览器中打开应用程序
  102. proxy: { // 配置自定义代理规则
  103. '/api': {
  104. target: 'http://jsonplaceholder.typicode.com',
  105. changeOrigin: true,
  106. rewrite: (path) => path.replace(/^/api/, '')
  107. }
  108. },
  109. cors: true, // 配置 CORS
  110. },
  111. optimizeDeps: {
  112. entries: [], // 指定自定义条目——该值需要遵循 fast-glob 模式
  113. exclude: [], // 在预构建中强制排除的依赖项
  114. include: [], // 可强制预构建链接的包
  115. keepNames: false, // true 可以在函数和类上保留 name 属性
  116. },
  117. ssr: {
  118. external: [], // 列出的是要为 SSR 强制外部化的依赖,
  119. noExternal: '', // 列出的是防止被 SSR 外部化依赖项
  120. target: 'node', // SSR 服务器的构建目标
  121. }
  122. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/892153
推荐阅读
相关标签
  

闽ICP备14008679号