Серверные модули
Как хороший друг, 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
Как это работает
Заголовок раздела «Как это работает»Каждый раз, когда ваш публичный код импортирует серверный код (напрямую или косвенно)…
export const atlantisCoordinates = [/* отредактировано */];export { atlantisCoordinates } from '$lib/server/secrets.js';
export const add = (a, b) => a + b;<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`).