iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
Modern Web

Svelte 的奇妙冒險系列 第 2

[Svelte 的奇妙冒險] Day 02 - 快速入門 Svelte 5

  • 分享至 

  • xImage
  •  

.svelte 檔案簡介

基本上每個 .svelte 檔就是一個 component ,就是跟 Vue 一樣的 SFC (Single File Component) 的形式,也就是說在一個檔案裡就已經分出幾個區塊來描述一個 component ,主要分為 script 、 markup 、 style 三大區塊。

簡單來說就是 JS/TS 寫在 <script></script> 裡面, HTML 的 tag 以及一些 template 語法寫在 markup ,而樣式部分則是寫在 <style></style> 裡。

<script>
	let name = 'world';
</script>

<h1 class='title'>
	Hello {name}!
</h1>

<style>
	.title {
		color: red
	}
</style>

可以利用這個線上 REPL 來試玩一下

而 markup 部分不用像 Vue 一樣特別寫出 <template> 也就是除了 <script><style> 以外的部分都算是 markup。

那這三個部分的寫法就很像我們平常在寫 .js.html.css 一樣,而且更加方便我在 markup 裡寫了 class='title' 然後我就可以在同一個檔案寫他的 css 樣式 .title {}

建立 Svelte 專案

請先確保安裝已經 node.js 了,目前我是用 v20.10.0 但應該只要是 LTS 版本都可以使用,接下來就來建立一個 svelte 5 專案

npm create svelte@latest

本系列文都會是以 TypeScript 作為開發的語言所以這邊我選擇用 TypeScript,而 additional options 比較重要的是一定要選 Try the Svelte 5 preview (unstable!) 這個選項。
https://ithelp.ithome.com.tw/upload/images/20240916/20159893ixlvviLpZE.png

接著按照 cli 指示安裝 dependency

cd FOLDER_NAME
pnpm install #可以按照讀者習慣改為 npm 或 yarn

接下來就讓我們來啟動專案吧

pnpm run dev #可以按照讀者習慣改為 npm 或 yarn

https://ithelp.ithome.com.tw/upload/images/20240916/20159893UFOawB1BHw.png
image.png

打開 localhost:5173 後出現以下畫面就表示成功了!

https://ithelp.ithome.com.tw/upload/images/20240916/201598933lVR7qrCEB.png

簡單來看一下專案的資料夾

.
├── src
│   ├── lib
│   │   └── index.ts
│   ├── routes
│   │   └── +page.svelte
│   ├── app.d.ts
│   ├── app.html
│   └── index.test.ts
├── tests
│   └── test.ts
├── .gitignore
├── .npmrc
├── .prettierignore
├── .prettierrc
├── README.md
├── eslint.config.js
├── package.json
├── playwright.config.ts
├── svelte.config.js
├── tsconfig.json
└── vite.config.ts

會發現這其實是一個 SvelteKit 的專案,這是因為不論 SSR 或 CSR 的專案,Svelte 官方都是以 SvelteKit 做為預設框架,當然如果只是單純的 SPA 也是可以跟其他框架一樣使用 vite 或者 webpack 建立開發環境,這相關的比較及說明讓我們留待之後 SvelteKit 的章節再來好好討論。

那現在我們只需要先關注 routes/+page.svelte 這個檔案即可,打開檔案後會發現它就是我們打開網頁後所顯示的內容。

<h1>Welcome to SvelteKit</h1>
<p>Visit <a href="https://kit.svelte.dev">kit.svelte.dev</a> to read the documentation</p>

+page.svelte 是 SvelteKit 的 route 命名規範,總之我們現在只要知道 +page.svelte 就是會產生一個頁面就好了。

那我們來稍微改寫一下這個檔案

<script lang="ts">
	const name = 'Todd';

	const handleClick = (name: string) => {
		console.log(`Hello, ${name}!`);
	};
</script>

<h1 id="title">Hi, <span class="name">{name}</span>! Welcome to SvelteKit</h1>
<p>Visit <a href="https://kit.svelte.dev">kit.svelte.dev</a> to read the documentation</p>

