【SvelteKit】svelte configのadapterを調査
最近さわっているsveltekitのアダプターの仕組みが気になったのでソースコードを読んでみる。
adapter-vercel
を例として調べてます。
リポジトリは@sveltejs/adapter-vercel
で、sveltekitのリポジトリ@sveltejs/kit
内にコードがあります。
/adapter-vercel/index.js
の中を見てみると、export default plugin;
とあります。そしてこのplugin
の定義はこのようになっています。
/** @type {import('.').default} **/
const plugin = function (defaults = {}) {
/** 略 **/
return {
name: '@sveltejs/adapter-vercel',
async adapt(builder) {
/** 略 **/
}
}
}
つまりplugin
は大枠でみるとname
とadapt
という2つのプロパティをもつオブジェクトを返す関数です。
adapt
は何をしているかというと、ビルドした生成物をおくディレクトリ設定やコンソールへの出力などです。
ところで、アダプターはsvelte.config.js
に記述します。これはどこでロードしているのでしょうか。
sveltekit公式ドキュメントから引用すると、
import adapter from '@sveltejs/adapter-vercel';
export default {
kit: {
adapter: adapter({
// see the 'Deployment configuration' section below
})
}};
これをロードしている場所があるはず。リポジトリ内でkit.adapter
という文字列を検索すると、src/core/adapt
内のindex.js
ファイルがヒットしました。
export async function adapt( config, /** 略 **/ ) {
const { name, adapt } = config.kit.adapter;
/** 略 **/
}
ここでconfigファイルが発見!追跡します。
src/exports/vite/index.js
にて、動的にインポートされています。ビルドする際にkit.adapter
があればインポートするようになっています。
/** 略 **/
if (kit.adapter) {
const { adapt } = await import('../../core/adapt/index.js');
await adapt(
svelte_config,
build_data,
metadata,
prerendered,
prerender_map,
log,
vite_config
);
} else {
/** 略 **/
ここでadapt
の引数にあたえられているsvelte_config
がどこから来ているのかが気になります。定義部分をさがすと、
/**
* Returns the SvelteKit Vite plugins.
* @returns {Promise<import('vite').Plugin[]>}
*/
export async function sveltekit() {
const svelte_config = await load_config();
/** 略 **/
viteプラグインを生成する関数の最初にありました。次はload_config()
を探ります。
同じくsrc/exports/vite/index.js
の先頭部分にて
import { load_config } from '../../core/config/index.js';
今度はsrc/core/config
をみてみます。
/**
* Loads and validates svelte.config.js
* @param {{ cwd?: string }} options
* @returns {Promise<import('types').ValidatedConfig>}
*/
export async function load_config({ cwd = process.cwd() } = {}) {
const config_file = path.join(cwd, 'svelte.config.js');
if (!fs.existsSync(config_file)) {
return process_config({}, { cwd });
}
const config = await import(`${url.pathToFileURL(config_file).href}?ts=${Date.now()}`);
return process_config(config.default, { cwd });
}
ここでsvelte.config.js
を読み込んでいるのがわかります。
まとめると、
-
adapter-xxx
は各プラットフォームでのビルド方法について設定する。 - sveltekitはviteでビルドする。
- その際に
svelte.config.js
を読み込む。 -
kit.adapter
が指定されていれば読み込む。
- その際に
こんな感じです。