百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

今年最火开源前端框架——Svelte 5正式发布稳定版、彻底重写、新增$语法 、star数近8万

ccwgpt 2024-11-12 09:45 14 浏览 0 评论

OSCHINA


经过近 18 个月的开发,数十名贡献者提交了数千次代码,Svelte 5 终于发布了稳定版,这是该项目历史上最重要的版本。

Svelte 是一款类似 React、Vue 的前端 UI 框架。

如名字所言, Svelte 的体积非常小,其作者 Rich Harris 表示,他设计 Svelte 的核心思想在于“通过静态编译减少框架运行时的代码量”。

Svelte 5 是一次彻底的重写:开发的应用将变得更快、更小、更可靠同时将能够编写更一致、更符合语法习惯的代码。对于框架的新手来说,需要学习的东西更少。

值得关注的是,Svelte 几乎完全向后兼容 Svelte 4,也就是说初始升级将完全无缝:

Svelt 官方介绍,随着越来越多的人使用 Svelte 构建更多、更大的应用程序,最初的一些设计决策的局限性开始变得更加明显。

例如,在 Svelte 4 中,响应性完全由编译器驱动。如果在 Svelte 4 中更改响应对象的单个属性,则整个对象将失效,因为这是编译器实际能做的全部。

与此同时,其它框架采用了基于信号的细粒度响应性,超越了 Svelte 的性能。

同样,Svelte 4 中的组件组合也比较尴尬,主要是因为它将事件处理程序和“插槽内容” (slotted content) 视为独立的概念,与传递给组件的 props 不同。

这是因为在 2019 年,Web 组件似乎很有可能成为组件的主要分发机制,而 Svelte 希望与平台保持一致。现在看,这其实是一个错误选择。

虽然 $ 的构造响应式重新运行语句是一个巧妙的技巧,但结果却是徒劳无功。它混淆了两个本应分开的概念(派生状态和副作用),而且由于依赖关系是在语句编译时而不是运行时确定的,因此它无法重构,搞得越来越复杂。

Svelte 5 消除了这些不一致和麻烦。它引入了 runes,这是一种显式机制,用于声明响应式状态(当然它还有其它作用):

与状态的交互没有改变:与其它框架不同,count 只是一个数字,而不是一个函数,或者具有值属性的对象,或者只能通过相应的 setCount 来更改的东西。

function increment() {
count += 1;
console.log({ count });
}

runes 可以在 .svelte.js 和 .svelte.ts 模块中使用,除了 .svelte 组件,这意味着可以使用单一机制创建可重用的响应式逻辑。

事件处理程序现在就像其它属性一样,比如可以很容易知道组件用户是否提供了特定的事件处理程序(这对于避免昂贵的设置工作非常有用),或者将任意事件处理程序传播到某个元素上,这些对库作者尤其重要。

