SvelteKit 最新中文文檔教程(12)—— 高級路由

前言

Svelte,一個語法簡潔、入門容易,面向未來的前端框架。

從 Svelte 誕生之初,就備受開發者的喜愛,根據統計,從 2019 年到 2024 年,連續 6 年一直是開發者最感興趣的前端框架 No.1

image.png

Svelte 以其獨特的編譯時優化機制著稱,具有輕量級高性能易上手等特性,非常適合構建輕量級 Web 項目

為了幫助大家學習 Svelte,我同時搭建了 Svelte 最新的中文文檔站點。

如果需要進階學習,也可以入手我的小冊《Svelte 開發指南》,語法篇、實戰篇、原理篇三大篇章帶你系統掌握 Svelte!

歡迎圍觀我的“網頁版朋友圈”、加入“冴羽·成長陪伴社群”,踏上“前端大佬成長之路”。

高級路由

剩余參數

如果路由段的數量未知,您可以使用剩余語法 — 例如您可以像這樣實現 GitHub 的文件查看器…

/[org]/[repo]/tree/[branch]/[...file]

…在這種情況下,對 /sveltejs/kit/tree/main/documentation/docs/04-advanced-routing.md 的請求將導致以下參數可供頁面使用:

// @noErrors
{org: 'sveltejs',repo: 'kit',branch: 'main',file: 'documentation/docs/04-advanced-routing.md'
}

[!NOTE] src/routes/a/[...rest]/z/+page.svelte 將匹配 /a/z(即完全沒有參數)以及 /a/b/z/a/b/c/z 等。請確保檢查剩余參數的值是否有效,例如使用匹配器。

404 頁面

剩余參數還允許您渲染自定義 404。給定這些路由…

src/routes/
├ marx-brothers/
│ ├ chico/
│ ├ harpo/
│ ├ groucho/
│ └ +error.svelte
└ +error.svelte

…如果您訪問 /marx-brothers/karlmarx-brothers/+error.svelte 文件將不會被渲染,因為沒有匹配到路由。如果您想渲染嵌套的錯誤頁面,您應該創建一個匹配任何 /marx-brothers/* 請求的路由,并從中返回 404:

src/routes/
├ marx-brothers/
+++| ├ [...path]/+++
│ ├ chico/
│ ├ harpo/
│ ├ groucho/
│ └ +error.svelte
└ +error.svelte
/// file: src/routes/marx-brothers/[...path]/+page.js
import { error } from '@sveltejs/kit';/** @type {import('./$types').PageLoad} */
export function load(event) {error(404, 'Not Found');
}

[!NOTE] 如果您不處理 404 情況,它們將出現在 handleError

可選參數

[lang]/home 這樣的路由包含一個名為 lang 的必需參數。有時需要讓這些參數成為可選的,這樣在這個例子中 homeen/home 都指向同一個頁面。您可以通過將參數包裹在另一對括號中來實現:[[lang]]/home

注意,可選路由參數不能跟在剩余參數后面([...rest]/[[optional]]),因為參數是"貪婪"匹配的,可選參數永遠不會被使用。

匹配

src/routes/fruits/[page] 這樣的路由會匹配 /fruits/apple,但它也會匹配 /fruits/rocketship。我們不希望這樣。您可以通過在 params 目錄中添加一個 匹配器 — 它接收參數字符串("apple""rocketship")并在有效時返回 true — 來確保路由參數格式正確…

/// file: src/params/fruit.js
/*** @param {string} param* @return {param is ('apple' | 'orange')}* @satisfies {import('@sveltejs/kit').ParamMatcher}*/
export function match(param) {return param === 'apple' || param === 'orange';
}

…并增強您的路由:

src/routes/fruits/[page+++=fruit+++]

如果路徑名不匹配,SvelteKit 將嘗試匹配其他路由(使用下面指定的排序順序),最終返回 404。

params 目錄中的每個模塊對應一個匹配器,除了 *.test.js*.spec.js 文件,這些文件可用于對匹配器進行單元測試。

[!NOTE] 匹配器在服務端和瀏覽器中都會運行。

排序

多個路由可能匹配同一個路徑。例如,以下每個路由都會匹配 /foo-abc

