サーバーサイド専用モジュール
SvelteKitは、良い友人同様、あなたの秘密を守ります。バックエンドとフロントエンドを同じリポジトリに記述する場合、機密データ(APIキーを含む環境変数など)を誤ってフロントエンドコードにインポートしてしまう可能性があります。SvelteKitはこれを完全に防ぐ方法を提供します。それがサーバーサイド専用モジュールです。
プライベート環境変数
$env/static/private
および$env/dynamic/private
モジュールは、hooks.server.js
や+page.server.js
など、サーバー上でのみ実行されるモジュールからのみインポートできます。
サーバーサイド専用ユーティリティ
ファイルシステムからアセットを読み取る`read`関数を備えた$app/server
モジュールも、同様にサーバー上で実行されるコードからのみインポートできます。
独自のモジュール
独自のモジュールをサーバーサイド専用にするには、2つの方法があります。
- ファイル名に` .server`を追加する(例:`secrets.server.js`)
- `$lib/server`に配置する(例:`$lib/server/secrets.js`)
動作方法
公開されているコードが(直接的または間接的に)サーバーサイド専用コードをインポートするたびに…
export const const atlantisCoordinates: never[]
atlantisCoordinates = [/* redacted */];
export { export atlantisCoordinates
atlantisCoordinates } from '$lib/server/secrets.js';
export const const add: (a: any, b: any) => any
add = (a, b) => a: any
a + b: any
b;
<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`エクスポートを使用していない場合でも、秘密のコードがブラウザがダウンロードするJavaScriptに含まれる可能性があるため、インポートチェーンは安全と見なされません。
この機能は動的インポート、`await import(./${foo}.js
)`のような補間されたものにも対応していますが、1つの小さな注意点があります。開発中は、公開されているコードとサーバーサイド専用モジュールの間に2つ以上の動的インポートがある場合、コードが最初に読み込まれたときに不正なインポートが検出されません。
Vitestなどの単体テストフレームワークは、サーバーサイド専用コードと公開されているコードを区別しません。このため、`process.env.TEST === 'true'`によって決定されるように、テスト実行中は不正なインポート検出が無効になります。