SvelteKit公共环境变量Rollup构建错误求助
解决SvelteKit CI构建中PUBLIC环境变量未导出的RollupError问题
问题根源
在SvelteKit中,$env/dynamic/public导出的变量依赖于项目中定义的PUBLIC_前缀环境变量。CI环境中因为没有.env文件(也不应该提交),导致SvelteKit无法识别你导入的PUBLIC_SUPABASE_KEY,进而触发Rollup的导出不存在错误。同时npm run check生成类型的前提是能读取到.env里的变量,这在无.env的CI环境中不适用。
可行解决方案
方案1:手动声明环境变量类型
直接创建类型定义文件,不需要依赖.env自动生成类型,这是最直接的方式:
- 在项目的
src目录下创建env.d.ts文件 - 添加如下内容:
/// <reference types="@sveltejs/kit" /> declare namespace App { interface PublicEnv { PUBLIC_SUPABASE_KEY: string; // 若有其他PUBLIC_前缀的环境变量,一并在此声明 } }
这个文件会被TypeScript识别,告诉SvelteKit这些公共环境变量是存在的,构建时就不会报错。
方案2:使用.env.example配合CI变量注入
- 在项目根目录创建
.env.example文件,填入所有需要的PUBLIC_变量(值用占位符):
PUBLIC_SUPABASE_KEY=your-supabase-key-placeholder
将这个文件提交到代码仓库,作为变量的文档和类型生成依据。
2. 在CI环境中,构建前通过CI的密钥管理系统注入真实的环境变量:
- 以GitHub Actions为例,在工作流文件中添加:
jobs: build: steps: # ... 其他步骤:拉代码、安装依赖 - name: 注入环境变量 run: echo "PUBLIC_SUPABASE_KEY=${{ secrets.PUBLIC_SUPABASE_KEY }}" >> $GITHUB_ENV - name: 构建项目 run: pnpm run build
- 这样CI环境中会存在真实的环境变量,SvelteKit在构建时能识别到变量,同时也可以在CI中先执行
npm run check(此时环境变量已注入,能正确生成类型)再构建。
方案3:CI构建前直接设置环境变量
部分CI平台支持直接在项目设置中配置环境变量(比如GitHub Secrets、GitLab CI/CD变量等),只需要在CI平台的项目设置里添加PUBLIC_SUPABASE_KEY并填入真实值,SvelteKit在构建时会自动读取这些环境变量,无需额外的文件或脚本处理。
注意事项
- 所有
PUBLIC_前缀的环境变量都会暴露给前端代码,确保这些变量本身就是可以公开的(比如Supabase的公钥确实是安全的前端公开内容)。 - 不要将真实的
.env文件提交到代码仓库,避免敏感信息泄露。
内容的提问来源于stack exchange,提问作者Mike Hogan
相关产品推荐
相关产品推荐

