预构建SvelteKit(adapter-node)应用如何读取服务器.env文件?
解决预构建SvelteKit应用读取服务器.env文件的问题
核心问题在于你用的$env/static/private和$env/static/public是构建时注入的变量,一旦本地构建完成,这些值就被硬编码到产物里了,运行时无法再从服务器的.env读取。要实现运行时读取服务器环境变量,得改用运行时变量的获取方式:
1. 服务端代码改用process.env读取私有变量
在服务端逻辑(比如+server.js、hooks.server.js等)里,直接用process.env.V_TEST1替代$env/static/private的导入。adapter-node运行时基于Node.js,启动时加载的.env变量会自动注入到process.env中,这样服务器上的.env值就能被读取到。
示例:
// 替换之前的 import { V_TEST1 } from '$env/static/private'; const privateVar = process.env.V_TEST1;
2. 客户端代码用运行时动态变量
客户端不能直接访问process.env,需要通过SvelteKit的运行时机制暴露公共变量:
- 首先在
src/hooks.server.js中,把服务器端的公共环境变量传递给客户端:
export async function handle({ event, resolve }) { // 从服务器.env读取公共变量 const publicEnv = { PUBLIC_V_TEST2: process.env.PUBLIC_V_TEST2 }; return resolve(event, { transformPageChunk: ({ html }) => html.replace('__PUBLIC_ENV__', JSON.stringify(publicEnv)) }); }
- 然后在
src/app.html的<head>中添加全局变量定义:
<script> window.publicEnv = __PUBLIC_ENV__; </script>
- 客户端组件中就可以通过
window.publicEnv.PUBLIC_V_TEST2获取变量,也可以封装一个工具函数方便使用:
// src/lib/utils/env.js export const getPublicEnv = (key) => window.publicEnv[key];
3. 确保启动时加载服务器的.env
启动构建后的应用时,要确保Node.js加载服务器上的.env文件:
- 如果你的Node版本≥20.6,直接用:
node --env-file=.env build
- 如果Node版本较低,需要先安装
dotenv包:
npm install dotenv --save
然后用以下命令启动:
node -r dotenv/config build
关键注意事项
- 私有变量绝对不能暴露给客户端,只处理
PUBLIC_前缀的公共变量。 - 本地开发时,同样可以用这套逻辑,确保本地
.env文件存在对应变量即可。 - 本地构建时无需注入服务器的.env变量,构建产物只保留变量读取逻辑,运行时才从服务器的.env取值。
内容的提问来源于stack exchange,提问作者Ben Quan
相关产品推荐
相关产品推荐

