SvelteKitで開発をしています。on mountの説明をしてください。 例えば、scriptに直接windowを書いてもブラウザでは動作しないそうです。
onMount の説明onMount の役割SvelteKitの onMount は、コンポーネントがブラウザにマウント(描画)された後に実行される関数です。これは サーバーサイドレンダリング(SSR) では動作せず、クライアントサイドでのみ機能します。
onMountSvelteKitでは、ページのリクエストを受けると以下の流れで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 をうまく活用して、快適な開発を楽しんでください! 🚀✨