vite.config.js文件详解

vite.config.js 是 Vite 项目的核心配置文件,可自定义项目构建、开发服务器和插件等行为。以下是对该文件的详细解析和实战案例:

一、配置文件基础结构

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react' // 以 React 项目为例
import path from 'path'

export default defineConfig({
  // 项目根目录(index.html 文件所在的位置)
  root: process.cwd(),
  
  // 开发环境和生产环境的公共基础路径
  base: '/',
  
  // 开发服务器配置
  server: {
    port: 3000,
    open: true, // 自动打开浏览器
    proxy: {
      // 代理配置示例
      '/api': {
        target: 'http://localhost:8080',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  },
  
  // 构建配置
  build: {
    outDir: 'dist', // 输出目录
    assetsDir: 'assets', // 静态资源目录
    sourcemap: false, // 是否生成源映射
    minify: 'terser', // 压缩工具
    terserOptions: {
      compress: {
        drop_console: true, // 生产环境移除 console
        drop_debugger: true // 生产环境移除 debugger
      }
    }
  },
  
  // 插件配置
  plugins: [react()],
  
  // 解析配置
  resolve: {
    alias: {
      // 路径别名配置
      '@': '/src'
    }
  },
  
  // CSS 配置
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "./src/styles/variables.scss";` // 全局引入 SCSS 变量
      }
    }
  }
})

二、核心配置项详解

1. 开发服务器配置(server)
server: {
  port: 3000, // 开发服务器端口
  host: '0.0.0.0', // 监听所有地址,包括局域网和公网地址
  https: false, // 是否启用 HTTPS
  open: true, // 启动时自动打开浏览器
  cors: true, // 启用 CORS
  proxy: {
    // 配置代理解决跨域问题
    '/api': {
      target: 'http://backend-api.com',
      changeOrigin: true,
      rewrite: (path) => path.replace(/^\/api/, ''),
      timeout: 10000, // 请求超时时间
      configure: (proxy, options) => {
        // 自定义代理配置
        proxy.on('error', (err, req, res) => {
          console.log('Proxy error:', err)
        })
      }
    }
  }
}
2. 构建配置(build)
build: {
  target: 'esnext', // 目标浏览器版本
  outDir: 'dist', // 输出目录
  assetsDir: 'assets', // 静态资源目录
  assetsInlineLimit: 4096, // 小于此阈值的资源会被内联为 base64
  chunkSizeWarningLimit: 500, // 分块大小警告阈值(KB)
  rollupOptions: {
    // Rollup 打包选项
    output: {
      manualChunks(id) {
        // 自定义分块策略
        if (id.includes('node_modules')) {
          return id.toString().split('node_modules/')[1].split('/')[0].toString();
        }
      }
    }
  }
}
3. 路径别名配置(resolve.alias)
resolve: {
  alias: {
    '@': path.resolve(__dirname, './src'), // 将 @ 映射到 src 目录
    '@components': path.resolve(__dirname, './src/components'), // 组件目录别名
    'utils': path.resolve(__dirname, './src/utils') // 工具函数目录别名
  }
}
4. 环境变量配置(env)
envDir: './env', // 环境变量文件目录
envPrefix: 'VITE_', // 以 VITE_ 开头的变量会被加载到客户端
5. 插件配置(plugins)
plugins: [
  react(), // React 支持
  vue(), // Vue 支持
  svgLoader(), // SVG 加载器
  legacyPlugin({ // 传统浏览器支持
    targets: ['ie >= 11'],
    additionalLegacyPolyfills: ['regenerator-runtime/runtime']
  }),
  // 条件加载插件
  process.env.NODE_ENV === 'production' ? compressPlugin() : null
]

三、实战案例

1. 基于环境的条件配置
export default defineConfig(({ command, mode }) => {
  if (command === 'serve') {
    // 开发环境配置
    return {
      server: {
        proxy: {
          '/api': 'http://localhost:8080'
        }
      }
    }
  } else {
    // 生产环境配置
    return {
      build: {
        minify: 'terser',
        terserOptions: {
          compress: {
            drop_console: true
          }
        }
      }
    }
  }
})
2. 自定义 HTML 注入
import { defineConfig, loadEnv } from 'vite'

export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd(), '')
  
  return {
    plugins: [
      {
        name: 'html-transform',
        transformIndexHtml(html) {
          return html.replace(/%APP_TITLE%/g, env.APP_TITLE)
        }
      }
    ]
  }
})
3. 自定义 CSS 处理
css: {
  modules: {
    localsConvention: 'camelCaseOnly', // 类名转换为驼峰
    generateScopedName: '[name]__[local]___[hash:base64:5]' // 自定义生成类名
  },
  postcss: {
    plugins: [
      require('autoprefixer')({
        overrideBrowserslist: ['last 2 versions', '> 1%']
      })
    ]
  }
}

四、常见问题与解决方案

1. 处理静态资源路径问题
// 在 CSS 中使用相对路径
background-image: url('./assets/image.png');

// 或使用 import 导入
import imgUrl from './assets/image.png';
2. 优化生产环境构建
build: {
  brotliSize: false, // 不生成 brotli 压缩文件
  emptyOutDir: true, // 构建前清空输出目录
  sourcemap: process.env.NODE_ENV === 'development' // 仅开发环境生成源映射
}
3. 解决跨域请求问题
server: {
  proxy: {
    '/api': {
      target: 'http://api.example.com',
      changeOrigin: true,
      rewrite: (path) => path.replace(/^\/api/, ''),
      headers: {
        'X-Forwarded-For': '127.0.0.1'
      }
    }
  }
}

五、推荐插件

  1. Vue 支持@vitejs/plugin-vue
  2. React 支持@vitejs/plugin-react
  3. TypeScript 支持:内置支持,无需额外插件
  4. SVG 处理vite-plugin-svg-loader
  5. 压缩插件vite-plugin-compression
  6. PWA 支持vite-plugin-pwa
  7. 环境变量注入vite-plugin-env-compatible

通过合理配置 vite.config.js,可以显著提升开发体验和生产环境性能。建议根据项目需求选择性使用上述配置,并参考 Vite 官方文档 获取更多详细信息。

<think>我们正在讨论Vue3项目中两个关键文件的执行顺序:`main.js`(或`main.ts`)和`vite.config.js`。这两个文件在项目构建和运行过程中扮演不同的角色,因此它们的执行顺序和时机也不同。 ### 核心概念 1. **`vite.config.js`**: 这是Vite的配置文件,在**构建过程开始之前**由Vite读取并执行。它用于配置构建工具的行为,例如插件、别名、服务器设置等。 - 执行时机:**在启动开发服务器或进行生产构建之前**。 - 作用:影响整个构建过程(如转换代码、处理依赖等)。 2. **`main.js`/`main.ts`**: 这是Vue应用的入口文件,在**构建过程完成后**由浏览器(或Node.js)执行。它负责创建Vue应用实例并挂载到DOM。 - 执行时机:**在构建过程完成且浏览器加载页面时**。 - 作用:初始化Vue应用。 ### 执行顺序 1. **开发模式**(`vite dev`): - 第一步:Vite读取并执行`vite.config.js`(构建工具配置)。 - 第二步:Vite根据配置启动开发服务器,并开始构建项目(如转换Vue单文件组件、处理模块依赖等)。 - 第三步:浏览器请求页面时,Vite动态提供构建后的资源。 - 第四步:浏览器加载到入口文件(`index.html`)后,通过`<script type="module">`加载`main.js`。 - 第五步:浏览器执行`main.js`,创建Vue应用实例。 2. **生产构建**(`vite build`): - 第一步:Vite读取并执行`vite.config.js`(构建工具配置)。 - 第二步:Vite根据配置进行静态资源构建(打包、压缩等)。 - 第三步:构建完成后生成`dist`目录,其中包含`index.html`和构建后的`main.js`(可能被重命名并包含哈希)。 - 第四步:部署后,用户访问页面时,浏览器加载`index.html`并执行构建后的`main.js`。 ### 关键结论 - **`vite.config.js` 先于 `main.js` 执行**: 因为构建工具需要先配置好才能处理源代码(包括`main.js`)。 - **两者运行环境不同**: - `vite.config.js`在**Node.js环境**执行(构建时)。 - `main.js`在**浏览器环境**执行(运行时)。 ### 示例场景 假设在`vite.config.js`中配置了路径别名: ```javascript // vite.config.js import path from 'path' import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { '@': path.resolve(__dirname, 'src') } } }) ``` 在`main.js`中使用该别名: ```javascript // main.js import App from '@/App.vue' // 这里的 '@' 会被 Vite 解析为 'src' ``` 构建过程: 1. Vite读取`vite.config.js`,获知`@`指向`src`目录。 2. Vite处理`main.js`时,将`@/App.vue`解析为`src/App.vue`。 3. 浏览器执行构建后的`main.js`时,看到的已经是解析后的路径(如`/src/App.vue`已被打包为具体模块)。 ### 常见问题 #### 1. 为什么在 `main.js` 中无法使用 `import.meta.env`? `import.meta.env` 是 Vite 注入的环境变量,在构建过程中会被替换为实际值。因此它只能在**被 Vite 处理的代码**中使用(如`.vue`、`.js`、`.ts`文件),而在`vite.config.js`中无法直接使用(需通过`loadEnv`加载)[^2]。 #### 2. 修改 `vite.config.js` 后需要重启开发服务器吗? 是的,因为配置文件只在启动时读取一次。但部分配置(如`server.proxy`)支持热更新,无需重启[^3]。 --- ### 相关问题 1. 如何在 `vite.config.js` 中访问环境变量? 2. 为什么在 `main.js` 中引入的模块路径别名不生效? 3. 如何确保 `vite.config.js` 的修改立即生效? 4. `vite.config.js` 支持哪些配置项? 5. Vue3 项目中如何实现按需加载? [^1]: 引用[1]:vue3移动端适配(amfe-flexible + postcss-pxtorem)。 [^2]: 引用[2]:【vitevite配置文件 vite.config.js。 [^3]: 引用[3]:Vue3 之vite.config.js配置。</think>### Vue3 项目中 `main.js` 和 `vite.config.js` 的执行顺序详解 在 Vue3 + Vite 项目中,这两个文件的执行顺序和角色完全不同: #### 1. **`vite.config.js` 的执行(构建阶段)** - **执行时机**:**最先执行**,在项目启动或构建命令运行时立即加载 - **执行环境**:Node.js 环境(服务端) - **核心作用**: - 配置 Vite 构建工具的行为 - 设置插件、路径别名、CSS 预处理、代理等 - 控制资源输出格式(如图片/JS/CSS 的打包规则) - **执行特点**: ```javascript // vite.config.js console.log('这个日志会在终端显示,不会出现在浏览器控制台'); export default defineConfig({...}) // 配置在构建时生效 ``` - **相关引用**:Vite 在启动时读取此文件配置构建流程[^2][^3] #### 2. **`main.js` 的执行(运行时阶段) - **执行时机**:**最后执行**,在浏览器加载页面时运行 - **执行环境**:浏览器环境(客户端) - **核心作用**: - 初始化 Vue 应用实例 - 挂载根组件到 DOM - 注册全局组件/指令/插件 - **执行特点**: ```javascript // main.js console.log('这个日志出现在浏览器控制台'); createApp(App).mount('#app') // 在浏览器中渲染应用 ``` #### 完整执行流程 ```mermaid graph LR A[运行 npm run dev] --> B[加载 vite.config.js] B --> C[Vite 根据配置初始化构建环境] C --> D[编译项目文件 SFC/JS/TS] D --> E[生成浏览器可执行代码] E --> F[浏览器加载 index.html] F --> G[加载 main.js] G --> H[执行 Vue 应用初始化] ``` #### 关键区别总结 | 特性 | vite.config.js | main.js | |--------------|--------------------------------|-----------------------------| | **执行阶段** | 构建阶段(服务端) | 运行时阶段(客户端) | | **执行顺序** | 最先执行 | 最后执行 | | **访问权限** | 可访问 Node.js API | 只能访问浏览器 API | | **修改影响** | 修改后需重启服务 | 支持 HMR 热更新 | | **环境变量** | 通过 `loadEnv()` 读取 | 通过 `import.meta.env` 读取 | #### 常见问题解析 **Q:为什么在 `main.js` 中无法使用 `__dirname`?** A:因为 `__dirname` 是 Node.js 变量,而 `main.js` 在浏览器环境执行。 **Q:路径别名 `@` 在哪个文件配置?** A:在 `vite.config.js` 配置后,才能在 `main.js` 中使用: ```javascript // vite.config.js resolve: { alias: { '@': path.resolve(__dirname, 'src') } } // main.js import App from '@/App.vue' // 生效 ``` **Q:环境变量在哪里定义?** A:在 `.env` 文件中定义,通过不同方式访问: ```javascript // vite.config.js const env = loadEnv(mode, process.cwd()) // 服务端读取 // main.js console.log(import.meta.env.VITE_API_KEY) // 客户端读取 ``` --- ### 相关问题 1. 如何在 `vite.config.js` 中读取环境变量? 2. 为什么修改 `vite.config.js` 后需要重启开发服务器? 3. 如何在 Vue3 项目中配置多环境变量? 4. `main.js` 和 `App.vue` 的执行顺序是什么? 5. 如何解决 Vite 中 `main.js` 导入模块的路径问题? [^1]: vue3移动端适配(amfe-flexible + postcss-pxtorem) [^2]: 【vitevite配置文件 vite.config.js [^3]: Vue3 之vite.config.js配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

alden_ygq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值