<button onclick={() => handleClick(name)}>Click me</button>

<style lang="scss">
	:global(body) {
		background-color: black;
	}
  
	#title {
		font-weight: 600;
		color: white;
  
      .name {
    		color: cadetblue;
    	}
	}


	p {
		color: #ddd;
	}
</style>

會發現 <script> 多了 lang="ts" 這是用來表示我們這個 script 區塊是要用 TypeScript 進行撰寫,有了這個 property 後我們就可以在這裡像一般 .ts 檔案一樣使用 TypeScript 的語法了。

以及 <style lang="scss"> ,沒錯,我們可以直接在 .svelte 裡使用 scss 或其他 css preprocessor ,值得一提的是 .svelte<style> 預設情況下是只會影響到這個檔案,所以就算其他檔案中也有叫做 .name 或者 #title 也不會受這個檔案的 <style> 影響。

如果要使用 scss 請先確保有安裝 sass-embedded 這個 dependency

那如果硬要跳脫這限制的話就可以使用 :global 所以 :global(body) 也就是代表可以覆蓋到整個專案的 body 的樣式。

至於 markup 部分就跟我們在寫 HTML 類似,像是使用 class=""id="" ,但比較不一樣的是我們可以使用 {} 來執行 expression 以及在 event 的部分這邊也是類似 React 一樣可以直接傳入一個 function 做為 props。

如果是有使用過 v4 的讀者應該會發現這裡是 onclick 而不是 on:click ,這是因為 v5 將這個element directives 給 deprecated 。至於為什麼這麼做可以參考目前 Svelte preview 文件 。我自己是覺得這個改動有好有壞因為這也代表之後不能使用 on:click|modifiers 這種形式,但好處是跟其他框架的寫法接近一致了以及讓 custom event 變得很精簡。

VS Code 設定

因為我主要是使用 VS Code 作為主要的編輯器所以這邊就只推薦 VS Code 的一些相關設定,插件基本上必裝的只有 Svelte for VS Code 提供語法 highlight 跟一些語法自動補全的功能,至於如果發現 ESlint 在svelte 沒有動作的話可以到 User Settings 找以下設定,看是否有包含 "svelte"

{
   "eslint.validate": [
    "svelte",
    "javascript",
    "typescript",
    "javascriptreact",
    "typescriptreact"
  ],
}

然後也推薦新增這個設定會讓 SvelteKit 的開發體驗上升一點

"workbench.editor.customLabels.patterns": {
    "**/routes/**/+page.ts": "${dirname}/+page.ts",
    "**/routes/**/+page.svelte": "${dirname}/+page.svelte",
    "**/routes/**/+page.server.ts": "${dirname}/+page.server.ts",
    "**/routes/**/+layout.ts": "${dirname}/+layout.ts",
    "**/routes/**/+layout.svelte": "${dirname}/+layout.svelte",
    "**/routes/**/+layout.server.ts": "${dirname}/+layout.server.ts",
  }

作用是讓符合 pattern 的檔案可以在 tab 上多顯示資料夾名稱,否則會在 tab 上看到一堆 +page.svelte 之類的檔案。

https://ithelp.ithome.com.tw/upload/images/20240916/20159893wny5c13QbB.png

這個設定是參考這則推文所寫的

參考資料

  1. https://svelte.dev/docs/svelte-components

  2. https://developer.mozilla.org/zh-TW/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_getting_started

  3. https://svelte.dev/docs/element-directives

  4. https://svelte-5-preview.vercel.app/docs/event-handlers#why-the-change

  5. https://x.com/asidorenko_/status/1826663841708585221

source code

https://github.com/toddLiao469469/30days-for-svelte5/blob/main/src/routes/%2Bpage.svelte


上一篇
[Svelte 的奇妙冒險] Day 01 - 前言
下一篇
[Svelte 的奇妙冒險] Day 03 - Logic blocks
系列文
Svelte 的奇妙冒險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言