iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Modern Web

Svelte 的奇妙冒險系列 第 19

[Svelte 的奇妙冒險] Day 19 - SvelteKit 中的路由 (4)

  • 分享至 

  • xImage
  •  

+page.server.ts

Day 17 時有提到有些資料可以透過 +page.tsload 的 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.tsload 給註解起來,就會發現有 +page.server.ts 的資料了,這是因為如果兩者同時使用時 +page.server.ts 就不會將資料傳遞給 +page.svelte

如果真的有需要同時使用兩者時,可以在 +page.tsload 中將 +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.server.ts

用法就跟 +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.tsload 將 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 的資料不會被傳到頁面裡需要透過 .tsloaddata 取出來

  • 同時使用 +page+layoutload 資料會被 merge 在一起。


參考資料

source code

https://github.com/toddLiao469469/30days-for-svelte5/tree/main/src/routes/day19


上一篇
[Svelte 的奇妙冒險] Day 18 - SvelteKit 中的路由 (3)
下一篇
[Svelte 的奇妙冒險] Day 20 - 錯誤處理
系列文
Svelte 的奇妙冒險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言