メインコンテンツへスキップ

サーバーサイド専用モジュール

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

動作方法

公開されているコードが(直接的または間接的に)サーバーサイド専用コードをインポートするたびに…

$lib/server/secrets
export const const atlantisCoordinates: never[]atlantisCoordinates = [/* redacted */];
src/routes/utils
export { export atlantisCoordinatesatlantisCoordinates } from '$lib/server/secrets.js';

export const const add: (a: any, b: any) => anyadd = (a, b) => a: anya + b: anyb;

src/routes/+page
<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'`によって決定されるように、テスト実行中は不正なインポート検出が無効になります。

参考資料

GitHubでこのページを編集する