【多环境配置 & Vue/Vite工程化】前端团队协作场景:从环境定义到落地配置,彻底搞懂dev/test/pre/prod区分规范,避开线上环境踩坑!

在这里插入图片描述

📑 文章目录

同学们好,我是 Eugene(尤金),一名多年中后台前端开发工程师。

(Eugene 发音 /juːˈdʒiːn/,大家怎么顺口怎么叫就好)

很多前端开发者都会遇到一个瓶颈:

代码能跑,但不够规范;功能能实现,但维护起来特别痛苦;一个人写没问题,一到团队协作就各种混乱、踩坑、返工。

想写出干净、优雅、可维护的专业代码,靠的不是天赋,而是体系化的规范 + 真实实战经验

这一系列《前端规范实战》,我会用大白话 + 真实业务场景,不讲玄学、不堆理论,只分享能直接落地的规范、标准与避坑指南。

帮你从「会写代码」真正升级为「会写优质、可维护、团队级别的代码」。


工作几年后,不少人依然对「开发环境」「测试环境」「预发环境」「生产环境」的概念和用法模糊,甚至混用。配置不当往往导致:接口打到生产、日志泄露敏感信息、调试代码上线等问题。

一、四个环境到底在干什么?

先把几个概念说清楚。

1.1 dev(开发环境)

  • 作用:本地开发、联调、自测
  • 使用者:前端/后端开发者
  • 特点
    • 本地或内网服务器
    • 有热更新、Source Map
    • 可随意打 console.log
    • 接口指向开发/测试后端

⬆ 返回目录

1.2 test(测试环境)

  • 作用:QA 测试、联调、验收
  • 使用者:测试、产品、开发
  • 特点
    • 有独立域名(如 test.xxx.com
    • 接口指向测试后端
    • 数据以测试数据为主

⬆ 返回目录

1.3 pre(预发 / 预生产环境)

  • 作用:上线前最后一次验证,尽量贴近生产
  • 使用者:测试、产品、少数开发
  • 特点
    • 和生产环境配置、后端、数据源尽量一致
    • 用生产配置验证逻辑
    • 一般没有真实用户流量

⬆ 返回目录

1.4 prod(生产环境)

  • 作用:真实线上环境,对外提供服务
  • 使用者:真实用户
  • 特点
    • 关闭调试、Source Map 等
    • 接口必须是生产 API
    • 避免输出敏感信息
    • 注重稳定与安全

⬆ 返回目录

二、为什么必须区分环境?

问题类型 不区分时的问题 区分后的做法
接口地址 打包后默认打生产,容易写死错环境 NODE_ENV 等变量自动切换
调试代码 console.log、调试信息被带上线 生产环境自动去掉或降级
Source Map 上线泄露源码 生产不生成或只内网使用
敏感配置 API 密钥、内部域名泄露 敏感信息只存在于对应环境变量

⬆ 返回目录

三、Vue 项目中如何配置多环境?

以 Vue CLI / Vite 两种常见方案说明。

3.1 方案一:Vue CLI(create-vue / @vue/cli)

约定用 .env.[mode] 区分环境,例如:

.env                 # 所有环境共用
.env.development     # 开发环境
.env.test            # 测试环境
.env.pre             # 预发环境
.env.production      # 生产环境

命名规则

  • development 对应 npm run dev
  • production 对应 npm run build
  • testpre 需要单独指定 mode
示例目录结构
project/
├── .env.development
├── .env.test
├── .env.pre
├── .env.production
├── vue.config.js
└── src/
.env.development
# 开发环境
NODE_ENV=development
VUE_APP_BASE_API=http://dev-api.example.com
VUE_APP_ENV=dev
VUE_APP_ENABLE_MOCK=true
.env.test
# 测试环境
NODE_ENV=production
VUE_APP_BASE_API=https://test-api.example.com
VUE_APP_ENV=test
VUE_APP_ENABLE_MOCK=false
.env.pre
# 预发环境(尽量接近生产)
NODE_ENV=production
VUE_APP_BASE_API=https://pre-api.example.com
VUE_APP_ENV=pre
VUE_APP_ENABLE_MOCK=false
.env.production
# 生产环境
NODE_ENV=production
VUE_APP_BASE_API=https://api.example.com
VUE_APP_ENV=prod
VUE_APP_ENABLE_MOCK=false

说明:

  • Vue CLI 中,只有以 VUE_APP_ 开头的变量会暴露给前端代码
  • NODE_ENVdevelopment 时启用热更新等开发特性
  • testpre 一般也用 NODE_ENV=production 做生产构建
package.json 脚本
{
  "scripts": {
    "dev": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build:test": "vue-cli-service build --mode test",
    "build:pre": "vue-cli-service build --mode pre",
    "build:prod": "vue-cli-service build --mode production"
  }
}
在代码中使用
// src/api/request.js
const baseURL = process.env.VUE_APP_BASE_API
const isDev = process.env.VUE_APP_ENV === 'dev'

// 开发环境可以打印,生产不打印
if (isDev) {
  console.log('当前环境:', process.env.VUE_APP_ENV)
}

⬆ 返回目录

3.2 方案二:Vite 项目

Vite 用 import.meta.env.MODE.env.[mode] 管理环境。

示例目录结构
project/
├── .env
├── .env.development
├── .env.test
├── .env.pre
├── .env.production
├── vite.config.js
└── src/
.env.development
NODE_ENV=development
VITE_BASE_API=http://dev-api.example.com
VITE_APP_ENV=dev
VITE_ENABLE_MOCK=true
.env.production
NODE_ENV=production
VITE_BASE_API=https://api.example.com
VITE_APP_ENV=prod
VITE_ENABLE_MOCK=false

说明:

  • Vite 只暴露以 VITE_ 开头的变量
  • 不要用 VUE_APP_,在 Vite 中无效
vite.config.js 配置 mode
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig(({ mode }) => ({
  plugins: [vue()],
  // 根据 mode 决定是否生成 sourcemap
  build: {
    sourcemap: mode === 'development',
    minify: mode === 'production',
  },
}))
package.json 脚本
{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "build:test": "vite build --mode test",
    "build:pre": "vite build --mode pre",
    "build:prod": "vite build --mode production"
  }
}
在代码中使用
// src/api/request.js
const baseURL = import.meta.env.VITE_BASE_API
const isDev = import.meta.env.VITE_APP_ENV === 'dev'

