前端开发多环境配置
在 Nx 构建的 Monorepo 中,管理“多环境”和“多版本”开发是其核心优势之一。针对你提到的“连接本地后端”与“连接远程后端”的切换需求,Nx 提供了 **`configurations`(配置变体)** 这一标准化的解决方案。
#type / howto
#status / evergreen
#tech / dev
[!info] related notes
前端开发多环境配置
1. 在 project.json 中定义环境变体
project.json 中的 targets 允许你定义一个 configurations 对象。你可以根据后端环境的不同,创建不同的配置块。
示例配置:
假设你的前端应用名为 web,使用 Vite 作为开发服务器。
"targets": {
"serve": {
"executor": "@nx/vite:dev-server",
"defaultConfiguration": "local",
"options": {
"buildTarget": "web:build"
},
"configurations": {
"local": {
"proxyConfig": "apps/web/proxy.local.conf.json"
},
"remote": {
"proxyConfig": "apps/web/proxy.remote.conf.json"
}
}
}
}
defaultConfiguration: 设置默认启动的环境(例如默认连本地)。proxyConfig: 这是处理“连哪个后端”最优雅的方式。通过切换代理配置文件,前端代码中的/api请求会被转发到不同的地址。
2. 配合代理配置 (Proxy Config)
为了实现无缝切换后端,你可以在应用目录下创建两个代理文件:
proxy.local.conf.json:
{
"/api": { "target": "http://localhost:3000", "secure": false }
}
proxy.remote.conf.json:
{
"/api": { "target": "https://api.staging.example.com", "secure": true, "changeOrigin": true }
}
优势: 前端代码中统一写
fetch('/api/users'),无需在代码里硬编码 URL 或频繁修改.env文件。
3. 使用环境变量 (.env) 的高级管理
如果你需要更细粒度的控制(如某些环境需要不同的 API Key),Nx 支持按需加载 .env 文件。
Nx 会按顺序自动加载以下文件:
.env(全局)apps/web/.env(项目专属)apps/web/.env.local或apps/web/.env.production(环境专属)
动态切换方案:
你可以利用 configurations 中的 fileReplacements(主要用于 Webpack/Angular)或简单的环境变量注入。
4. 如何在开发中快速运行
配置完成后,你可以非常方便地在终端或插件中切换:
A. 命令行操作
- 连接本地后端(默认):
npx nx serve web
- 连接远程后端:
npx nx serve web --configuration=remote
# 或者简写
npx nx serve web -c remote
B. 在 Nx Console 中操作
Nx Console 插件会自动识别这些配置。在 serve 指令旁边,你会看到一个下拉菜单或参数选择列表:
- 点击
serve。 - 在表单中找到
configuration选项。 - 点击下拉框,选择
remote或local。 - 插件会自动帮你拼装好带
-c参数的指令并运行。
5. 进阶:多版本并存开发
如果你在一个 Monorepo 中同时维护 v1 和 v2 版本的 API 或前端,你可以:
- 标签系统 (Tags): 在
project.json中使用tags: ["version:v1"]。 - 共享 Lib: 将
v1和v2共用的逻辑提取到libs/shared,而将版本差异化的逻辑放在各自的 Lib 中。 - CI/CD 隔离: 使用
nx affected确保当你修改v2的代码时,只有v2相关的测试和部署会被触发,而不影响v1。
总结
在 Nx 中管理环境的最佳路径是:
- **
project.json的configurations**负责定义开关。 proxy.conf.json负责后端地址转发。.env文件 负责环境特定的参数。- Nx Console 提供点击即运行的交互界面。
你想让我为你提供一个更具体的 Vite 或 Webpack 代理配置模版,来解决你目前遇到的跨域或连接问题吗?