UniApp多环境打包实战:我是如何用.env文件统一管理API地址和全局变量的
UniApp多环境配置实战用.env文件打造高效开发工作流想象一下这样的场景你的UniApp项目需要对接测试环境、预发布环境和生产环境每个环境的API地址、OSS存储桶配置都不相同。每次切换环境时你不得不手动修改代码中的配置项或者维护多个分支来管理不同环境的配置。这不仅效率低下还容易出错。本文将带你探索一种基于.env文件的优雅解决方案实现配置的集中管理和环境隔离。1. 为什么需要多环境配置管理在真实的企业级开发中项目通常需要经历多个阶段的部署和测试开发环境用于本地开发和调试测试环境供QA团队进行功能验证预发布环境模拟生产环境的最后验证生产环境面向真实用户的线上环境每个环境都有独立的服务地址、密钥和功能开关。传统做法是在代码中硬编码这些配置或者通过注释切换不同环境的配置。这种做法存在几个明显问题安全性风险生产环境密钥可能被意外提交到代码仓库维护成本高每次环境变更都需要修改代码并重新构建人为错误容易忘记切换配置或切换错误// 反面示例硬编码配置 const API_URL https://dev.example.com/api // 开发环境 // const API_URL https://prod.example.com/api // 生产环境2. 构建基于.env的多环境配置体系2.1 项目结构设计我们采用以下目录结构管理环境配置project-root/ ├── .env.development # 开发环境配置 ├── .env.test # 测试环境配置 ├── .env.staging # 预发布环境配置 ├── .env.production # 生产环境配置 ├── src/ │ └── config/ │ └── index.js # 配置集中管理文件 └── vite.config.js # Vite配置文件2.2 环境文件示例.env.development文件内容APP_API_URLhttps://dev.example.com/api APP_OSS_BUCKETdev-bucket APP_DEBUGtrue.env.production文件内容APP_API_URLhttps://api.example.com APP_OSS_BUCKETprod-bucket APP_DEBUGfalse注意所有敏感配置都应加入.gitignore避免提交到版本控制系统2.3 Vite配置调整修改vite.config.js实现环境变量加载import { loadEnv } from vite import uni from dcloudio/vite-plugin-uni export default ({ mode }) { // 处理HBuilderX直接运行时mode为undefined的情况 const envMode mode || (process.env.NODE_ENV production ? production : development) const env loadEnv(envMode, process.cwd(), APP_) return { define: { __APP_ENV__: JSON.stringify(env) }, plugins: [uni()] } }3. 实现配置的集中管理在src/config/index.js中创建配置中心const env __APP_ENV__ const config { api: { baseURL: env.APP_API_URL, timeout: 30000 }, oss: { bucket: env.APP_OSS_BUCKET, region: oss-cn-hangzhou }, features: { debug: env.APP_DEBUG true } } export default config4. 在项目中优雅使用配置4.1 在页面中使用import config from /config export default { onLoad() { console.log(当前API地址:, config.api.baseURL) this.fetchData() }, methods: { async fetchData() { const res await uni.request({ url: ${config.api.baseURL}/users, timeout: config.api.timeout }) // 处理响应数据 } } }4.2 在组件中使用import config from /config export default { computed: { uploadUrl() { return ${config.oss.endpoint}/${config.oss.bucket} } } }5. 高级技巧与最佳实践5.1 类型安全增强为配置对象添加TypeScript类型定义// src/types/config.d.ts interface AppConfig { api: { baseURL: string timeout: number } oss: { bucket: string region: string } features: { debug: boolean } } declare const config: AppConfig export default config5.2 环境验证脚本创建验证脚本确保必要配置存在// scripts/validate-env.js const requiredVars [APP_API_URL, APP_OSS_BUCKET] function validateEnv(env) { const missing requiredVars.filter(v !env[v]) if (missing.length) { console.error(缺少必要环境变量: ${missing.join(, )}) process.exit(1) } } validateEnv(process.env)5.3 多平台适配策略针对不同平台的特殊处理const platformConfig { h5: { api: { baseURL: env.APP_H5_API_URL || env.APP_API_URL } }, mp-weixin: { api: { baseURL: env.APP_MP_API_URL || env.APP_API_URL } } } const finalConfig { ...config, ...platformConfig[process.env.UNI_PLATFORM] }6. 构建与部署流程优化6.1 package.json脚本配置{ scripts: { dev:h5: uni -p h5 --mode development, build:test: uni build -p h5 --mode test, build:staging: uni build -p h5 --mode staging, build:prod: uni build -p h5 --mode production } }6.2 CI/CD集成示例GitLab CI配置示例stages: - build build_test: stage: build script: - npm install - npm run build:test artifacts: paths: - dist/ only: - test build_prod: stage: build script: - npm install - npm run build:prod artifacts: paths: - dist/ only: - master在实际项目中采用这套方案后环境切换变得非常简单可靠。记得第一次完整实施时原本需要半小时的部署准备时间缩短到了几分钟而且彻底消除了配置错误导致的问题。对于需要频繁在不同环境间切换的团队这种集中式配置管理方式能显著提升开发效率和系统可靠性。