⬆ 返回目录

四、统一封装:请求与接口切换

下面是一个统一的请求封装示例,展示如何根据环境切换接口和日志行为。

// src/utils/request.js

// 根据框架选择
const baseURL = process.env.VUE_APP_BASE_API || import.meta.env.VITE_BASE_API
const env = process.env.VUE_APP_ENV || import.meta.env.VITE_APP_ENV

const isProd = ['prod', 'pre'].includes(env)

// 创建 axios 实例
const request = axios.create({
  baseURL,
  timeout: 15000,
})

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 生产/预发环境不打印完整请求信息
    if (!isProd) {
      console.log(`[${env}] 请求:`, config.url, config.params || config.data)
    }
    return config
  },
  (err) => Promise.reject(err)
)

// 响应拦截器
request.interceptors.response.use(
  (res) => {
    if (!isProd && res.config?.url) {
      console.log(`[${env}] 响应:`, res.config.url, res.data)
    }
    return res.data
  },
  (err) => {
    // 生产环境不把详细错误堆栈暴露给用户
    if (isProd) {
      console.error('请求失败') // 可接入监控
    } else {
      console.error('请求失败:', err.message, err.response)
    }
    return Promise.reject(err)
  }
)

export default request

要点:

  1. 使用环境变量统一管理 baseURL
  2. 生产/预发不打印详细请求、响应和堆栈
  3. 可在 isProd 分支接入埋点、监控

⬆ 返回目录

五、常见踩坑与规范

5.1 接口地址写死

错误示例:

// 千万别这样!
axios.get('https://api.example.com/user/list')

正确做法:

const baseURL = process.env.VUE_APP_BASE_API
axios.get(`${baseURL}/user/list`)

