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

ノードサーバー

スタンドアロンのNodeサーバーを生成するには、adapter-nodeを使用してください。

使用方法

npm i -D @sveltejs/adapter-node でインストールし、svelte.config.js にアダプターを追加します。

svelte.config
import import adapteradapter from '@sveltejs/adapter-node';

export default {
	
kit: {
    adapter: any;
}
kit
: {
adapter: anyadapter: import adapteradapter() } };

デプロイ

まず、npm run build でアプリをビルドします。これにより、アダプターオプションで指定された出力ディレクトリ(デフォルトは build)に本番サーバーが作成されます。

アプリケーションを実行するには、出力ディレクトリ、プロジェクトの package.json、および node_modules 内の本番依存関係が必要です。本番依存関係は、package.jsonpackage-lock.json をコピーし、npm ci --omit dev を実行することで生成できます(アプリに依存関係がない場合は、この手順をスキップできます)。その後、次のコマンドでアプリを起動できます。

node build

開発依存関係は、Rollup を使用してアプリにバンドルされます。特定のパッケージをバンドルするか外部化するかを制御するには、package.jsondevDependencies または dependencies にそれぞれ配置します。

レスポンスの圧縮

通常、サーバーからのレスポンスを圧縮する必要があります。SSLまたはロードバランシングのためにリバースプロキシの背後にサーバーをすでにデプロイしている場合は、Node.jsがシングルスレッドであるため、そのレイヤーで圧縮も処理する方が通常はパフォーマンスが向上します。

ただし、カスタムサーバーを構築していて、そこに圧縮ミドルウェアを追加する場合は、SvelteKitはレスポンスをストリーミングするため、@polka/compressionを使用することをお勧めします。より一般的な compression パッケージはストリーミングをサポートしておらず、使用するとエラーが発生する可能性があります。

環境変数

dev および preview では、SvelteKit は .env ファイル(または .env.local、または .env.[mode]Viteによって決定されます)から環境変数を読み取ります。

本番環境では、.env ファイルは自動的にロードされ*ません*。ロードするには、プロジェクトに dotenv をインストールします...

npm install dotenv

...そして、ビルドされたアプリを実行する前に呼び出します。

node -r dotenv/config build

Node.js v20.6以降を使用している場合は、代わりに--env-fileフラグを使用できます。

node --env-file=.env build

PORT、HOST、SOCKET_PATH

デフォルトでは、サーバーはポート3000を使用して 0.0.0.0 で接続を受け入れます。これらは、PORT および HOST 環境変数でカスタマイズできます。

HOST=127.0.0.1 PORT=4000 node build

あるいは、サーバーは指定されたソケットパスで接続を受け入れるように設定できます。これが SOCKET_PATH 環境変数を使用して行われると、HOST および PORT 環境変数は無視されます。

SOCKET_PATH=/tmp/socket node build

ORIGIN、PROTOCOL_HEADER、HOST_HEADER、PORT_HEADER

HTTPは、現在リクエストされているURLを知るための信頼できる方法をSvelteKitに提供していません。アプリがどこで提供されているかをSvelteKitに伝える最も簡単な方法は、ORIGIN 環境変数を設定することです。

ORIGIN=https://my.site node build

# or e.g. for local previewing and testing
ORIGIN=http://localhost:3000 node build

これにより、/stuff パス名へのリクエストは https://my.site/stuff に正しく解決されます。または、リクエストプロトコルとホストについてSvelteKitに伝えるヘッダーを指定することもできます。SvelteKitはそこからオリジンURLを構築できます。

PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host node build

x-forwarded-proto および x-forwarded-host は、リバースプロキシ(ロードバランサーやCDNと考えてください)を使用している場合に、元のプロトコルとホストを転送するデファクトスタンダードのヘッダーです。信頼できるリバースプロキシの背後にサーバーがある場合にのみ、これらの変数を設定する必要があります。そうでない場合、クライアントがこれらのヘッダーを偽装する可能性があります。

プロキシを非標準ポートでホストしていて、リバースプロキシが `x-forwarded-port` をサポートしている場合は、`PORT_HEADER=x-forwarded-port` を設定することもできます。

`adapter-node` がデプロイメントのURLを正しく判別できない場合、フォームアクション を使用すると、次のエラーが発生する可能性があります。

クロスサイトPOSTフォーム送信は禁止されています

ADDRESS_HEADER and XFF_DEPTH

フックとエンドポイントに渡される RequestEvent オブジェクトには、クライアントのIPアドレスを返す event.getClientAddress() 関数が含まれています。デフォルトでは、これは接続している `remoteAddress` です。サーバーが1つ以上のプロキシ(ロードバランサーなど)の背後にある場合、この値にはクライアントではなく最も内側にあるプロキシのIPアドレスが含まれるため、アドレスを読み取るための `ADDRESS_HEADER` を指定する必要があります。

