在 Day 17 時有提到有些資料可以透過 +page.ts
的 load
的 function 先行在 server-side 運算後傳到 +page.svelte
但因為 +page.ts
在 client-side 也會執行,所以如果有些較敏感的環境變數還是會暴露在 client-side ,如果我們想確保這個 load
只有在 server-side 才能執行的話我們就能改用 +page.server.ts
這裡我們先新增三個檔案 +page.server.ts
、 +page.ts
和 +page.svelte
// in src/routes/day19/+page.server.ts
import type { PageLoad } from './$types';
export const load: PageLoad = () => {
console.log('+page.ts load;');
return {
title: '[+page.server.ts] Day 19',
content: '[+page.server.ts] This is the content of day 19',
source: 'server'
};
};
// in src/routes/day19/+page.ts
import type { PageServerLoad } from './$types';
export const load: PageServerLoad = async ({ params }) => {
console.log('+page.server.ts load', params);
return {
title: '[+page.ts] Day 19',
content: '[+page.ts] This is the content of day 19',
};
};
<!-- in src/routes/day19/+page.svelte -->
<script lang="ts">
import type { PageData } from './$types';
interface Props {
data: PageData;
}
let { data }: Props = $props();
</script>
<h1>data from load</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
然後我們訪問 /day19
時可以在 terminal 看到兩個兩個 load
都有成功輸出
但當我們打開瀏覽器的時會發現只有 +page.ts
的資料而沒有 +page.server.ts
的資料
那這時再把 +page.ts
的 load
給註解起來,就會發現有 +page.server.ts
的資料了,這是因為如果兩者同時使用時 +page.server.ts
就不會將資料傳遞給 +page.svelte
了
如果真的有需要同時使用兩者時,可以在 +page.ts
的 load
中將 +page.server.ts
的資料取出來。
// in src/routes/day19/+page.ts
import type { PageLoad } from './$types';
export const load: PageLoad = ({ data }) => {
console.log('+page.ts load;');
console.log(data);
return {
title: '[+page.ts] Day 19',
content: '[+page.ts] This is the content of day 19'
};
};
用法就跟 +layout.ts
一樣
import type { LayoutServerLoad } from './$types';
export const load: LayoutServerLoad = () => {
return {
data: '[+layout.server.ts] Hello world!'
};
};
然後就能在頁面上看到它跟 +page.ts
的資料 merge 在一起了。
當然如果也跟 +layout.ts
同時使用的話,頁面就只會拿到 +layout.ts
的資料,這時如果要使用 +layout.server.ts
一樣是要透過 +layout.ts
的 load
將 data 取出來才行。
import type { LayoutLoad } from './$types';
export const load: LayoutLoad = ({ data }) => {
console.log('+layout.ts load', data);
return {
data: '[+layout.ts] Hello world!'
};
};
這幾天我們都在討論 SvelteKit 各種路由檔案的用法,接下來就來稍微歸納一下
.svelte
的檔案就是會一個 Svelte component
+page.svelte
會是一個獨立的頁面
+layout
則會影響自己還有所有子目錄的所有頁面的佈局
「預設情況下」在 client-side 和 server-side 都會執行
.ts
的檔案就可以使用 load
function 以及各種渲染參數
+page
就只有該頁面會影響到
+layout
則會影響自己還有所有子目錄的所有頁面
「預設情況下」在 client-side 和 server-side 都會執行
.server.ts
的檔案就可以使用 load
function ,但只會在 server-side 執行
+page
就只有該頁面會影響到
+layout
則會影響自己還有所有子目錄的所有頁面
只會在 server-side 執行
同時使用 .ts
和 .server.ts
時 .server.ts
的資料不會被傳到頁面裡需要透過 .ts
的 load
將 data
取出來
同時使用 +page
及 +layout
的 load
資料會被 merge 在一起。
https://github.com/toddLiao469469/30days-for-svelte5/tree/main/src/routes/day19