Sapperからの移行
SvelteKitはSapperの後継であり、その設計の多くの要素を共有しています。
SapperアプリをSvelteKitに移行する予定がある場合、いくつかの変更を加える必要があります。移行中にいくつかの例を参照すると役立つ場合があります。
package.json
type: “module”
"type": "module"
をpackage.json
に追加します。Sapper 0.29.3以降を使用している場合は、段階的な移行の一環として、この手順を他の手順とは別に実行できます。
dependencies
polka
またはexpress
を使用している場合はそれらと、sirv
やcompression
などのミドルウェアを削除します。
devDependencies
devDependencies
からsapper
を削除し、@sveltejs/kit
と使用する予定のアダプター(アダプターを参照)(次のセクションを参照)に置き換えます。
scripts
sapper
を参照するスクリプトはすべて更新する必要があります。
sapper build
は、ノードアダプターを使用してvite build
になります。sapper export
は、静的アダプターを使用してvite build
になります。sapper dev
はvite dev
になります。node __sapper__/build
はnode build
になります。
プロジェクトファイル
アプリの大部分はsrc/routes
に残すことができますが、いくつかのプロジェクトファイルは移動または更新する必要があります。
設定
webpack.config.js
またはrollup.config.js
は、こちらで説明されているように、svelte.config.js
に置き換える必要があります。Svelteプリプロセッサオプションはconfig.preprocess
に移動する必要があります。
アダプターを追加する必要があります。sapper build
はほぼadapter-nodeに相当し、sapper export
はほぼadapter-staticに相当しますが、デプロイするプラットフォーム用に設計されたアダプターを使用することを好むかもしれません。
Viteで自動的に処理されないファイルタイプのプラグインを使用していた場合、Viteの同等のものを見つけてVite設定に追加する必要があります。
src/client.js
このファイルにはSvelteKitに相当するものはありません。sapper.start(...)
以外のカスタムロジックは、onMount
コールバック内で+layout.svelte
ファイルで表現する必要があります。
src/server.js
adapter-node
を使用する場合、相当するものはカスタムサーバーです。それ以外の場合、SvelteKitアプリはサーバーレス環境で実行できるため、このファイルには直接的な相当するものはありません。
src/service-worker.js
@sapper/service-worker
からのインポートのほとんどは$service-worker
に相当するものが存在します。
files
は変更されていません。routes
は削除されました。shell
はbuild
になりました。timestamp
はversion
になりました。
src/template.html
src/template.html
ファイルの名前をsrc/app.html
に変更する必要があります。
%sapper.base%
、%sapper.scripts%
、%sapper.styles%
を削除します。%sapper.head%
を%sveltekit.head%
に、%sapper.html%
を%sveltekit.body%
に置き換えます。<div id="sapper">
はもう必要ありません。
src/node_modules
Sapperアプリでは、内部ライブラリをsrc/node_modules
内のディレクトリに配置することが一般的です。これはViteでは機能しないため、代わりにsrc/lib
を使用します。
ページとレイアウト
ファイル名の変更
ルートはあいまいさを解消するためにフォルダ名だけで構成されるようになりました。+page.svelte
に至るまでのフォルダ名はルートに対応します。ルーティングドキュメントの概要を参照してください。以下は古いものと新しいものの比較を示しています。
古いもの | 新しいもの |
---|---|
routes/about/index.svelte | routes/about/+page.svelte |
routes/about.svelte | routes/about/+page.svelte |
カスタムエラーページコンポーネントの名前を_error.svelte
から+error.svelte
に変更する必要があります。_layout.svelte
ファイルも同様に+layout.svelte
に名前を変更する必要があります。その他のファイルは無視されます。
インポート
@sapper/app
からのgoto
、prefetch
、prefetchRoutes
インポートは、それぞれ$app/navigation
からのgoto
、preloadData
、preloadCode
インポートに置き換える必要があります。
@sapper/app
からのstores
インポートは置き換える必要があります。下記のストアセクションを参照してください。
以前src/node_modules
のディレクトリからインポートしていたファイルは、$lib
インポートに置き換える必要があります。
プリロード
以前と同様に、ページとレイアウトは、レンダリングの前にデータを読み込むことができる関数をエクスポートできます。
この関数はpreload
からload
に名前が変更され、+page.svelte
(または+layout.svelte
)の横に+page.js
(または+layout.js
)に配置され、APIが変更されました。2つの引数(page
とsession
)ではなく、単一のevent
引数があります。
this
オブジェクトはなくなりました。そのため、this.fetch
、this.error
、this.redirect
もありません。代わりに、入力メソッドからfetch
を取得でき、error
とredirect
の両方がスローされるようになりました。
ストア
Sapperでは、提供されたストアへの参照を次のように取得します。
import { module "@sapper/app"
stores } from '@sapper/app';
const { const preloading: any
preloading, const page: any
page, const session: any
session } = module "@sapper/app"
stores();
page
ストアはまだ存在します。preloading
は、from
とto
プロパティを含むnavigating
ストアに置き換えられました。page
にはurl
とparams
プロパティがありますが、path
やquery
はありません。
SvelteKitではそれらに異なる方法でアクセスします。stores
はgetStores
になりましたが、ほとんどの場合、$app/stores
からnavigating
とpage
を直接インポートできるため、不要です。
ルーティング
正規表現ルートはサポートされなくなりました。高度なルートマッチングを使用してください。
セグメント
以前は、レイアウトコンポーネントは子セグメントを示すsegment
プロップを受け取っていました。これは削除されました。より柔軟な$page.url.pathname
値を使用して、必要なセグメントを導き出す必要があります。
URL
Sapperでは、すべての相対URLは、basepath
オプションが使用されていない限り、通常は/
である基本URLに対して解決され、現在のページに対して解決されることはありませんでした。
これは問題を引き起こしたため、SvelteKitではもうそうではありません。代わりに、相対URLは現在のページ(またはload
関数内のfetch
URLの場合は宛先ページ)に対して解決されるようになりました。ほとんどの場合、意味がコンテキストに依存しないため、ルート相対(つまり、/
で始まる)URLを使用する方が簡単です。
<a> 属性
sapper:prefetch
はdata-sveltekit-preload-data
になりました。sapper:noscroll
はdata-sveltekit-noscroll
になりました。
エンドポイント
Sapperでは、サーバールートは、Nodeのhttp
モジュール(またはPolkaやExpressなどのフレームワークによって提供される拡張バージョン)によって公開されたreq
とres
オブジェクトを受け取っていました。
SvelteKitは、アプリがどこで実行されているかに関係なく設計されています。ノードサーバーで実行できますが、サーバーレスプラットフォームまたはCloudflare Workerでも実行できます。そのため、req
とres
を直接操作することはなくなりました。エンドポイントは新しいシグネチャに合わせて更新する必要があります。
この環境非依存の動作をサポートするために、fetch
はグローバルコンテキストで使用できるようになったため、それを使用する際にnode-fetch
、cross-fetch
、または同様のサーバーサイドフェッチ実装をインポートする必要はありません。
統合
統合の詳細については統合を参照してください。
HTMLミニファイア
Sapperはデフォルトでhtml-minifier
を含んでいます。SvelteKitにはこれは含まれていませんが、prod依存関係として追加し、フックを使用して使用できます。
import { module "html-minifier"
minify } from 'html-minifier';
import { const building: boolean
SvelteKit analyses your app during the build
step by running it. During this process, building
is true
. This also applies during prerendering.
building } from '$app/environment';
const const minification_options: {
collapseBooleanAttributes: boolean;
collapseWhitespace: boolean;
conservativeCollapse: boolean;
decodeEntities: boolean;
html5: boolean;
ignoreCustomComments: RegExp[];
minifyCSS: boolean;
... 8 more ...;
sortClassName: boolean;
}
minification_options = {
collapseBooleanAttributes: boolean
collapseBooleanAttributes: true,
collapseWhitespace: boolean
collapseWhitespace: true,
conservativeCollapse: boolean
conservativeCollapse: true,
decodeEntities: boolean
decodeEntities: true,
html5: boolean
html5: true,
ignoreCustomComments: RegExp[]
ignoreCustomComments: [/^#/],
minifyCSS: boolean
minifyCSS: true,
minifyJS: boolean
minifyJS: false,
removeAttributeQuotes: boolean
removeAttributeQuotes: true,
removeComments: boolean
removeComments: false, // some hydration code needs comments, so leave them in
removeOptionalTags: boolean
removeOptionalTags: true,
removeRedundantAttributes: boolean
removeRedundantAttributes: true,
removeScriptTypeAttributes: boolean
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: boolean
removeStyleLinkTypeAttributes: true,
sortAttributes: boolean
sortAttributes: true,
sortClassName: boolean
sortClassName: true
};
/** @type {import('@sveltejs/kit').Handle} */
export async function function handle(input: {
event: RequestEvent;
resolve(event: RequestEvent, opts?: ResolveOptions): MaybePromise<Response>;
}): MaybePromise<...>
handle({ event: RequestEvent<Partial<Record<string, string>>, string | null>
event, resolve: (event: RequestEvent, opts?: ResolveOptions) => MaybePromise<Response>
resolve }) {
let let page: string
page = '';
return resolve: (event: RequestEvent, opts?: ResolveOptions) => MaybePromise<Response>
resolve(event: RequestEvent<Partial<Record<string, string>>, string | null>
event, {
ResolveOptions.transformPageChunk?(input: {
html: string;
done: boolean;
}): MaybePromise<string | undefined>
Applies custom transforms to HTML. If done
is true, it’s the final chunk. Chunks are not guaranteed to be well-formed HTML
(they could include an element’s opening tag but not its closing tag, for example)
but they will always be split at sensible boundaries such as %sveltekit.head%
or layout/page components.
transformPageChunk: ({ html: string
html, done: boolean
done }) => {
let page: string
page += html: string
html;
if (done: boolean
done) {
return const building: boolean
SvelteKit analyses your app during the build
step by running it. During this process, building
is true
. This also applies during prerendering.
building ? module "html-minifier"
minify(let page: string
page, const minification_options: {
collapseBooleanAttributes: boolean;
collapseWhitespace: boolean;
conservativeCollapse: boolean;
decodeEntities: boolean;
html5: boolean;
ignoreCustomComments: RegExp[];
minifyCSS: boolean;
... 8 more ...;
sortClassName: boolean;
}
minification_options) : let page: string
page;
}
}
});
}
サイトの製品版ビルドをテストするために`vite preview`コマンドを使用する場合、プリレンダリングは行われません(`prerendering`は`false`)。したがって、ファイルの縮小化結果を確認するには、生成されたHTMLファイルを直接確認する必要があります。