ADDRESS_HEADER=True-Client-IP node build

ヘッダーは簡単に偽装できます。`PROTOCOL_HEADER` や `HOST_HEADER` と同様に、これらを設定する前に何をしているのかを理解する必要があります。

`ADDRESS_HEADER` が `X-Forwarded-For` の場合、ヘッダー値にはカンマ区切りのIPアドレスのリストが含まれます。`XFF_DEPTH` 環境変数は、サーバーの前にいくつの信頼できるプロキシがあるかを指定する必要があります。たとえば、3つの信頼できるプロキシがある場合、プロキシ3は元の接続と最初の2つのプロキシのアドレスを転送します。

<client address>, <proxy 1 address>, <proxy 2 address>

一部のガイドでは、左端のアドレスを読み取るように指示されていますが、これではなりすましの脆弱性が残ります。

<spoofed address>, <client address>, <proxy 1 address>, <proxy 2 address>

代わりに、信頼できるプロキシの数を考慮して、*右*から読み取ります。この場合、`XFF_DEPTH=3` を使用します。

代わりに左端のアドレスを読み取る必要がある場合(なりすましは気にしない場合)—たとえば、IPアドレスが*信頼できる*よりも*本物*であることがより重要なジオロケーションサービスを提供する場合、アプリ内で `x-forwarded-for` ヘッダーを調べてそれを行うことができます。

BODY_SIZE_LIMIT

ストリーミング中を含め、受け入れる最大リクエスト本文サイズ(バイト単位)。本文サイズは、キロバイト( `K` )、メガバイト( `M` )、またはギガバイト( `G` )の単位サフィックスで指定することもできます。たとえば、`512K` または `1M` です。デフォルトは512kbです。このオプションは、値 `Infinity` (アダプターの古いバージョンでは0)で無効にすることができ、より高度なものが必要な場合は `handle` でカスタムチェックを実装できます。

SHUTDOWN_TIMEOUT

`SIGTERM` または `SIGINT` シグナルを受信した後、残りの接続を強制的に閉じるまで待機する秒数。デフォルトは `30` です。内部的には、アダプターは `closeAllConnections` を呼び出します。詳細については、グレースフルシャットダウン を参照してください。

IDLE_TIMEOUT

systemdソケットアクティベーションを使用する場合、`IDLE_TIMEOUT` は、リクエストを受信しない場合にアプリが自動的にスリープ状態になるまでの秒数を指定します。設定されていない場合、アプリは継続的に実行されます。詳細については、ソケットアクティベーション を参照してください。

オプション

アダプターはさまざまなオプションで設定できます。

svelte.config
import import adapteradapter from '@sveltejs/adapter-node';

