可在顶层作用域用 top-level await 加载环境配置,需 es 模块(.mjs 或 "type": "module")、node.js 14.8+/chrome 89+等支持;应动态导入环境专属配置模块、做防腐处理、并用 try/catch 实现错误降级。

可以在顶层作用域直接用 top-level await 加载环境相关配置,前提是使用 ES 模块、文件后缀为 .mjs 或 package.json 中声明 "type": "module",且运行环境支持(Node.js 14.8+ / Chrome 89+ / Firefox 89+ / Safari 15+)。
确保模块上下文正确
顶层 await 只在 ES 模块中有效。普通 <script></script> 标签或 CommonJS(.cjs)中无法使用。必须满足以下任一条件:
- 文件扩展名为
.mjs - 项目根目录有
package.json,且含{"type": "module"} - HTML 中通过
<script type="module"></script>引入脚本
按环境动态导入配置模块
避免硬编码或暴露敏感字段,把不同环境的配置拆成独立模块(如 config-dev.mjs、config-prod.mjs),再根据环境变量或构建时标识选择加载:
- Node.js 中可读取
process.env.NODE_ENV,再用await import()动态导入对应模块 - 浏览器中建议通过构建工具注入环境标识(如
import.meta.env.MODE),或由入口 HTML 注入全局变量(如window.__ENV__ = 'prod') - 示例(Node.js 环境):
const env = process.env.NODE_ENV || 'dev';
const configModule = await import(`./config-${env}.mjs`);
export const API_BASE = configModule.API_BASE;
export const AUTH_TOKEN = configModule.AUTH_TOKEN;
敏感配置做防腐处理
“防腐”指防止配置意外泄露或被篡改。关键做法包括:
- 配置模块本身不导出明文密钥,而是导出经环境校验后才解密/拼接的值(例如:密钥片段分散在多个模块,或由构建时注入)
- 在配置加载后立即校验必要字段是否存在、格式是否合法,失败则抛错中断模块初始化
- 避免在浏览器端加载含敏感信息的配置——生产环境应由服务端注入或通过安全接口获取(带鉴权)
- 若必须前端加载,确保配置接口启用 CORS 白名单、HTTPS 强制、Referer 校验等防护措施
错误处理与降级策略
顶层 await 失败会导致整个模块加载失败,因此需主动捕获异常并提供兜底逻辑:
- 用
try/catch包裹 await 表达式,避免静默失败 - 对非关键配置(如埋点开关、UI 主题)可设默认值;对关键配置(如 API 地址、认证凭证)应拒绝继续执行
- 示例:
let config;
try {
const module = await import(`./config-${env}.mjs`);
if (!module.API_BASE || !module.AUTH_TOKEN) throw new Error('Missing required config');
config = module;
} catch (err) {
console.error('Failed to load config:', err);
throw new Error('App initialization aborted: invalid environment config');
}
export { config };