⬆ 返回目录

5.2 环境变量未生效

  • Vue CLI:必须使用 VUE_APP_ 前缀
  • Vite:必须使用 VITE_ 前缀
  • 修改 .env 后需重启 dev 或重新 build

⬆ 返回目录

5.3 生产环境开启 Source Map

生产包若带完整 Source Map,源码易被还原,存在泄露风险。

// vite.config.js
export default defineConfig(({ mode }) => ({
  build: {
    sourcemap: mode !== 'production',  // 仅非生产生成
    // 或生产环境用 hidden,只给监控用
    // sourcemap: mode === 'production' ? 'hidden' : true,
  },
}))

⬆ 返回目录

5.4 在代码中硬编码环境判断

不推荐:

if (window.location.hostname === 'test.xxx.com') {
  baseURL = 'https://test-api.xxx.com'
}

推荐:

统一用 .env + VUE_APP_* / VITE_*,构建时注入,避免运行时依赖域名。

⬆ 返回目录

5.5 敏感信息进仓库

  • .env.env.local 等若含密钥,应加入 .gitignore
  • 生产环境密钥建议用 CI/CD 注入,而不是提交到仓库

⬆ 返回目录

5.6 预发和生产配置不一致

预发环境的价值在于「和生产一致」。若预发和生产使用不同 API 或配置,容易漏掉线上问题,建议:

  • 预发和生产使用相同接口规范、鉴权方式
  • 仅域名、部分开关等可配置差异

⬆ 返回目录

六、环境区分速查表

环境 典型命令 用途 接口示例
dev npm run dev 本地开发 http://dev-api.xxx
test npm run build:test 测试验收 https://test-api.xxx
pre npm run build:pre 上线前验证 https://pre-api.xxx
prod npm run build:prod 正式上线 https://api.xxx

⬆ 返回目录

七、小结

  1. dev:本地开发,自由调试
  2. test:测试与联调
  3. pre:贴近生产的最终验证
  4. prod:正式对外环境

实践上:

  • .env.[mode] + 环境变量统一管理接口和开关
  • 不在代码中写死 API、密钥、环境判断
  • 生产环境关闭 Source Map、控制日志输出
  • 敏感配置不进仓库,通过 CI/CD 注入

按以上规范配置,能明显减少「打到错误环境」「调试代码上线」「配置泄露」等问题,把环境区分清楚,是工程化与协作的基础一步。

⬆ 返回目录


🔍 系列模块导航

📝 工程化与协作规范

一、《Vite 工程化实战:alias/env/proxy/ 打包配置全解析,统一项目规范避坑|工程化与协作规范篇》
二、《前端多环境配置规范:dev/test/pre/prod 环境差异与配置,避免生产环境踩坑|工程化与协作规范篇》
三、《前端 Git 协作规范实战:commit message + 分支管理 + 合并流程,告别冲突与混乱|工程化与协作规范篇》
四、《ESLint + Prettier 实战:统一前端代码风格,自动修复语法格式问题|工程化与协作规范篇》
五、《Element Plus/VXE-Table UI 组件库规范:统一用法实战,避开样式冲突与维护混乱|工程化与协作规范篇》

👉 跟着系列慢慢学,把技术功底扎扎实实地打牢~

📚 系列总览

前端体系化学习完全体:基础 → 规范 → 架构 → 大厂面试
四套系列、百余篇高质量实战文,从入门到进阶,一站式补齐前端核心能力

每个系列完结后,都会整理成一篇完整导航文并附上直达链接,方便大家按顺序、体系化学习。

全套内容持续更新中,敬请期待~

⬆ 返回目录


技术成长,从来不是比谁写得快,而是比谁写得稳、规范、可维护

哪怕每次只吃透一条规范,长期下来,差距会非常明显。

后续我会持续更新前端规范、工程化、可维护代码相关实战干货,帮你告别面条代码、维护噩梦,在开发与面试中更有底气。

觉得有用欢迎 点赞 + 收藏 + 关注,不错过每一篇实战内容。

我是 Eugene,与你一起写规范、写优质代码,我们下篇干货见~

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