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

Svelte 使用心得:在个人项目表现不错,但在大型项目中仍有待观察

itomcoil 2025-02-21 13:38 15 浏览

作者 | Ty Hopp

译者 | 核子可乐

策划 | Tina

作者用了 1 个月时间开发了一款个人 RSS 阅读器,并选择了 Svelte 和 SvelteKit 作为 Web 客户端的工具。这个选择的主要目的是为了评估这些工具是否适合在大型项目中使用。作者发文分享了对于 Svelte 的一些思考,这篇文章引起了 Hacker News 上读者的关注,并且被顶到了首页。fenomas 和 illilarian 这两位用户谈到了他们对于过渡和动画 API 的看法。如果需要在 Svelte 管理的元素进入和离开 DOM 时对其进行动画处理,那么作者“吐槽”的这些 API 就非常有用。看来作者之前的抱怨不成立了。如果是你,你会把 Svelte 用到大型公开项目中吗?


以下是这篇“吐槽”原文,由 InfoQ 翻译。




过去一个月来,我开发了一款个人 RSS 阅读器。


在 Web 客户端这边,我选的是 Svelte 和 SvelteKit,主要是为了评估这些工具适不适合在大型项目里使用。


下面跟大家聊聊我自己对于 Svelte 的一点思考。


开篇总结


总的来说,我挺喜欢 Svelte 的使用体验。它的亮点在组件格式、内置 store 和事件调度程度 API。

短板主要是响应式语句($)、await 块和内置的过渡与动画 API。


组件格式


Svelte 的组件格式最得我心。在编写.svelte 文件时,默认上下文跟浏览器是完全相同的,都是用 HTML。


以下片段来自 Svelte 文档(包括示例标记、JS 和 CSS),应该可以说明问题:




1 + 2 is: {add(1, 2)}

复制代码


再来跟 React 对比一下,这里的默认上下文是 JavaScript,而 HTML 要通过 JSX 进行交错:


import '../some-styles.css'; // styles are imported into JS files
export function SomeComponent() {
  // logic can go anywhere
  function add(a, b) {
    return a + b;
  }
  // markup is returned from JS functions
  return 

{`1 + 2 is: ${add(1, 2)}`}

; }

复制代码


我没法斩钉截铁地告诉大家,这种方式就一定更好,比如“Svelte 的组件格式能让团队在构建组件时,比某某框架快多少倍。”这个我确实不敢说。


但我觉得组件格式确实是很多朋友喜爱 Svelte 的原因。这可能是因为浏览器也优先使用 HTML,所以用 Svelte 的话上下文切换较少,但我不确定是不是这样。总之,我个人非常喜欢。


内置 store


Svelte 为状态管理提供内置的 store 选项。


其实大家对于用户界面库/框架应该关注什么、没必要关注还有争议。而 Svelte 聪明的地方,就在于它承认状态管理可能会成为问题,而且提供了相应的解决方案。大家可以根据需要使用或者扩展。


更贴心的是,这个解决方案不像 React 上下文那样跟组件树紧密相关。


事件调度程序 API


Svelte 提供一个内置 API 可用于创建、分派和在父元素上侦听 CustomEvent。


在基于单向数据流概念构建的系统中,其实很难为 Web 事件建模。从本质上讲,Web 的事件模型会让数据向上流动。


Svelte 承认用户可能需要向树结构的上方发送数据,并提供一个使用 Web 平台原语的 API。我必须给它点个赞!


响应式语句


我发现 Svelte 的响应式语句有点让人摸不着头脑。


Svelte 的基本响应基于变量分配。通过文档中的以下示例,我已经弄明白了:


复制代码


这个很合理。


但接下来在引入响应式 $标签时,文档给出了以下示例:


复制代码


考虑到这是文档里关于该主题的第一个示例,似乎显得太复杂了。但只要认真看下来,还是能理解其中逻辑的。


但 Svelte 文档又提到:


请务必注意,响应块在统计时会通过简单的静态分析进行排序,所有编译器查看的都是分配给块本身、并在块内部使用的变量,而不在它们调用的任何函数当中。这意味着以下示例中,yDependent 不会随着 x 的更新而一同更新:


复制代码


这种“玄学”般的设计,让我在很多情况下都想不明白为什么组件无法更新。


最终我发现,确实很难明确认定 $ 标签是否起效。有时候我用起来一切正常,但有时候用起来就没有效果,非常诡异。


所以我决定离它远点。另一个类似的问题是访问 store 值,它跟 $ 的情况差不多,时灵时不灵。


正是 $ 标签阻止了我在大型项目中使用 Svelte。这是 Svelte 的核心部分,不可能彻底回避,而且我觉得由此引发错误的可能性很高、而且影响范围很大。


Await 块


Svelte 提供{#if ...} 和 {#each ...} 语法作为标记渲染的主要控制流方法。它还提供{#await ...},可以根据 Promise 的状态来决定渲染什么。


我喜欢这个设计思路,但在实践中总是以重构告终。在 Promise 被解决或拒绝之后,我总得再调整一下才能开始渲染,所以我可不打算每次运行服务时都用它。


而且该逻辑也不属于渲染代码中的内联。那它到底是怎么工作的?


把{#await ...}剔出来并放进

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...