ارائه رونز

در سال 2019، Svelte 3 جاوا اسکریپت را به یک زبان واکنشی تبدیل کرد. Svelte یک چارچوب وب UI است که از یک کامپایلر برای تبدیل کد جزء اعلامی مانند این استفاده می کند.
… در جاوا اسکریپت کاملاً بهینه شده که سند را زمانی که شرایط مشابه است به روز می کند count تغییر می کند. زیرا کامپایلر می تواند کجا را ببیند count ارجاع شده است، کد تولید شده بسیار کارآمد است و از آنجایی که ما سینتکس مانند را هک می کنیم let و = به جای استفاده از API های دست و پا گیر، می توانید کد کمتری بنویسید.
یک بازخورد معمولی که دریافت می کنیم این است که “کاش می توانستم تمام جاوا اسکریپت خود را اینگونه بنویسم”. زمانی که به بهروزرسانی جادویی چیزهای درون کامپوننتها عادت کردهاید، بازگشت به کد رویهای قدیمی خستهکننده، مانند رفتن از رنگ به سیاه و سفید است.
Svelte 5 همه اینها را با رونز، که باز می شود واکنش پذیری همه کاره و ظریف.
قبل از اینکه شروع کنیم
اگرچه ما در حال تغییر روش کار زیر کاپوت هستیم، Svelte 5 باید جایگزینی ضروری برای تقریباً همه باشد. ویژگیهای جدید اختیاری هستند – اجزای موجود شما به کار خود ادامه خواهند داد.
ما هنوز تاریخی برای انتشار Svelte 5 نداریم. آنچه در اینجا به شما نشان می دهیم، کاری در حال انجام است که احتمالاً تغییر خواهد کرد!
رون ها چیست؟
رون /ro͞on/ اسم
حرف یا علامتی که به عنوان نماد عرفانی یا جادویی استفاده می شود.
Runes نمادهایی هستند که بر کامپایلر Svelte تأثیر می گذارند. در حالی که امروزه Svelte استفاده می کند let، =، در export کلمه کلیدی و $: برچسب برای نشان دادن چیزهای خاص، استفاده از رون ها نحو تابع برای رسیدن به همان چیزها و بیشتر.
به عنوان مثال، برای اعلام یک قطعه حالت واکنشی، می توانیم استفاده کنیم $state رونه:
در نگاه اول، این ممکن است یک گام به عقب به نظر برسد – شاید حتی نه شیک مانند. بهتر نیست اگر let count به طور پیش فرض واکنشی است؟
خوب، نه. واقعیت این است که با پیچیدهتر شدن برنامهها، تشخیص اینکه کدام مقادیر واکنشپذیر هستند و کدامها نیستند، میتواند دشوار شود. و اکتشافی فقط برای let اعلانات در سطح بالای یک جزء، که می تواند باعث سردرگمی شود. وجود کد به یک صورت در داخل نگهداری می شود .svelte فایل ها و دیگری داخل .js میتواند بازسازی کد را دشوار کند، برای مثال اگر نیاز دارید چیزی را به فروشگاه تبدیل کنید تا بتوانید از آن در مکانهای مختلف استفاده کنید.
فراتر از اجزاء
با رون ها، واکنش پذیری فراتر از مرزهای خود شما گسترش می یابد .svelte فایل ها فرض کنید میخواهیم منطق شمارنده خود را به گونهای کپسوله کنیم که بتوان آن را دوباره بین اجزاء استفاده کرد. امروز شما از a استفاده می کنید فروشگاه سفارشی در یک .js یا .ts فایل:
شمارنده
import { writable
همانطور که این اعمال می شود قرارداد مغازه – مقدار بازگشتی دارای a است subscribe روش – میتوانیم با پیشوند نام فروشگاه به مقدار فروشگاه ارجاع دهیم $:
این کار می کند، اما بسیار عجیب است! ما متوجه شدهایم که وقتی شروع به انجام کارهای پیچیدهتر میکنید، API فروشگاه میتواند بسیار بدتر شود.
با رونز، همه چیز بسیار ساده تر می شود:
counter.svelte
import { writable } from 'svelte/store';
export function createCounter() {
const { subscribe, update } = writable(0);
let count = $state(0);
return {
subscribe,
increment: () => update((n) => n + 1)
get count() { return count },
increment: () => count += 1
};
}
بیرون
.svelteمولفه ها، رون ها را فقط می توان در آنها استفاده کرد.svelte.jsو.svelte.tsماژول ها
توجه داشته باشید که ما از یک ویژگی get در شیء برگشتی استفاده می کنیم، بنابراین counter.count همیشه به مقدار فعلی اشاره دارد، نه مقدار در زمان فراخوانی تابع.
واکنش پذیری در زمان اجرا
امروزه Svelte استفاده می کند واکنش پذیری زمان کامپایل. این بدان معناست که اگر کدی دارید که استفاده می کند $: برچسبی برای راه اندازی مجدد خودکار زمانی که وابستگی ها تغییر می کنند، این وابستگی ها زمانی تعریف می شوند که Svelte جزء شما را کامپایل می کند:
script>
export let width;
export let height;
$: area = width * height;
$: console.log(area);
script>
این خوب کار می کند … تا زمانی که این کار را نمی کند. فرض کنید ما کد بالا را مجدداً تنظیم کردیم:
const multiplyByHeight = (width) => width * height;
$: area = multiplyByHeight(width);
از آنجایی که $: area = ... اعلامیه فقط می تواند “دیدن” width، چه زمانی دوباره محاسبه نمی شود height تغییر می کند. در نتیجه، بازسازی کد دشوار است و درک پیچیدگیهای زمانی که Svelte تصمیم میگیرد بهروزرسانی چه مقادیری میتواند فراتر از سطح معینی از پیچیدگی بسیار پیچیده شود.
Svelte 5 ارائه می دهد $derived و $effect رون هایی که در عوض وابستگی عبارات خود را هنگام ارزیابی مشخص می کنند:
script>
let { width, height } = $props();
const area = $derived(width * height);
$effect(() => {
console.log(area);
});
script>
همانطور که در $state، $derived و $effect همچنین می تواند در مال شما استفاده شود .js و .ts فایل ها
تقویت سیگنال
مانند هر چارچوب دیگری، ما به این موضوع رسیدیم ناک اوت در تمام طول بازی دقیق بود.
واکنش پذیری Svelte 5 توسط سیگنال هاکه اساساً همان کاری است که ناکآوت در سال 2010 انجام میداد. اخیراً، سیگنالها توسط Solid رایج شدهاند و توسط فریمورکهای متعدد دیگری به کار گرفته شدهاند.
با این حال، ما کارها را کمی متفاوت انجام می دهیم. در Svelte 5، هشدارها بیشتر جزییات پیادهسازی زیربنایی هستند تا چیزی که مستقیماً با آن تعامل دارید. این بدان معناست که ما محدودیتهای طراحی API یکسانی نداریم و میتوانیم عملکرد هر دو را به حداکثر برسانیم و ارگونومی به عنوان مثال، ما از مشکلات باریک شدن نوع که هنگام دسترسی به مقادیر از طریق فراخوانی تابع رخ می دهد، جلوگیری می کنیم، و هنگام کامپایل در حالت رندر سمت سرور، می توانیم به طور کلی از سیگنال ها صرف نظر کنیم، زیرا در سرور آنها چیزی جز سربار نیستند.
قفل هشدارها را باز کنید واکنش ریز دانه، به این معنی که (برای مثال) تغییرات مقدار در یک لیست بزرگ لازم نیست همه آنها را باطل کند دیگری اعضای لیست در نتیجه، Svelte 5 فوق العاده سریع است.
زمان های ساده تر در پیش است
Runes یک ویژگی اضافی است، اما آنها یک دسته کامل از مفاهیم موجود را منسوخ می کنند:
- تفاوت بین
letدر سطح بالای یک جزء و در هر جای دیگری export let$:، با تمام خصلت های همراهش- رفتار متفاوت بین
and $$propsand$$restProps- lifecycle functions (things like
afterUpdatecan just be$effectfunctions) - the store API and
$store prefix (while stores are no longer necessary, they are not being deprecated)
Try it!
You can’t use Svelte 5 in production yet. We’re in the thick of it at the moment and can’t tell you when it’ll be ready to use in your apps. But we didn’t want to leave you hanging. We’ve created a preview site with detailed explanations of the new features and an interactive playground. You can also visit the#svelte-5-runes channel of the Svelte Discord to learn more. We’d love to have your feedback!
Source link



