跳到主要内容

环境与应用配置

BBC 8.0 前端使用 Vite 环境文件和 packages/config 统一管理三端配置。API 地址、页面域名、部署子路径、静态资源前缀和功能开关都不应硬编码在页面中。

配置来源与优先级

配置按以下顺序读取,前者优先:

  1. Shell、CI 或 Jenkins 注入的当前进程环境变量。
  2. 当前 Vite 模式加载的 .env.*.local.env.*
  3. 根目录 config/*.ts 中的仓库默认值。

Vite 构建配置使用 { ...loadEnv(...), ...process.env } 合并变量,因此流水线进程变量会覆盖环境文件。排查构建结果时先确认 CI 实际注入了哪些变量,但不要在日志中回显敏感值。

配置读取入口位于 packages/config

配置默认值读取入口
API 地址config/api.tspackages/config/api.ts
页面域名config/domain.tspackages/config/domain.ts
部署子路径config/alias.tspackages/config/alias.ts
静态资源前缀config/assets.tspackages/config/assets.ts
功能开关config/features.tspackages/config/features.ts
应用名称与标题无独立根配置packages/config/apps.ts

环境文件与构建模式

仓库跟踪以下三个环境文件:

文件Vite 模式对应命令
.env.developmentdevelopmentpnpm dev:*pnpm build:dev:*
.env.testtestpnpm build:test:*
.env.productionproductionpnpm build:*

本机联调配置写入 .env.development.local,例如:

VITE_API_GATEWAY=http://localhost:8080
VITE_DOMAIN_PC=http://localhost:3000
VITE_DOMAIN_MOBILE=http://localhost:3001
VITE_DOMAIN_SELLER=http://localhost:3002
VITE_DOMAIN_ADMIN=http://localhost:3003

.local 文件只用于本机,不要提交。环境文件修改后必须重新启动开发服务或重新构建,Vite 不会在已生成的静态文件中动态读取新值。

API 地址

变量说明
VITE_API_GATEWAY统一网关;设置后会作为未单独配置 API 的回退地址。
VITE_API_BASE基础服务 API。
VITE_API_BUYER买家业务 API。
VITE_API_SELLER商家业务 API。
VITE_API_ADMIN平台管理业务 API。

可以只配置统一网关:

VITE_API_GATEWAY=https://api.example.com

也可以分别配置:

VITE_API_BASE=https://base-api.example.com
VITE_API_BUYER=https://buyer-api.example.com
VITE_API_SELLER=https://seller-api.example.com
VITE_API_ADMIN=https://admin-api.example.com

packages/config/api.ts 会清理尾部斜杠。当前构建快照没有启用完整性强制检查,缺失地址更可能在浏览器启动或实际读取配置时抛错,而不是自动让 Vite 构建失败。因此 CI 和发布流程必须在构建前显式校验目标环境的 API 配置,不能依赖页面运行时报错,也不要补临时域名。

页面域名

变量说明
VITE_DOMAIN_PC买家 PC 端访问域名。
VITE_DOMAIN_MOBILE买家移动端访问域名,用于跨端跳转。
VITE_DOMAIN_SELLER商家端访问域名。
VITE_DOMAIN_ADMIN平台管理端访问域名。

页面域名由 getDomain()getRuntimeDomain() 读取,主要用于跨端链接。它们与 Vite base 不是同一概念:域名决定跳到哪个站点,base 决定当前应用部署在站点的哪个子路径。

import { getRuntimeDomain } from "@shop-tnt/config";

const domains = getRuntimeDomain(import.meta.env.MODE);
const pcUrl = domains.pc;

部署子路径

变量说明
VITE_BASE_PC买家 PC 端的 Vite base。
VITE_BASE_SELLER商家端的 Vite base。
VITE_BASE_ADMIN平台管理端的 Vite base。

值会被归一化为不带首尾斜杠的名称。比如:

VITE_BASE_SELLER=seller

构建后的访问路径为 https://example.com/seller/。三端使用独立域名时通常留空。该配置同时影响 Vite 资源路径和 Vue Router history base,修改后必须验证深层 URL 刷新。

静态资源前缀

变量说明
VITE_ASSETS_PC买家 PC 静态资源 CDN 或前缀。
VITE_ASSETS_SELLER商家端静态资源 CDN 或前缀。
VITE_ASSETS_ADMIN平台管理端静态资源 CDN 或前缀。

不使用 CDN 时留空。使用 CDN 时填写完整公开前缀:

VITE_ASSETS_PC=https://cdn.example.com/shop-tnt/pc/
VITE_ASSETS_SELLER=https://cdn.example.com/shop-tnt/seller/
VITE_ASSETS_ADMIN=https://cdn.example.com/shop-tnt/admin/

packages/config/build/vite.ts 会在构建期改写静态资源 URL。发布后应检查入口 HTML、JavaScript、CSS、字体和图片是否都能从该前缀返回 200

功能开关

变量功能
VITE_DISTRIBUTION分销相关页面与路由。
VITE_I18N国际化入口及字典相关页面。
VITE_IM客服与站内 IM。
VITE_LIVEVIDEO直播相关页面与路由。

环境变量支持以下布尔值:

  • 开启:1trueyesyon
  • 关闭:0falsenonoff

无法识别的值会回退到 config/features.ts。当前路由消费范围如下:

应用参与路由或入口控制的开关
Admin分销、直播、IM、国际化
Seller直播、IM
PC分销、IM

其它页面仍可能在业务内部读取功能开关。隐藏菜单不等于授权校验,不能只处理视觉入口。

在代码中读取配置

业务代码优先从 @shop-tnt/config 的公开入口导入,不要直接读取根配置文件:

import { getApi, getFeatureFlags, getRuntimeDomain } from "@shop-tnt/config";

const api = getApi(import.meta.env.MODE);
const domains = getRuntimeDomain(import.meta.env.MODE);
const features = getFeatureFlags();

只有 Vite 和配置包内部需要直接处理 import.meta.env。页面不应自行实现环境优先级、尾斜杠清理或布尔值解析。

安全要求

所有 VITE_* 变量都会进入浏览器产物,任何访问者都能读取。禁止写入:

  • 数据库密码、私钥和对象存储密钥。
  • 服务端 token、管理员 token 或长期令牌。
  • 只允许后端持有的第三方应用密钥。
  • 个人信息或其他敏感业务数据。

需要保密的配置必须由后端持有,并通过受控接口提供必要结果。

修改后的验证

本机开发配置只影响单端时,构建对应应用:

pnpm build:dev:pc
pnpm build:dev:seller
pnpm build:dev:admin

修改 packages/config、根 config 或多个应用的环境配置时,构建三端:

pnpm build:dev

验收时至少确认:

  1. 四类 API 地址都能正确解析,缺失配置不会被页面静默兜底。
  2. 登录、刷新 token 和公开接口分别请求到正确服务。
  3. 跨端链接使用配置域名,而不是当前页面硬编码。
  4. 子路径部署下首页、深层路由和静态资源都可刷新访问。
  5. 功能关闭后,菜单、路由直达和业务入口都被正确限制。