src/routes/[...catchall]/+page.svelte
src/routes/[[a=x]]/+page.svelte
src/routes/[b]/+page.svelte
src/routes/foo-[c]/+page.svelte
src/routes/foo-abc/+page.svelte

SvelteKit 需要知道正在請求哪個路由。為此,它根據以下規則進行排序…

  • 更具體的路由具有更高的優先級(例如,沒有參數的路由比有一個動態參數的路由更具體,以此類推)
  • 帶有匹配器的參數([name=type])比沒有匹配器的參數([name])具有更高的優先級
  • [[optional]][...rest] 參數將被忽略,除非它們是路由的最后一部分,在這種情況下它們被視為最低優先級。換句話說,x/[[y]]/z 在排序時被視為與 x/z 等同
  • 平局通過字母順序解決

…導致此排序結果,這意味著 /foo-abc 將調用 src/routes/foo-abc/+page.svelte,而 /foo-def 將調用 src/routes/foo-[c]/+page.svelte 而不是不太具體的路由:

src/routes/foo-abc/+page.svelte
src/routes/foo-[c]/+page.svelte
src/routes/[[a=x]]/+page.svelte
src/routes/[b]/+page.svelte
src/routes/[...catchall]/+page.svelte

編碼

某些字符不能用于文件系統 — Linux 和 Mac 上的 /,Windows 上的 \ / : * ? " < > |#% 字符在 URL 中有特殊含義,[ ] ( ) 字符在 SvelteKit 中有特殊含義,所以這些字符也不能直接用作路由的一部分。

如果要在路由中使用這些字符,您可以使用十六進制轉義序列,其格式為 [x+nn],其中 nn 是十六進制字符代碼:

  • \[x+5c]
  • /[x+2f]
  • :[x+3a]
  • *[x+2a]
  • ?[x+3f]
  • "[x+22]
  • <[x+3c]
  • >[x+3e]
  • |[x+7c]
  • #[x+23]
  • %[x+25]
  • [[x+5b]
  • ][x+5d]
  • ([x+28]
  • )[x+29]

例如,要創建一個 /smileys/:-) 路由,您需要創建一個 src/routes/smileys/[x+3a]-[x+29]/+page.svelte 文件。

您可以使用 JavaScript 確定字符的十六進制代碼:

':'.charCodeAt(0).toString(16); // '3a',因此使用 '[x+3a]'

您也可以使用 Unicode 轉義序列。通常您不需要這樣做,因為您可以直接使用未編碼的字符,但如果出于某種原因您不能有包含例如表情符號的文件名,那么您可以使用轉義字符。換句話說,這些是等效的:

src/routes/[u+d83e][u+dd2a]/+page.svelte
src/routes/🤪/+page.svelte

Unicode 轉義序列的格式是 [u+nnnn],其中 nnnn 是介于 000010ffff 之間的有效值。(與 JavaScript 字符串轉義不同,不需要使用代理對來表示超過 ffff 的代碼點。)要了解更多關于 Unicode 編碼的信息,請參考 使用 Unicode 編程。

[!NOTE] 由于 TypeScript 難以處理以 . 字符開頭的目錄,在創建例如 .well-known 路由時,您可能會發現對這些字符進行編碼會很有用:src/routes/[x+2e]well-known/...

高級布局

默認情況下,布局層次結構 反映了 路由層次結構。在某些情況下,這可能不是您想要的。

(group)

也許您有一些路由是"應用"路由,應該有一個布局(例如 /dashboard/item),而其他路由則是"營銷"路由,應該有一個不同的布局(/about/testimonials)。

我們可以用一個括號括起來的目錄名稱對這些路由進行分組 — 與普通目錄不同,(app)(marketing) 不影響路由的 URL 路徑名:

src/routes/
+++│ (app)/+++
│ ├ dashboard/
│ ├ item/
│ └ +layout.svelte
+++│ (marketing)/+++
│ ├ about/
│ ├ testimonials/
│ └ +layout.svelte
├ admin/
└ +layout.svelte

您也可以直接將一個 +page 放在 (group) 中,例如如果 / 應該是一個 (app)(marketing) 頁面。

跳出布局

