阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 环境变量与模式管理

环境变量与模式管理

作者:陈川 阅读数:13763人阅读 分类: 构建工具

项目配置与基础使用

Vite.js 的配置文件 vite.config.js 位于项目根目录,通过导出一个配置对象来定制构建行为。基本配置结构如下:

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  server: {
    port: 3000,
    open: true
  },
  build: {
    outDir: 'dist'
  }
})

配置项主要分为几大类:

  • plugins: 配置需要使用的插件
  • server: 开发服务器选项
  • build: 生产构建选项
  • resolve: 模块解析选项
  • css: CSS 相关配置

常用配置示例:

// 更完整的配置示例
export default defineConfig({
  base: '/my-app/', // 部署基础路径
  publicDir: 'public', // 静态资源目录
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  },
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/styles/variables.scss";`
      }
    }
  }
})

环境变量与模式管理

Vite 使用 dotenv 从项目根目录中的 .env 文件加载环境变量。环境变量文件命名规则:

  • .env: 所有情况下都会加载
  • .env.local: 本地覆盖,会被 git 忽略
  • .env.[mode]: 只在指定模式下加载
  • .env.[mode].local: 指定模式的本地覆盖

基本使用方式:

# .env.development
VITE_API_URL=https://dev.api.example.com
VITE_DEBUG=true
# .env.production
VITE_API_URL=https://api.example.com
VITE_DEBUG=false

在代码中访问环境变量:

console.log(import.meta.env.VITE_API_URL)

模式是 Vite 的一个重要概念,默认有三种模式:

  • development: 用于 vitevite dev
  • production: 用于 vite build
  • test: 用于 vite test

可以通过 --mode 选项指定自定义模式:

vite build --mode staging

对应需要创建 .env.staging 文件:

# .env.staging
VITE_API_URL=https://staging.api.example.com

高级环境变量配置

对于更复杂的环境变量需求,可以在 vite.config.js 中动态配置:

export default defineConfig(({ command, mode }) => {
  // 根据当前命令(command)和模式(mode)加载不同的环境变量
  const env = loadEnv(mode, process.cwd(), '')
  
  return {
    define: {
      __APP_VERSION__: JSON.stringify(env.VITE_APP_VERSION || '1.0.0')
    },
    // 其他配置...
  }
})

类型安全的环境变量可以通过在 src 目录下创建 env.d.ts 文件:

// src/env.d.ts
interface ImportMetaEnv {
  readonly VITE_API_URL: string
  readonly VITE_APP_TITLE: string
  // 更多环境变量...
}

interface ImportMeta {
  readonly env: ImportMetaEnv
}

多环境配置实践

大型项目通常需要管理多个环境配置。一个实用的组织方式:

├── config/
│   ├── env.development
│   ├── env.staging
│   ├── env.production
│   └── env.test
├── scripts/
│   └── build.js
└── vite.config.js

自定义构建脚本示例:

// scripts/build.js
const fs = require('fs')
const { execSync } = require('child_process')

const env = process.argv[2] || 'production'
const envFile = `./config/env.${env}`

if (!fs.existsSync(envFile)) {
  console.error(`环境配置文件不存在: ${envFile}`)
  process.exit(1)
}

// 复制环境文件到项目根目录
fs.copyFileSync(envFile, '.env')

console.log(`使用 ${env} 环境配置构建...`)
execSync('vite build', { stdio: 'inherit' })

使用方式:

node scripts/build.js staging

环境变量在 HTML 中的使用

Vite 支持在 index.html 中使用环境变量:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>%VITE_APP_TITLE%</title>
</head>
<body>
  <div id="app"></div>
  <script>
    console.log('当前环境:', '%MODE%')
  </script>
</body>
</html>

需要在配置中启用 HTML 变量替换:

export default defineConfig({
  // ...
  html: {
    inject: {
      injectData: {
        MODE: process.env.NODE_ENV,
        VITE_APP_TITLE: process.env.VITE_APP_TITLE
      }
    }
  }
})

跨项目环境变量共享

对于微前端架构或需要共享配置的场景,可以创建共享环境变量模块:

// shared-config/env.js
const sharedEnv = {
  VITE_COMMON_API: 'https://common.api.example.com',
  VITE_AUTH_DOMAIN: 'auth.example.com'
}

module.exports = {
  development: {
    ...sharedEnv,
    VITE_DEBUG: true
  },
  production: {
    ...sharedEnv,
    VITE_DEBUG: false
  }
}

在 Vite 配置中使用:

