在TypeScript中如何通过.env配置的路径动态导入JSON文件
前置说明
ES 标准的静态 import 语句不支持传入动态变量作为导入路径,因为静态导入是在代码编译阶段执行的,执行时机早于 .env 文件的加载阶段,因此无法直接用静态导入实现你的需求,我们可以通过文件读取+JSON解析或者动态导入的方式实现。
第一步:修正 .env 配置格式
标准的 .env 文件为键=值格式,而非JSON格式,请修改你的.env文件内容如下:
KEY_FILE_PATH=home/path/account.json
第二步:安装依赖(Node.js环境)
需要先安装dotenv库用于读取.env配置:
npm install dotenv
第三步:代码修改
方案1:同步读取(和原有代码逻辑完全兼容,无需修改方法异步性,推荐)
直接通过文件读取API加载JSON文件,解析后使用:
// 顶部优先加载dotenv,注入环境变量 import dotenv from 'dotenv' import fs from 'fs' import path from 'path' dotenv.config() // 拼接成绝对路径,避免相对路径执行上下文错误 const keyFilePath = path.resolve(process.cwd(), process.env.KEY_FILE_PATH) // 读取并解析JSON文件 const keys = JSON.parse(fs.readFileSync(keyFilePath, 'utf-8')) class SecurityServices { getToken(){ return keys.certs } }
方案2:ES模块动态导入
如果你希望用导入的方式加载JSON,可以采用ES动态导入API,因为是异步逻辑,需要对应改造方法:
import dotenv from 'dotenv' import path from 'path' dotenv.config() const keyFilePath = path.resolve(process.cwd(), process.env.KEY_FILE_PATH) // 缓存导入结果避免重复加载 let cachedKeys = null async function loadKeys() { if (cachedKeys) return cachedKeys const module = await import(keyFilePath, { assert: { type: 'json' } }) cachedKeys = module.default return cachedKeys } class SecurityServices { async getToken(){ const keys = await loadKeys() return keys.certs } }
注意事项
- 如果是前端工程(如Vite、Webpack搭建的项目),无需安装
dotenv,框架会自动读取.env文件,其中Vite要求自定义环境变量必须加VITE_前缀,通过import.meta.env.VITE_KEY_FILE_PATH读取即可。 - 请确保配置的文件路径有读取权限,生产环境建议将敏感JSON文件放到项目外的安全目录,避免被打包到发布产物中。
内容的提问来源于stack exchange,提问作者user2570135
相关产品推荐
相关产品推荐