根布局適用于您的應用的每個頁面 — 如果省略,它默認為 {@render children()}。如果您希望某些頁面有不同于其余頁面的布局層次結構,那么您可以將整個應用放在一個或多個組內,除了 不應繼承公共布局的路由。

在上面的例子中,/admin 路由不繼承 (app)(marketing) 布局。

+page@

頁面可以在逐個路由的基礎上跳出當前布局層次結構。假設我們在前面例子的 (app) 組內有一個 /item/[id]/embed 路由:

src/routes/
├ (app)/
│ ├ item/
│ │ ├ [id]/
│ │ │ ├ embed/
+++│ │ │ │ └ +page.svelte+++
│ │ │ └ +layout.svelte
│ │ └ +layout.svelte
│ └ +layout.svelte
└ +layout.svelte

通常,這將繼承根布局、(app) 布局、item 布局和 [id] 布局。我們可以通過附加 @ 后跟路由段名來重置到其中一個布局 — 對于根布局,使用空字符串。在此例子中,我們可以選擇以下選項:

  • +page@[id].svelte - 繼承自 src/routes/(app)/item/[id]/+layout.svelte
  • +page@item.svelte - 繼承自 src/routes/(app)/item/+layout.svelte
  • +page@(app).svelte - 繼承自 src/routes/(app)/+layout.svelte
  • +page@.svelte - 繼承自 src/routes/+layout.svelte
src/routes/
├ (app)/
│ ├ item/
│ │ ├ [id]/
│ │ │ ├ embed/
+++│ │ │ │ └ +page@(app).svelte+++
│ │ │ └ +layout.svelte
│ │ └ +layout.svelte
│ └ +layout.svelte
└ +layout.svelte

+layout@

像頁面一樣,布局本身也可以使用相同的方式跳出其父布局層次結構。例如,+layout@.svelte 組件將將重置其所有子路由的層次結構。

src/routes/
├ (app)/
│ ├ item/
│ │ ├ [id]/
│ │ │ ├ embed/
│ │ │ │ └ +page.svelte  // 使用 (app)/item/[id]/+layout.svelte
│ │ │ ├ +layout.svelte  // 繼承自 (app)/item/+layout@.svelte
│ │ │ └ +page.svelte    // 使用 (app)/item/+layout@.svelte
│ │ └ +layout@.svelte   // 繼承自根布局,跳過 (app)/+layout.svelte
│ └ +layout.svelte
└ +layout.svelte

何時使用布局分組

并非所有用例都適合使用布局分組,您也不應該覺得必須使用它們。可能您的用例會導致復雜的 (group) 嵌套,或者您不想為一個特例引入 (group)。使用其他方式如組合(可復用的 load 函數或 Svelte 組件)或 if 語句來實現您想要的效果也完全可以。以下示例展示了一個回退到根布局并復用其他布局也可以使用的組件和函數:

<!--- file: src/routes/nested/route/+layout@.svelte --->
<script>import ReusableLayout from '$lib/ReusableLayout.svelte';let { data, children } = $props();
</script><ReusableLayout {data}>{@render children()}
</ReusableLayout>
/// file: src/routes/nested/route/+layout.js
// @filename: ambient.d.ts
declare module "$lib/reusable-load-function" {export function reusableLoad(event: import('@sveltejs/kit').LoadEvent): Promise<Record<string, any>>;
}
// @filename: index.js
// ---cut---
import { reusableLoad } from '$lib/reusable-load-function';/** @type {import('./$types').PageLoad} */
export function load(event) {// Add additional logic here, if neededreturn reusableLoad(event);
}

進一步閱讀

  • 教程:高級路由

Svelte 中文文檔

點擊查看中文文檔:SvelteKit 高級路由

系統學習 Svelte,歡迎入手小冊《Svelte 開發指南》。語法篇、實戰篇、原理篇三大篇章帶你系統掌握 Svelte!

此外我還寫過 JavaScript 系列、TypeScript 系列、React 系列、Next.js 系列、冴羽答讀者問等 14 個系列文章, 全系列文章目錄:https://github.com/mqyqingfeng/Blog

