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

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

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

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

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

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

  • Для отдельных модулей добавьте .server к имени файла, например secrets.server.js. Это работает для любого файла в директории проекта.
  • Директории с именем server в любом месте вашего проекта (кроме src/routes и директории с ресурсами) помечают весь содержащийся в них код как доступный только на сервере, например src/lib/server/config.js или src/lib/data/server/user/profile.js. (В SvelteKit 2 это применялось только к директории src/lib.)

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

#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`).