Skip to content
On this page

仅服务端模块

SvelteKit像一位好朋友一样保守你的秘密。 当你在同一个目录既写前端代码又写后端代码的时候,很容易在前端代码里导入敏感数据(比如environment variables containing API keys)。 SvelteKit通过server-only modules的方式完全阻止这种事情发生。

Private environment variables

$env/static/private$env/dynamic/private 两个模块 (文档在modules) 只能被运行在服务端的模块导入,比如hooks.server.js或者+page.server.js

自己的仅服务端模块

你有两种方式把自己的模块变成server-only模块:

  • 文件名里添加 .server , 比如 secrets.server.js
  • 把这些模块放在 $lib/server目录下, 比如$lib/server/secrets.js

How it works

只要你在浏览器侧的模块里引入了server-only模块,都会发生下面的事:

js
// @errors: 7005
/// file: $lib/server/secrets.js
export const atlantisCoordinates = [/* redacted */];
js
// @errors: 2307 7006
/// file: src/routes/utils.js
export { atlantisCoordinates } from '$lib/server/secrets.js';

export const add = (a, b) => a + b;
html
/// file: src/routes/+page.svelte
<script>
	import { add } from './utils.js';
</script>

...SvelteKit 会发生错误:

Cannot import $lib/server/secrets.js into public-facing code:
- src/routes/+page.svelte
	- src/routes/utils.js
		- $lib/server/secrets.js

即使浏览器侧代码src/routes/+page.svelte只使用了add方法,没使用atlantisCoordinates方法。

这个功能对dynamic imports也同样生效。 甚至连这样导入await import(`./${foo}.js`),都会有一个小小的警告: during development, if there are two or more dynamic imports between the public-facing code and the server-only module, the illegal import will not be detected the first time the code is loaded.

Released under the MIT License.