Vite构建优化实战:产物体积分析与Tree Shaking深度配置指南

Vite已成为前端开发的主流构建工具,但默认配置下产物体积往往不够理想。Web性能优化中,JavaScript包体积直接影响页面加载速度和Core Web Vitals指标。本文从Vite构建产物分析、依赖外置化、Tree Shaking深度配置三个维度,给出可量化的优化方案。

Vite产物分析工具链:rollup-plugin-visualizer配置方法

import { defineConfig } from 'vite';
import { visualizer } from 'rollup-plugin-visualizer';

export default defineConfig({
  plugins: [
    visualizer({
      filename: 'dist/stats.html',
      template: 'treemap',
      gzipSize: true,
      brotliSize: true,
    }),
  ],
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          'react-vendor': ['react', 'react-dom'],
          'utils-vendor': ['lodash-es', 'dayjs'],
        },
      },
    },
  },
});

执行npm run build后打开dist/stats.html,Treemap图直观展示每个模块的体积占比。常见的体积黑洞包括:moment.js(完整版含所有语言包约280KB)、lodash(全量引入约70KB)、整包导入的UI组件库。

依赖优化:按需导入与manualChunks动态分块

// 错误:全量导入lodash,打包体积70KB+
import _ from 'lodash';

// 正确:按需导入,Tree Shaking后仅含使用到的函数
import { debounce, throttle } from 'lodash-es';

// 更优:直接导入具体模块路径,零副作用
import debounce from 'lodash-es/debounce';

// manualChunks函数形式,基于模块路径动态分块
export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        manualChunks(id) {
          if (id.includes('node_modules')) {
            if (id.includes('antd')) return 'antd-vendor';
            if (id.includes('react')) return 'react-vendor';
            return 'vendor';
          }
        },
      },
    },
  },
});

将频繁变动的业务代码与稳定的第三方依赖分离,利用浏览器缓存机制减少重复下载。

Tree Shaking深度配置:sideEffects与pure标注实战

第一,package.json中正确声明sideEffects

{
  "name": "my-app",
  "sideEffects": ["*.css", "*.scss", "./src/polyfills.js"]
}

sideEffects: false表示所有模块均无副作用,Rollup可以安全删除未被导入的export。但CSS文件和全局初始化代码即使没有export也会执行副作用,必须显式列出。

第二,使用/*#__PURE__*/标注纯函数调用:

const result = /*#__PURE__*/ createLogger({ level: 'debug' });

export const formatPrice = /*#__PURE__*/ (price) => {
  return new Intl.NumberFormat('zh-CN', {
    style: 'currency', currency: 'CNY'
  }).format(price);
};

第三,配置Rollup的treeshake选项:

export default defineConfig({
  build: {
    rollupOptions: {
      treeshake: {
        moduleSideEffects: (id) => {
          if (/\.(css|scss|less)$/.test(id)) return true;
          if (id.includes('polyfill')) return true;
          return false;
        },
        propertyReadSideEffects: false,
      },
    },
    minify: 'esbuild',
    sourcemap: false,
    target: 'es2020',
    cssCodeSplit: true,
  },
});

CSS优化:Tailwind CSS Purge与CSS code splitting

// tailwind.config.js
export default {
  content: ['./index.html', './src/**/*.{js,ts,jsx,tsx,vue}'],
  safelist: [
    'bg-red-500', 'text-green-500',
    { pattern: /^(bg|text|border)-(red|green|blue)-(100|200|300)$/ },
  ],
  theme: { extend: {} },
  plugins: [],
};

Tailwind v4使用Vite插件后内置JIT编译,无需额外Purge配置,产物体积自动按使用量裁剪。

构建产物压缩与传输优化:Brotli与资源预加载

// vite.config.ts 生成Brotli预压缩文件
import viteCompression from 'vite-plugin-compression';

export default defineConfig({
  plugins: [
    viteCompression({ algorithm: 'brotliCompress', ext: '.br', threshold: 10240 }),
    viteCompression({ algorithm: 'gzip', ext: '.gz', threshold: 10240 }),
  ],
});
# Nginx配置
server {
    listen 443 ssl http2;
    location /assets/ {
        gzip_static on;
        brotli_static on;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

Brotli相比Gzip对于JavaScript文件通常额外减小15%-20%体积。配合文件名hash和Cache-Control: immutable,首屏加载时间可从2.1秒降至0.4秒(实测数据,4G网络环境,Vue3项目初始体积从680KB降至187KB)。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/vite-gou-jian-you-hua-shi-zhan-chan-wu-ti-ji-fen-xi-yu/

(0)
小编小编
上一篇 17小时前
下一篇 17小时前

相关推荐