Перейти к содержимому

Серверные модули

Как хороший друг, SvelteKit хранит ваши секреты. Когда вы пишете бэкенд и фронтенд в одном репозитории, легко случайно импортировать конфиденциальные данные в код фронтенда (например, переменные окружения, содержащие API-ключи). SvelteKit предоставляет способ полностью предотвратить это: серверные модули.

Модули $env/static/private и $env/dynamic/private можно импортировать только в те модули, которые выполняются исключительно на сервере, такие как hooks.server.js или +page.server.js.

Модуль $app/server, содержащий функцию read для чтения ресурсов из файловой системы, точно так же может быть импортирован только кодом, выполняющимся на сервере.

Вы можете сделать свои собственные модули серверными двумя способами:

  • добавив .server к имени файла, например secrets.server.js
  • поместив их в $lib/server, например $lib/server/secrets.js

Каждый раз, когда ваш публичный код импортирует серверный код (напрямую или косвенно)…

$lib/server/secrets.js
export const atlantisCoordinates = [/* отредактировано */];
src/routes/utils.js
export { atlantisCoordinates } from '$lib/server/secrets.js';
export const add = (a, b) => a + b;
src/routes/+page.svelte
<script>
import { add } from './utils.js';
</script>

…SvelteKit выдаст ошибку:

Cannot import $lib/server/secrets.ts into code that runs in the browser, as this could leak sensitive information.
src/routes/+page.svelte imports
src/routes/utils.js imports
$lib/server/secrets.ts
If you're only using the import as a type, change it to `import type`.

Даже если публичный код — src/routes/+page.svelte — использует только экспорт add, а не секретный экспорт atlantisCoordinates, секретный код всё равно может попасть в JavaScript, который загружается браузером, и поэтому такая цепочка импортов считается небезопасной.

Эта функция также работает с динамическими импортами, даже с интерполированными, например await import(`./${foo}.js`).