歡迎圍觀我的“網頁版朋友圈”、加入“冴羽·成長陪伴社群”,踏上“前端大佬成長之路”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73628.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu系統保姆級Paperless-ngx部署指南:零基礎實現文檔云端化管理

文章目錄 前言1.關于Paperless-ngx2.Docker部署3.簡單使用paperless4.安裝cpolar內網穿透5. 配置公網地址6. 配置固定公網地址總結 前言 在當今快節奏的辦公環境中&#xff0c;文檔管理成為了一個不可忽視的問題。想象一下這樣的場景&#xff1a;你需要一份重要的合同&#xf…

PostgREST實現DBaaS(數據庫即服務)

目錄 配置使用 驗證 token使用 上文部署高可用PostgreSQL14集群后&#xff0c;本文介紹PostgREST&#xff0c;以及如何基于PostgREST實現數據庫即服務&#xff0c;PostgREST可以在 PostgreSQL 數據庫上通過解析數據庫結構&#xff08;如表、視圖、存儲過程、權限等&#xff…

基于yolov11的鐵路軌道鐵軌缺陷檢測系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 基于YOLOv11的鐵路軌道鐵軌缺陷檢測系統是一種高效、準確的自動化檢測技術&#xff0c;專門用于識別和檢測鐵軌上的各種缺陷。該系統利用YOLOv11這一先進的深度學習模型&#xff0c;實現了對Corrugation&#xff08;波紋磨耗&#xff09;、Spalling&#xff08;剝…

WPF TemplateBinding與TemplatedParent區別

在 WPF 中&#xff0c;TemplateBinding 和 TemplatedParent 是兩種與控件模板&#xff08;ControlTemplate&#xff09;相關的綁定機制&#xff0c;它們都可以用來在控件模板中訪問控件的屬性。盡管它們的功能有些相似&#xff0c;但它們的行為和使用場景有一些重要的區別。 1.…

華為hcie證書考什么,怎么備考?

新盟教育 | 華為HALP授權培訓合作伙伴 在ICT領域&#xff0c;華為HCIE證書是含金量極高的專業認證&#xff0c;它是對個人技術能力和專業素養的高度認可。對于渴望在網絡、云計算、大數據等前沿領域深入發展的從業者而言&#xff0c;華為HCIE證書是一塊強有力的職業敲門磚。 …

【Git 暫存操作指南2】

Git 暫存操作指南 在日常的 Git 使用場景中&#xff0c;我們常常會遇到各種復雜的情況&#xff0c;需要巧妙運用 Git 的功能來實現高效開發與代碼管理。接下來&#xff0c;我們將深入探討一個具體的開發實例&#xff0c;以及如何通過暫存功能完美解決其中的問題。 一、開發場…

華為hcia——Datacom實驗指南——配置IPv4靜態路由,默認路由和浮動靜態路由

什么是IPv4 IPv4靜態路由&#xff0c;是手動配置的&#xff0c;不會隨著網絡拓撲的變化而變化&#xff0c;所配置的路由信息也不會在網絡中傳播&#xff0c;所以它主要運用在小型網絡或者作為動態路由的補充。 IPv4的配置 配置的命令很簡單 IP route-static &#xff08;目…

Linux一步部署主DNS服務器

? #!/bin/bash #部署DHCP服務 #userli 20250319if [ "$USER" ! "root" ]then echo"錯誤&#xff1a;非root用戶&#xff0c;權限不足&#xff01;"exit 0fi#防火墻與高級權限 systemctl stop firewalld && systemctl disable firewalld…

給AI裝“記憶U盤“:LangChain記憶持久化入門指南

&#x1f9e0; 什么是記憶持久化&#xff1f; 想象AI對話就像和朋友聊天&#xff1a; ?普通模式&#xff1a;每次重啟都忘記之前聊過什么?持久化模式&#xff1a;給AI配了個"記憶U盤"&#xff0c;聊天記錄永不丟失 核心組件三件套 #mermaid-svg-ORm8cbBXsaRy2sZ…

JumpServer:一款企業級開源堡壘機

在數字化運維時代&#xff0c;如何高效、安全地管控企業內部資產&#xff1f;JumpServer 作為一款完全開源的堡壘機&#xff0c;憑借其強大的 4A&#xff08;身份認證、授權控制、賬號管理、安全審計&#xff09;能力與靈活的架構設計&#xff0c;實現事前授權、事中監察、事后…