export default {
	
kit: {
    adapter: any;
}
kit
: {
adapter: anyadapter: import adapteradapter({ // default options are shown out: stringout: 'build', precompress: booleanprecompress: true, envPrefix: stringenvPrefix: '' }) } };

out

サーバーをビルドするディレクトリ。デフォルトは `build` です。つまり、`node build` はサーバーが作成された後にローカルでサーバーを起動します。

precompress

アセットと事前レンダリングされたページのgzipとbrotliを使用した事前圧縮を有効にします。デフォルトは `true` です。

envPrefix

デプロイメントの設定に使用される環境変数の名前を変更する必要がある場合(たとえば、制御できない環境変数との競合を解消するため)、プレフィックスを指定できます。

envPrefix: 'MY_CUSTOM_';
MY_CUSTOM_HOST=127.0.0.1 \
MY_CUSTOM_PORT=4000 \
MY_CUSTOM_ORIGIN=https://my.site \
node build

グレースフルシャットダウン

デフォルトでは、`adapter-node` は `SIGTERM` または `SIGINT` シグナルを受信するとHTTPサーバーを正常にシャットダウンします。以下の処理を行います。

  1. 新しいリクエストを拒否します( `server.close`
  2. 既にリクエスト済みだがレスポンスが未受信のリクエストが完了するのを待ち、アイドル状態になったら接続を閉じます (server.closeIdleConnections)。
  3. そして最後に、SHUTDOWN_TIMEOUT 秒後にまだアクティブな接続をすべて閉じます (server.closeAllConnections)。

この動作をカスタマイズしたい場合は、カスタムサーバーを使用できます。

HTTP サーバーがすべての接続を閉じた後に発行される sveltekit:shutdown イベントをリッスンできます。Node の exit イベントとは異なり、sveltekit:shutdown イベントは非同期操作をサポートし、サーバーに未処理の作業 (開いているデータベース接続など) が残っていても、すべての接続が閉じられると常に発行されます。

var process: NodeJS.Processprocess.NodeJS.Process.on(event: string | symbol, listener: (...args: any[]) => void): NodeJS.Process (+12 overloads)

Adds the listener function to the end of the listeners array for the event named eventName. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of eventName and listener will result in the listener being added, and called, multiple times.

server.on('connection', (stream) => {
  console.log('someone connected!');
});

Returns a reference to the EventEmitter, so that calls can be chained.

By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the event listener to the beginning of the listeners array.

import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
//   b
//   a
@sincev0.1.101
@parameventName The name of the event.
@paramlistener The callback function
on
('sveltekit:shutdown', async (reason: anyreason) => {
await jobs.stop(); await db.close(); });

パラメータ reason には以下のいずれかの値が含まれます。

  • SIGINT - シャットダウンは SIGINT シグナルによってトリガーされました。
  • SIGTERM - シャットダウンは SIGTERM シグナルによってトリガーされました。
  • IDLE - シャットダウンは IDLE_TIMEOUT によってトリガーされました。

ソケットアクティベーション

今日のほとんどの Linux オペレーティングシステムは、systemd と呼ばれる最新のプロセス マネージャーを使用してサーバーを起動し、サービスを実行および管理しています。サーバーを設定してソケットを割り当て、オンデマンドでアプリを起動およびスケーリングできます。これは ソケットアクティベーション と呼ばれます。この場合、OS はアプリに 2 つの環境変数 (LISTEN_PIDLISTEN_FDS) を渡します。次に、アダプターは、作成する必要がある systemd ソケットユニットを参照するファイル記述子 3 をリッスンします。

systemd ソケットアクティベーションでも envPrefix を使用できます。 LISTEN_PIDLISTEN_FDS は常にプレフィックスなしで読み取られます。

ソケットアクティベーションを利用するには、次の手順に従います。

  1. systemd サービス としてアプリを実行します。ホストシステムで直接実行することも、コンテナ内 (Docker または systemd ポータブルサービスなどを使用) で実行することもできます。さらに、IDLE_TIMEOUT 環境変数をアプリに渡すと、IDLE_TIMEOUT 秒間リクエストがない場合に正常にシャットダウンします。 systemd は、新しいリクエストが着信すると、アプリを自動的に再起動します。
/etc/systemd/system/myapp
[Service]
Environment=NODE_ENV=production IDLE_TIMEOUT=60
ExecStart=/usr/bin/node /usr/bin/myapp/build
  1. 付随する ソケットユニット を作成します。アダプターは単一のソケットのみを受け入れます。
/etc/systemd/system/myapp
[Socket]
ListenStream=3000

[Install]
WantedBy=sockets.target
  1. sudo systemctl daemon-reload を実行して、systemd が両方のユニットを認識していることを確認します。次に、起動時にソケットを有効にし、sudo systemctl enable --now myapp.socket を使用してすぐに起動します。その後、localhost:3000 に最初のリクエストが行われると、アプリは自動的に起動します。

カスタムサーバー

アダプターは、ビルドディレクトリに 2 つのファイル (index.jshandler.js) を作成します。 index.js を実行すると (たとえば、デフォルトのビルドディレクトリを使用する場合は node build)、設定されたポートでサーバーが起動します。

または、ExpressConnect、または Polka (または組み込みの http.createServer) で使用できるハンドラーをエクスポートする handler.js ファイルをインポートして、独自のサーバーをセットアップできます。

my-server
import { import handlerhandler } from './build/handler.js';
import import expressexpress from 'express';

const const app: anyapp = import expressexpress();

// add a route that lives separately from the SvelteKit app
const app: anyapp.get('/healthcheck', (req, res) => {

	res: anyres.end('ok');
});

// let SvelteKit handle everything else, including serving prerendered pages and static assets
const app: anyapp.use(import handlerhandler);

const app: anyapp.listen(3000, () => {
	var console: Console

The console module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.

The module exports two specific components:

  • A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
  • A global console instance configured to write to process.stdout and process.stderr. The global console can be used without calling require('console').

Warning: The global console object’s methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O for more information.

Example using the global console:

console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
//   Error: Whoops, something bad happened
//     at [eval]:5:15
//     at Script.runInThisContext (node:vm:132:18)
//     at Object.runInThisContext (node:vm:309:38)
//     at node:internal/process/execution:77:19
//     at [eval]-wrapper:6:22
//     at evalScript (node:internal/process/execution:76:60)
//     at node:internal/main/eval_string:23:3

const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr

Example using the Console class:

const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err

const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
@seesource
console
.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)

Prints to stdout with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to printf(3) (the arguments are all passed to util.format()).

const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout

See util.format() for more information.

@sincev0.1.100
log
('listening on port 3000');
});

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