用于在组件之间传递内容的插槽机制,以及令人困惑的 let: 和 <svelte:fragment> 语法,已被 {#snippet …} 替代,这是一个更强大的工具。

除了这些变化,还有无数改进:原生 TypeScript 支持(不再需要预处理器!)、许多错误修复,以及整体性能和可扩展性的提升。

此外,随着 Svelte 的新版本发布,也推出了新的命令行界面 (CLI),sv。而利用新的 Svelte 5 特性的 SvelteKit,也在计划中了。
详情查看官方公告:https://svelte.dev/blog/svelte-5-is-alive

最后看看 Svelte 5 重要的语法更新:
Runes - 符文
本次最重要的更新,当 Runes 莫属,这是关于变量定义和效果管理的内容。

Svelte v4 的响应式写法:

<script>
let count = 0;
</script>

<button onclick={() => count++}>
clicks: {count}
</button>
Svelte v5 的响应式写法:
<script>
let count = $state(0);
</script>

<button onclick={() => count++}>
clicks: {count}
</button>
哈哈,是不是新语法有一种 Vue 的既视感?
正所谓,万法归一,殊途同归。
那么不仅如此,类似这样的语法,大概有这么些:

? $state

? $state.raw

? $state.snapshot

? $derived

? $derived.by

? $effect

? $effect.pre

? $effect.tracking

? $effect.root

? $props

? $bindable

? $inspect

? $host

这不禁让我回想起了 10 年前写 PHP 的时候,满屏幕的 $ 的日子。。。

不过还是那句话,习惯就好,我喜欢新语法,喜欢 $
Snippets - 片段
片段的主要作用,就是让你少写重复代码。
笔者看到这个,只感觉两行感动的热泪流了下来 ??。
Vue 中的类似功能是这样的:
<script setup>import{ createReusableTemplate } from '@vueuse/core'; const[DefineTemplate,ReuseTemplate]= createReusableTemplate();</script>
<template>
<DefineTemplate>
<!-- something complex --></DefineTemplate>
<dialogv-if="showInDialog">
<ReuseTemplate/></dialog>
<divv-else>
<ReuseTemplate/></div>
</template>
Svelte v4 的写法:
{#each images as image}
{# if image.href}
<a href={image.href}>
<figure>
<img
src={image.src}
alt={image.caption}
width={image.width}
height={image.height}
/>

<figcaption>{image.caption}</figcaption>
</figure>
</a>
{:else}
<figure>
<img
src={image.src}
alt={image.caption}
width={image.width}
height={image.height}
/>

<figcaption>{image.caption}</figcaption>
</figure>
{/if}
{/each}
Svelte v5 的写法:
{#snippet figure(image)}
<figure>
<img
src={image.src}
alt={image.caption}
width={image.width}
height={image.height}
/>

<figcaption>{image.caption}</figcaption>
</figure> {
/snippet}

{#each images as image}
{#if image.href}

<a href={image.href}>
{@renderfigure(image)}
</a>
{:else}
{@renderfigure(image)}
{/if}
{/each}
代码是人在写,人在看,电脑只是执行一串二进制。
写法上的提升,对于编程体验的影响是非常大的,代码应该优先服务于人,其次才服务于机器。
这种编程体验的改变,不亚于钓鱼佬钓到一条重达 2 两的大鲫鱼的快感。
Event handlers - 事件处理
Svelte v4 单事件的写法
<script>
let count = $state(0);
</script>

<button on:click={() => count++}>
clicks: {count}
</button>
Svelte v5 单事件的写法
<script>
let count = $state(0);
</script>

<button onclick={() => count++}>
clicks: {count}
</button>
Svelte v4 多事件的写法
<button on:click={one} on:click={two}>
...
</button>
Svelte v5 多事件的写法
<button
onclick={(e) =>
{
one(e);
two(e);
}}
>
...
</button>
Svelte v4 事件修饰符的写法
<button on:click|once|preventDefault={handler}>...</button>
Svelte v5 事件修饰符的写法
<script>
functiononce(fn){
returnfunction(event){
if(fn) fn.call(this, event);
fn =;
};
}

functionpreventDefault(fn){
returnfunction(event){
event.preventDefault();
fn.call(this, event);
};
}
</script>

<button onclick = {
once(preventDefault(handler))
} >
... < /button>
事件上面的写法,给我的感觉就是,返璞归真了。
说实话,我喜欢原来的写法。
Imports - 导入
flushSync
<script>
import {
flushSync
}from 'svelte';

let count = $state(0);
let element;

functiononclick(){
flushSync(() =>(count +=1));

// without `flushSync`, the DOM would be updated in the future
console.log(element.textContent===String(count));
}
</script>

<span bind: this = {element}>{count}</span>
<button {onclick}>update</button>
mount
import {
mount
} from 'svelte';
importAppfrom './App.svelte';

const app = mount(App, {
target: document.querySelector('#app'),
props: {some: 'property'}
});
hydrate
import {
hydrate
} from 'svelte';
importAppfrom './App.svelte';

const app = hydrate(App, {
target: document.querySelector('#app'),
props: {some: 'property'}
});


本文部分内容来自「陈随易」公众号,已获授权转载。

1年272个版本后,Svelte v5终于发布了


相关来源

https://svelte.dev/blog/svelte-5-is-alive

https://mp.weixin.qq.com/s/J0fnK5ufOvH9_wyZUPPJ7Q





END







相关推荐

迈向群体智能 | 智源发布首个跨本体具身大小脑协作框架

允中发自凹非寺量子位|公众号QbitAI3月29日,智源研究院在2025中关村论坛“未来人工智能先锋论坛”上发布首个跨本体具身大小脑协作框架RoboOS与开源具身大脑RoboBrain,可实...

大模型对接微信个人号,极空间部署AstrBot机器人,万事不求百度

「亲爱的粉丝朋友们好啊!今天熊猫又来介绍好玩有趣的Docker项目了,喜欢的记得点个关注哦!」引言前两天熊猫发过一篇关于如何在极空间部署AstrBot并对接QQ消息平台的文章,不过其实QQ现在已经很少...

Seata,让分布式事务不再是难题!实战分享带你领略Seata的魅力!

终身学习、乐于分享、共同成长!前言Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的...

常见分布式事务解决方案(分布式事务解决的问题)

1.两阶段提交(2PC)原理:分为准备阶段(协调者询问参与者是否可提交)和提交阶段(协调者根据参与者反馈决定提交或回滚)。优点:强一致性,适用于数据库层(如XA协议)。缺点:同步阻塞:所有参与者阻塞...

分布式事务:从崩溃到高可用,程序员必须掌握的实战方案!

“支付成功,但订单状态未更新!”、“库存扣减后,交易却回滚了!”——如果你在分布式系统中踩过这些“天坑”,这篇文章就是你的救命稻草!本文将手把手拆解分布式事务的核心痛点和6大主流解决方案,用代码实战+...

谈谈对分布式事务的一点理解和解决方案

分布式事务首先,做系统拆分的时候几乎都会遇到分布式事务的问题,一个仿真的案例如下:项目初期,由于用户体量不大,订单模块和钱包模块共库共应用(大war包时代),模块调用可以简化为本地事务操作,这样做只要...

一篇教你通过Seata解决分布式事务问题

1 Seata介绍Seata是由阿里中间件团队发起的开源分布式事务框架项目,依赖支持本地ACID事务的关系型数据库,可以高效并且对业务0侵入的方式解决微服务场景下面临的分布式事务问题,目前提供AT...

Seata分布式事务详解(原理流程及4种模式)

Seata分布式事务是SpringCloudAlibaba的核心组件,也是构建分布式的基石,下面我就全面来详解Seata@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合...

分布式事务最终一致性解决方案有哪些?MQ、TCC、saga如何实现?

JTA方案适用于单体架构多数据源时实现分布式事务,但对于微服务间的分布式事务就无能为力了,我们需要使用其他的方案实现分布式事务。1、本地消息表本地消息表的核心思想是将分布式事务拆分成本地事务进行处理...

彻底掌握分布式事务2PC、3PC模型(分布式事务视频教程)

原文:https://mp.weixin.qq.com/s/_zhntxv07GEz9ktAKuj70Q作者:马龙台工作中使用最多的是本地事务,但是在对单一项目拆分为SOA、微服务之后,就会牵扯出分...

Seata分布式事务框架关于Annotation的SAGA模式分析

SAGAAnnotation是ApacheSeata版本2.3.0中引入的功能,它提供了一种使用Java注解而不是传统的JSON配置或编程API来实现SAGA事务模式的声明...

分布式事务,原理简单,写起来全是坑

今天我们就一起来看下另一种模式,XA模式!其实我觉得seata中的四种不同的分布式事务模式,学完AT、TCC以及XA就够了,Saga不好玩,而且长事务本身就有很多问题,也不推荐使用。S...

内存空间节约利器redis的bitmap(位图)应用场景有哪些你知道吗

在前面我们分享过一次Redis常用数据结构和使用场景,文章对Redis基本使用做了一个简单的API说明,但是对于其中String类型中的bitmap(位图)我们需要重点说明一下,因为他的作用真的不容忽...

分布式事务原理详解(图文全面总结)

分布式事务是非常核心的分布式系统,也是大厂经常考察对象,下面我就重点详解分布式事务及原理实现@mikechen本文作者:陈睿|mikechen文章来源:mikechen.cc分布式事务分布式事务指的是...

大家平时天天说的分布式系统到底是什么东西?

目录从单块系统说起团队越来越大,业务越来越复杂分布式出现:庞大系统分而治之分布式系统所带来的技术问题一句话总结:什么是分布式系统设计和开发经验补充说明:中间件系统及大数据系统前言现在有很多Java技术...

取消回复欢迎 发表评论: