Svelte چیست؟ آموزش کامل و جامع Svelte
فهرست مطالب
Svelte چیست؟
Svelte یک فریمورک مدرن برای ساخت رابطهای کاربری است که برخلاف فریمورکهای دیگر مانند React یا Vue، در زمان کامپایل کد را بهینه میکند و نیازی به Virtual DOM ندارد.
<script>
let name = 'دنیا';
</script>
<h1>سلام {name}!</h1>
<style>
h1 {
color: #ff3e00;
}
</style>
تاریخچه Svelte
Svelte در سال 2016 توسط Rich Harris معرفی شد و نسخه 3 آن در سال 2019 منتشر شد که تغییرات اساسی در سینتکس و عملکرد آن ایجاد کرد.
ساختار پایه Svelte
هر فایل Svelte (.svelte) میتواند شامل سه بخش اصلی باشد:
<script>
// منطق و متغیرهای کامپوننت
let count = 0;
function increment() {
count += 1;
}
</script>
<!-- قالب HTML -->
<button on:click={increment}>
شمارنده: {count}
</button>
<style>
/* استایلهای مختص کامپوننت */
button {
background: #ff3e00;
color: white;
border: none;
padding: 8px 12px;
border-radius: 4px;
}
</style>
کامپوننتها در Svelte
کامپوننتها در Svelte واحدهای مستقل و قابل استفاده مجدد هستند که میتوانند شامل منطق، قالب و استایل باشند.
<!-- Button.svelte -->
<script>
export let text = 'کلیک کنید';
export let onClick = () => {};
</script>
<button on:click={onClick}>
{text}
</button>
<style>
button {
/* استایلهای دکمه */
}
</style>
<!-- App.svelte -->
<script>
import Button from './Button.svelte';
function handleClick() {
alert('دکمه کلیک شد!');
}
</script>
<Button text="ارسال" onClick={handleClick} />
واکنشپذیری در Svelte
یکی از قدرتمندترین ویژگیهای Svelte، سیستم واکنشپذیری ساده و کارآمد آن است. Svelte به طور خودکار تغییرات state را تشخیص میدهد و DOM را بهروزرسانی میکند.
<script>
let count = 0;
$: doubled = count * 2;
$: if (count >= 10) {
alert('مقدار از 10 بیشتر شد!');
}
function increment() {
count += 1;
}
</script>
<button on:click={increment}>
افزایش ({count})
</button>
<p>دو برابر: {doubled}</p>
مدیریت state در Svelte
Svelte روشهای مختلفی برای مدیریت state ارائه میدهد. از متغیرهای ساده گرفته تا stores پیچیدهتر.
<script>
import { writable } from 'svelte/store';
// متغیر ساده
let count = 0;
// store قابل نوشتن
const userStore = writable({
name: 'کاربر',
isLoggedIn: false
});
// اشتراک در تغییرات store
userStore.subscribe(value => {
console.log('تغییرات:', value);
});
function login() {
userStore.update(user => ({
...user,
isLoggedIn: true
}));
}
</script>
{#if $userStore.isLoggedIn}
<p>خوش آمدید، {$userStore.name}!</p>
{:else}
<button on:click={login}>ورود</button>
{/if}
چرخه حیات کامپوننتها
Svelte دارای توابع چرخه حیات است که به شما امکان میدهد در مراحل مختلف ایجاد و نابودی کامپوننت، کدهای خاصی را اجرا کنید.
<script>
import { onMount, onDestroy, beforeUpdate, afterUpdate } from 'svelte';
let data = [];
onMount(async () => {
// کامپوننت mount شد
const response = await fetch('https://api.example.com/data');
data = await response.json();
});
beforeUpdate(() => {
console.log('قبل از بهروزرسانی DOM');
});
afterUpdate(() => {
console.log('بعد از بهروزرسانی DOM');
});
onDestroy(() => {
// تمیزکاری قبل از حذف کامپوننت
console.log('کامپوننت در حال حذف است');
});
</script>
{#each data as item}
<div>{item.name}</div>
{/each}
مدیریت رویدادها
Svelte سیستم مدیریت رویداد قدرتمندی دارد که شامل رویدادهای DOM استاندارد و رویدادهای سفارشی میشود.
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
function handleClick(event) {
// ارسال رویداد سفارشی
dispatch('customClick', {
detail: 'اطلاعات اضافی'
});
}
function handleKeydown(event) {
if (event.key === 'Enter') {
console.log('کلید Enter فشرده شد');
}
}
</script>
<button
on:click={handleClick}
on:keydown={handleKeydown}>
کلیک کنید
</button>
<!-- در کامپوننت والد -->
<ChildComponent
on:customClick={(event) => {
console.log(event.detail);
}}
/>
Stores در Svelte
Stores در Svelte راهی برای مدیریت state در سطح برنامه و به اشتراکگذاری داده بین کامپوننتها هستند.
<script>
import { writable, readable, derived } from 'svelte/store';
// store قابل نوشتن
const count = writable(0);
// store فقط خواندنی
const time = readable(new Date(), set => {
const interval = setInterval(() => {
set(new Date());
}, 1000);
return () => clearInterval(interval);
});
// store مشتق شده
const elapsed = derived(time, $time => {
return Math.round(($time - new Date(0)) / 1000);
});
</script>
<button on:click={() => count.update(n => n + 1)}>
شمارنده: {$count}
</button>
<p>زمان فعلی: {$time.toLocaleTimeString()}</p>
<p>ثانیههای سپری شده: {$elapsed}</p>
انیمیشنها در Svelte
Svelte دارای سیستم انیمیشن داخلی قدرتمندی است که به شما امکان میدهد انیمیشنهای روان و کارآمد ایجاد کنید.
<script>
import { fade, fly, slide } from 'svelte/transition';
import { spring } from 'svelte/motion';
let visible = true;
const coords = spring({ x: 0, y: 0 }, {
stiffness: 0.2,
damping: 0.4
});
function handleMousemove(event) {
coords.set({ x: event.clientX, y: event.clientY });
}
</script>
<div on:mousemove={handleMousemove}>
{#if visible}
<div transition:fade>
فید این/اوت
</div>
{/if}
<div
style="transform: translate({$coords.x}px, {$coords.y}px)">
👆
</div>
</div>
بهترین شیوههای کدنویسی Svelte
برای نوشتن کد بهتر و کارآمدتر در Svelte، رعایت این اصول توصیه میشود:
۱. سازماندهی کامپوننتها
کامپوننتها را به بخشهای کوچکتر و قابل استفاده مجدد تقسیم کنید.
۲. مدیریت state
از stores برای مدیریت stateهای پیچیده و به اشتراکگذاری داده بین کامپوننتها استفاده کنید.
src/
├── components/
│ ├── common/
│ │ ├── Button.svelte
│ │ └── Input.svelte
│ └── features/
│ ├── UserProfile.svelte
│ └── Settings.svelte
├── stores/
│ ├── auth.js
│ └── theme.js
├── utils/
│ └── helpers.js
└── App.svelte
ابزارهای مفید برای کار با Svelte
۱. محیطهای توسعه
– VS Code با افزونه Svelte for VS Code
– WebStorm با پشتیبانی داخلی از Svelte
– Svelte Language Tools
۲. ابزارهای ساخت
– Vite
– Rollup
– SvelteKit (فریمورک کامل برای ساخت برنامهها)
# ایجاد پروژه جدید
npm create svelte@latest my-app
# نصب وابستگیها
cd my-app
npm install
# اجرای سرور توسعه
npm run dev
۳. کتابخانههای مفید
– Svelte Material UI
– Carbon Components Svelte
– Svelte Query
– Svelte Forms Lib
بهینهسازی SEO در Svelte
برای بهینهسازی SEO در برنامههای Svelte، میتوانید از SvelteKit استفاده کنید که SSR (Server-Side Rendering) را ارائه میدهد.
<script>
import { MetaTags } from 'svelte-meta-tags';
</script>
<MetaTags
title="عنوان صفحه | نام سایت"
description="توضیحات صفحه برای موتورهای جستجو"
openGraph={{
title: 'عنوان Open Graph',
description: 'توضیحات Open Graph',
images: [
{
url: 'https://example.com/og-image.jpg',
width: 800,
height: 600,
alt: 'توضیح تصویر'
}
]
}}
/>
استقرار برنامههای Svelte
برنامههای Svelte را میتوان در پلتفرمهای مختلفی مستقر کرد:
# ساخت برنامه
npm run build
# پیشنمایش نسخه ساخته شده
npm run preview
# استقرار در Vercel
vercel deploy
پلتفرمهای استقرار
– Vercel
– Netlify
– Cloudflare Pages
– Digital Ocean
– سرورهای شخصی
تستنویسی در Svelte
تستنویسی یک بخش مهم از توسعه برنامههای Svelte است. میتوانید از ابزارهای مختلفی برای تست استفاده کنید:
import { render, fireEvent } from '@testing-library/svelte';
import Counter from './Counter.svelte';
test('باید مقدار شمارنده را افزایش دهد', async () => {
const { getByText } = render(Counter);
const button = getByText('افزایش');
await fireEvent.click(button);
expect(getByText('1')).toBeInTheDocument();
});
ابزارهای تست
– Jest
– Testing Library
– Vitest
– Playwright برای تستهای E2E