const sharedEnv = require('./shared-config/env.js')

export default defineConfig(({ mode }) => ({
  define: {
    'process.env': {
      ...sharedEnv[mode],
      ...process.env
    }
  }
}))

安全注意事项

环境变量处理需要注意的安全问题:

  1. 永远不要将敏感信息提交到版本控制
  2. .env.local*.local 文件应该加入 .gitignore
  3. 客户端可见的变量必须以 VITE_ 开头
  4. 服务端专用变量应使用其他前缀并通过后端注入
# 不安全的做法 - 这些变量会被包含在客户端代码中
API_KEY=123456
DB_PASSWORD=secret

# 安全的做法 - 只有 VITE_ 前缀的变量会暴露给客户端
VITE_PUBLIC_KEY=pub_123
VITE_API_URL=/api

测试环境特殊处理

测试环境通常需要特殊配置:

// vite.config.js
export default defineConfig(({ mode }) => {
  const isTest = mode === 'test'
  
  return {
    test: {
      environment: 'jsdom',
      globals: true,
      setupFiles: './tests/setup.js',
      // 测试专用的环境变量
      env: {
        VITE_TEST_MODE: 'true',
        VITE_MOCK_API: 'true'
      }
    },
    // 其他配置...
  }
})

测试文件中使用环境变量:

// tests/example.spec.js
import { describe, it, expect } from 'vitest'

describe('环境变量测试', () => {
  it('应该在测试模式下', () => {
    expect(import.meta.env.VITE_TEST_MODE).toBe('true')
  })
})

环境变量验证

可以使用 zod 等库对环境变量进行验证:

// src/utils/env.ts
import { z } from 'zod'

const envSchema = z.object({
  VITE_API_URL: z.string().url(),
  VITE_ENABLE_ANALYTICS: z.boolean().default(false),
  VITE_TIMEOUT: z.number().default(5000)
})

const env = envSchema.parse({
  VITE_API_URL: import.meta.env.VITE_API_URL,
  VITE_ENABLE_ANALYTICS: import.meta.env.VITE_ENABLE_ANALYTICS === 'true',
  VITE_TIMEOUT: Number(import.meta.env.VITE_TIMEOUT)
})

export default env

动态配置加载

对于需要根据环境动态加载配置的场景:

// src/config/index.js
const env = import.meta.env.MODE

const configs = {
  development: {
    apiBase: 'https://dev.api.example.com',
    analyticsId: 'UA-DEV-123'
  },
  production: {
    apiBase: 'https://api.example.com',
    analyticsId: 'UA-PROD-456'
  },
  test: {
    apiBase: 'http://localhost:3000/mock',
    analyticsId: null
  }
}

export default configs[env] || configs.development

构建产物中的环境信息

将环境信息注入到构建产物中:

export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        banner: `/*! 
         * App Version: ${process.env.npm_package_version} 
         * Build Date: ${new Date().toISOString()}
         * Environment: ${process.env.NODE_ENV}
         */`
      }
    }
  }
})

环境相关的资源处理

根据环境加载不同的资源:

// 动态加载环境相关的图片
function getEnvImage(name) {
  const env = import.meta.env.MODE
  return new URL(`../assets/${env}/${name}.png`, import.meta.url).href
}

// 使用
const logo = getEnvImage('logo')

环境特定的插件配置

某些插件可能需要根据环境进行不同配置:

import { visualizer } from 'rollup-plugin-visualizer'

export default defineConfig(({ mode }) => {
  const plugins = []
  
  if (mode === 'production') {
    plugins.push(
      visualizer({
        open: true,
        filename: 'bundle-analysis.html'
      })
    )
  }
  
  return {
    plugins
  }
})

环境变量与代理配置

开发环境常用的代理配置:

export default defineConfig({
  server: {
    proxy: {
      '/api': {
        target: import.meta.env.VITE_API_BASE || 'http://localhost:8080',
        changeOrigin: true,
        rewrite: path => path.replace(/^\/api/, '')
      }
    }
  }
})

环境相关的 CSS 处理

根据环境注入不同的 CSS 变量:

export default defineConfig({
  css: {
    postcss: {
      plugins: [
        require('postcss-preset-env')({
          stage: 3,
          features: {
            'nesting-rules': true
          },
          // 环境相关的 CSS 变量
          variables: {
            '--env-color': 
              import.meta.env.MODE === 'production' 
                ? '#1a1a1a' 
                : '#4a90e2'
          }
        })
      ]
    }
  }
})

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