LangChain + PostgreSQL 實現向量數據庫與 RAG 搜索

1. 環境準備 安裝必要的庫 pip install langchain psycopg2-binary pgvector langchain-openai安裝并配置 PostgreSQL 安裝 PostgreSQL 確保 PostgreSQL 已正確安裝并運行。你可以根據操作系統的不同參考官方文檔進行安裝。 創建數據庫 創建一個新的數據庫&#xff08;例如 …

STM32硬件IIC與OLED使用

OLED屏幕介紹 OLED即有機發光管(Organic Light-Emitting Diode,OLED)。OLED顯示技術具有自發光、廣視角、幾乎無窮高的對比度、較低功耗、極高反應速度、可用于繞曲性面板、使用溫度范圍廣、構造及制程簡單等有點&#xff0c;被認為是下一代的平面顯示屏新興應用技術 OLED顯示…

idea自動生成注釋

idea 自動生成注釋 1 創建類時&#xff0c;自動生成注釋 模板代碼如下 /** * program: ${PROJECT_NAME} * * description: ${description} * * author: yun * * create: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} **/ 2 在方法上使用快捷鍵生成注釋 先新建一個…

doris:恢復

前提條件? 確保您擁有管理員權限以執行恢復操作。確保您有一個有效的備份快照可供恢復&#xff0c;請參考備份。 1. 獲取快照的備份時間戳? 以下 SQL 語句可用于查看名為example_repo的 Repository 中的現有備份。 mysql> SHOW SNAPSHOT ON example_repo; -----------…

可視化圖解算法:刪除有序(排序)鏈表中重復的元素-II

1. 題目 描述 給出一個升序排序的鏈表&#xff0c;刪除鏈表中的所有重復出現的元素&#xff0c;只保留原鏈表中只出現一次的元素。 例如&#xff1a; 給出的鏈表為1→2→3→3→4→4→5, 返回1→2→5. 給出的鏈表為1→1→1→2→3 返回2→3. 數據范圍&#xff1a;鏈表長度 0≤…

【leetcode刷題日記】lc.53-最大子數組和

目錄 1.題目 2.代碼 1.題目 給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 子數組是數組中的一個連續部分。 示例 1&#xff1a; 輸入&#xff1a;nums [-2,1,-3,4,-…

樹莓派超全系列文檔--(7)RaspberryOS播放音頻和視頻

播放音頻和視頻 播放音頻和視頻VLC 媒體播放器vlc GUIvlc CLI使用 cvlc 在沒有圖形用戶界面的情況下播放媒體 在 Raspberry Pi OS Lite 上播放音頻和視頻指定音頻輸出設備指定視頻輸出設備同時指定音頻和視頻輸出設備提高數據流播放性能 文章來源&#xff1a; http://raspberr…

算法250327題目

1114: 4006 AB問題 題目描述 給定兩個整數A和B&#xff0c;其表示形式是&#xff1a;從個位開始&#xff0c;每三位數用逗號,隔開。 現在請計算AB的結果&#xff0c;并以正常形式輸出。 輸入 輸入包含多組數據&#xff0c;每組數據占一行&#xff0c;由兩個整數A和B組成&am…

Wireshark學習

Wireshark簡介 抓包前 1.打開wireshark得到下面的界面 2.選擇菜單欄上捕獲-> 選項&#xff0c;勾選WLAN網卡&#xff08;這里需要根據各自電腦網卡使用情況選擇&#xff0c;簡單的辦法可以看使用的IP對應的網卡&#xff09;。點擊開始。啟動抓包。 3.wireshark啟動后&am…

[OS_4] 數學視角 | 多狀態 | 模型檢查器 | 程序驗證(math)

程序 狀態機 gdb 單步執行 狀態遷移 狀態里有什么&#xff1f;gdb 可以打印有一些特殊的狀態遷移 硬件 狀態機 指令執行 狀態遷移 從 CPU Reset 開始執行 FirmwareFirmware 加載操作系統 (程序) 操作系統 狀態機 (毫無疑問) 程序是一種真正意義上的 “數學嚴格” 的…