Skip to main content
Svelte 基础
介绍
响应式
属性
逻辑
事件
绑定
类和样式
Actions
过渡动画
Svelte 进阶
高级响应性
复用内容
Motion
高级绑定
高级过渡效果
Context API
特殊元素
<script module>
后续步骤
SvelteKit 基础
介绍
路由
加载数据
请求头和 Cookie
共享模块
表单
API 路由
$app/state
错误和重定向
SvelteKit 进阶
钩子函数
页面选项
链接选项
高级路由
高级加载
环境变量
结论

环境变量 — 如 API 密钥和数据库凭证 — 可以添加到 .env 文件中,它们将对你的应用程序可用。

你也可以使用 .env.local.env.[mode] 文件 — 查看 Vite 文档 获取更多信息。确保将包含敏感信息的任何文件添加到你的 .gitignore 文件中!

process.env 中的环境变量也可以通过 $env/static/private 获得。

在这个练习中,我们想要通过使用环境变量,让用户在知道正确密码短语的情况下进入网站。

首先,在 .env 中,添加一个新的环境变量:

PASSPHRASE="open sesame"

打开 src/routes/+page.server.js。从 $env/static/private 导入 PASSPHRASE 并在 表单 action 中使用它:

src/routes/+page.server
import { redirect, fail } from '@sveltejs/kit';
import { PASSPHRASE } from '$env/static/private';

export function load({ cookies }) {
	if (cookies.get('allowed')) {
		redirect(307, '/welcome');
	}
}

export const actions = {
	default: async ({ request, cookies }) => {
		const data = await request.formData();

		if (data.get('passphrase') === PASSPHRASE) {
			cookies.set('allowed', 'true', {
				path: '/'
			});

			redirect(303, '/welcome');
		}

		return fail(403, {
			incorrect: true
		});
	}
};

现在,知道正确口令的任何人都可以访问网站。

保守秘密

确保敏感数据不会意外地发送到浏览器很重要,因为在浏览器中这些数据很容易被黑客和恶意用户窃取。

SvelteKit 使防止这种情况发生变得容易。注意当我们尝试在 src/routes/+page.svelte 中导入 PASSPHRASE 时会发生什么:

src/routes/+page
<script>
	import { PASSPHRASE } from '$env/static/private';
	let { form } = $props();
</script>
<script lang="ts">
	import { PASSPHRASE } from '$env/static/private';
	let { form } = $props();
</script>

会弹出一个错误提示,告诉我们 $env/static/private 不能导入到客户端代码中。它只能导入到服务端模块中:

  • +page.server.js
  • +layout.server.js
  • +server.js
  • 任何以 .server.js 结尾的模块
  • src/lib/server 中的任何模块

反过来,这些模块只能被其他服务端模块导入。

静态 vs 动态

$env/static/private 中的 static 表示这些值在构建时就是已知的,可以被静态替换。这使得以下优化成为可能:

import { FEATURE_FLAG_X } from '$env/static/private';

if (FEATURE_FLAG_X === 'enabled') {
	// 如果 FEATURE_FLAG_X 未启用
	// 这里的代码将从构建输出中移除
}

在某些情况下,你可能需要引用动态的环境变量 — 换句话说,直到我们运行应用程序时才知道的变量。我们将在下一个练习中讨论这种情况。

在 GitHub 编辑此页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<script>
	let { form } = $props();
</script>
 
<form method="POST">
	<label>
		enter the passphrase
		<input name="passphrase" autocomplete="off" />
	</label>
</form>
 
{#if form?.incorrect}
	<p class="error">wrong passphrase!</p>
{/if}
 
<style>
	.error {
		color: red;
	}
</style>