SvelteKitで開発をしています。on mountの説明をしてください。 例えば、scriptに直接windowを書いてもブラウザでは動作しないそうです。
onMount
の説明onMount
の役割SvelteKitの onMount
は、コンポーネントがブラウザにマウント(描画)された後に実行される関数です。これは サーバーサイドレンダリング(SSR) では動作せず、クライアントサイドでのみ機能します。
onMount
SvelteKitでは、ページのリクエストを受けると以下の流れでHTMLを生成します。
+page.server.js
(または .ts
)と +page.svelte
を処理onMount
は実行されていないonMount
が実行つまり、SSRではHTMLがすぐに生成されますが、ブラウザ側で実際にコンポーネントがマウントされた後でなければ onMount
は動作しません。
onMount
の具体的な用途window
オブジェクトの使用)load
関数の方が推奨される場合も)onMount
を使う際の注意点script
の中に window
を直接書いても、SSRでは window
が存在しないためエラーになるonMount
を使えば window
を安全に利用できるonMount
の基本的な書き方<script>
import { onMount } from 'svelte';
let data;
onMount(() => {
if (typeof window !== 'undefined') {
data = localStorage.getItem('key') || 'デフォルト値';
}
});
</script>
<p>{data}</p>
このコードでは、onMount
を使って localStorage
からデータを取得し、コンポーネントに反映させています。
onMount
は コンポーネントがブラウザでマウントされた後に実行されるwindow
の操作、ローカルストレージ、イベントリスナー)に使うonMount
を適切に使うことで、クライアントサイドの処理を適切に分離できるSvelteKitでは、SSRとクライアントサイドの違いを意識しながら onMount
を活用すると、より適切なアプリ設計ができます!
scriptにwindowを直接書いてもブラウザでは実行できないので、onMount内に記載して実行できるようにするということですか。
はい、その理解で正しいです!🎯
script
に window
を直接書くと動かないのか?SvelteKitでは、<script>
の中のコードは サーバー(SSR)とクライアント(ブラウザ)の両方で実行される可能性がある ため、window
を直接使うと SSR時に window
が存在せずエラー になります。
<script>
let width = window.innerWidth; // ❌ SSR時にエラーが発生する
</script>
<p>ウィンドウの幅: {width}px</p>
❌ エラーの原因:window
は ブラウザにしか存在しない ので、サーバー上(SSR)でこのコードを実行しようとすると window is not defined
というエラーが発生する。
onMount
内に window
を記載onMount
を使うと、SSRでは実行されず、クライアントサイドでのみ実行 されるため、安全に window
を使うことができます。
<script>
import { onMount } from 'svelte';
let width;
onMount(() => {
width = window.innerWidth; // ✅ クライアントサイドでのみ実行される
});
</script>
<p>ウィンドウの幅: {width}px</p>
✅ 正しい動作:
onMount
内のコードは実行されないため、window
にアクセスしようとしても問題なし。onMount
が発火し、そのタイミングで window.innerWidth
を取得。✔ window
や document
などの ブラウザ専用オブジェクト は、SSR時には存在しないので、onMount
内で使うのが正しい
✔ onMount
は クライアントサイドでのみ実行される ため、SSRのエラーを回避できる
✔ ローカルストレージやイベントリスナーの登録など、ブラウザでのみ動く処理は onMount
に記述する 🚀
これを意識すれば、SvelteKitでの開発がスムーズになります!🔥
そもそもSveltKitがサーバーサイドでHTMLを生成するからこのようなことが起こるのですか。
はい、その通りです! 🎯
SvelteKitがサーバーサイドでHTMLを生成(SSR)するからこそ、このような問題が発生します。
window
を直接使うとエラーになるのか?通常のフロントエンドフレームワーク(例えばReactのCSR)では、最初からクライアント(ブラウザ)でコードが実行 されるので window
や document
を自由に使えます。
しかし、SvelteKitは 初回のページロード時にサーバーでHTMLを生成して返す(SSR) という動作をするため、 サーバー環境には window
や document
が存在しません。
そのため、例えば以下のコードは SSR時にエラーになります。
<script>
let width = window.innerWidth; // ❌ サーバーでは `window` が存在しないためエラー
</script>
<p>ウィンドウの幅: {width}px</p>
+page.svelte
や +page.server.js
を処理し、HTMLを生成onMount
など)が実行onMount
の中の処理が動く(ここで window
や document
を安全に使える)この流れの ②の段階ではサーバー上でコードが実行されるため、window
が存在しない のがポイントです。
onMount
を使うonMount
を使うと、クライアントサイドでのみコードを実行できるため、安全に window
を利用できます。
<script>
import { onMount } from 'svelte';
let width;
onMount(() => {
width = window.innerWidth; // ✅ ブラウザ上でのみ実行
});
</script>
<p>ウィンドウの幅: {width}px</p>
✅ このコードなら問題なく動作する理由:
onMount
内のコードは実行されない ので、window
にアクセスせずエラーにならないonMount
が発火し、window
を安全に利用できる✔ SvelteKitはSSRを行うため、サーバー上では window
や document
は存在しない
✔ そのため、window
を直接使うとSSR時にエラーになる
✔ onMount
を使えば、クライアントサイドでのみ実行できるので安全
✔ この違いを意識すれば、SSRとCSRのハイブリッド開発がスムーズにできる 🚀
SvelteKitのSSRの仕組みを理解すると、なぜ onMount
が必要なのかがよく分かるようになりますね! 💡
今までの会話を踏まえて、SveltKitにおけるouMountの仕組みを初学者に分かりやすく説明できるようにまとめてください。
onMount
の仕組みを分かりやすく解説 🚀onMount
とは?onMount
は、SvelteKitのコンポーネントが ブラウザ(クライアント)に表示されたときに実行される関数 です。
💡 ポイント
onMount
内のコードは動かない。window
や document
などのブラウザ専用のオブジェクトを安全に扱える。onMount
が必要なのか?SvelteKitは 最初にサーバー側でHTMLを生成する(SSR) ので、
通常の <script>
に window
などを書いてしまうと サーバー上で実行されてエラー になります。
❌ エラーになる例(NGコード)
<script>
let width = window.innerWidth; // ❌ SSR時に `window is not defined` エラー
</script>
<p>ウィンドウの幅: {width}px</p>
window
は ブラウザにしか存在しない ため、サーバー上でこのコードが実行されるとエラーになる!onMount
を使うとどうなる?onMount
を使えば、ブラウザに描画された後に実行される ため、安全に window
を利用できます。
✅ 正しい使い方(OKコード)
<script>
import { onMount } from 'svelte';
let width;
onMount(() => {
width = window.innerWidth; // ✅ ブラウザでのみ実行されるため安全
});
</script>
<p>ウィンドウの幅: {width}px</p>
このコードが正しく動く理由 👇
onMount
内のコードは実行されない(→ エラーにならない)onMount
が実行される(→ window
を安全に使える)onMount
の主な使い道onMount
は、ブラウザでしか動かない処理 に使います。
✅ よく使うケース
window
を使った処理(例:window.innerWidth
で画面サイズ取得)window.addEventListener
)onMount
の具体例<script>
import { onMount } from 'svelte';
let width = 0;
onMount(() => {
width = window.innerWidth; // ✅ クライアントでのみ実行
});
</script>
<p>現在のウィンドウ幅: {width}px</p>
<script>
import { onMount } from 'svelte';
let userName = 'ゲスト';
onMount(() => {
userName = localStorage.getItem('name') || 'ゲスト';
});
</script>
<p>こんにちは、{userName} さん!</p>
<script>
import { onMount } from 'svelte';
let scrollY = 0;
onMount(() => {
const updateScroll = () => {
scrollY = window.scrollY;
};
window.addEventListener('scroll', updateScroll);
return () => {
window.removeEventListener('scroll', updateScroll); // ✅ クリーンアップ
};
});
</script>
<p>スクロール位置: {scrollY}px</p>
onMount
の注意点⚠ 注意すべきポイント
load
関数を使うonDestroy
で解除する(メモリリークを防ぐ)onMount
が実行されるまで変数が undefined
にならないようにする🔹 SvelteKitではSSR(サーバーサイドレンダリング)があるので、window
などのブラウザ専用オブジェクトを直接使うとエラーになる
🔹 onMount
を使うと、ブラウザでのみコードを実行できるので安全
🔹 ローカルストレージ、イベントリスナー、window
などの処理は onMount
内に書く
🔹 onMount
を適切に使えば、SSRとCSR(クライアントサイドレンダリング)をスムーズに組み合わせられる!
onMount
を使って、SvelteKitをもっと便利に!SvelteKitの強みは、SSRとCSRを組み合わせられること!
そのためには 「どこでコードが実行されるのか?」 を意識することが大事です。onMount
をうまく活用して、快適な開発を楽しんでください! 🚀✨