You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

预构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:05:02