【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

InfoQ 访谈:前端框架 Svelte 3 将反应性移入 JavaScript 语言

  • 2019-05-18
  • 本文字数:3386 字

    阅读完需:约 11 分钟

InfoQ访谈:前端框架Svelte 3将反应性移入JavaScript语言

Svelte 前端框架最近发布了Svelte 3。Svelte 3 引入了一种新的方法来声明式地表示用户界面实现中涉及的不变量连接实体。因此,开发人员可能不再需要出于性能的考虑而手动处理重新渲染,或者手动同步相关的状态片段。Svelte 3 有新的 Logo、口号和网站。Sapper(基于 Svelte 类似 Next.js 的应用程序框架) 和Svelte Native(面向移动应用程序开发)正在升级到 Svelte 3。InfoQ 采访了 Svelte 的创建者 Rich Harris,并讨论了 Svelte 3 的意义及其对开发人员的影响。


Svelte 3 是 Svelte 前端框架最新的主要迭代。Rich Harris介绍了 Svelte 3 的目标:


版本 3 是一个重大的变革。在过去的 5 到 6 个月中,我们一直致力于提供出色的开发体验。现在,你编写组件*所需的样本代码比其他框架都要少很多了


该版本的核心是一种新的语法,用于声明式地表示渲染过程中涉及的变量之间的永久关系。Svelte 3 的文档区分了三种情况:反应性赋值、反应性声明和反应性语句。


为了举例说明反应性赋值,Harris 使用 Svelte 和其他前端框架给出了一个计数器递增的简单例子:


// 使用Svelteconst { count } = this.get();this.set({  count: count + 1});
// 使用Reactconst { count } = this.state;this.setState({ count: count + 1});
// 使用Vue(...)data: () => ({count: 0}),(...)this.count += 1;
复制代码


在这些示例中,开发人员需要捕获或发出嵌入式框架状态更改的信号,以便触发相关的计算和效果。使用 Svelte 3,开发人员只需给变量赋值:


count += 1;
复制代码


Svelte 会在构建时生成相应的同步代码:


count += 1; $$invalidate('count', count);
复制代码


反应性声明处理各种变量之间的关系。使用 Svelte 3,开发人员现在可以将变量之间的关系编写为一个等式,使用 Svelte 编译器确保等式右侧变量的更改反映在左侧变量中,就像电子表格中一样。在下面的例子中:


<script>  let count = 1;
// 符号`$:`的意思是指当这些值变化时就重新运行 $: doubled = count * 2; $: quadrupled = doubled * 2;
function handleClick() { count += 1; }</script>
<button on:click={handleClick}> Count: {count}</button>
<p>{count} * 2 = {doubled}</p><p>{doubled} * 2 = {quadrupled}</p>
复制代码


语法 $:double = count * 2;引入了一个将变量 doubled 与变量 count 连接起来的等式。在这里,Svelte 编译器将生成代码,在 count 更新时更新 doubled:


  let doubled, quadrupled;  $$self.$$.update = ($$dirty = { count: 1, doubled: 1 }) => {    if ($$dirty.count) { $$invalidate('doubled', doubled = count * 2); }    if ($$dirty.doubled) { $$invalidate('quadrupled', quadrupled = doubled * 2); }  };
复制代码


反应性语句是指每次因变量发生变化时都要进行求值的语句。它们还使用 $语法:


<script>  let count = 0;
$: if (count >= 10) { alert(`count is dangerously high!`); count = 9; }
function handleClick() { count += 1; }</script>
<button on:click={handleClick}> Clicked {count} {count === 1 ? 'time' : 'times'}</button>
复制代码


框架会把它编译成如下代码:


  $$self.$$.update = ($$dirty = { count: 1 }) => {    if ($$dirty.count) { if (count >= 10) {        alert(`count is dangerously high!`);        $$invalidate('count', count = 9);      } }  };
复制代码


InfoQ 采访了 Svelte 的创建者 Rich Harris,并讨论了 Svelte 3 背后的动机及其对开发人员的影响。


InfoQ:请给我们介绍下 Svelte 的历史。您是《卫报》使用的另一个基于模板的前端框架 Ractive 的创建者,您为什么还要创建 Svelte?


Rich Harris:Ractive 是 2012-13 年产生的 UI 框架的一种,是那个时代的产物。它功能强大且直观,但与其他同类产品一样,它需要在运行时解释声明式组件代码,这将带来一定的损失。与直接手工编写代码来操作 DOM 相比,你需要使用更大的 JS 包,而且性能更差。

到 2016 年,一切都变了。移动设备,而不是桌面设备,突然占据了大部分流量,这使得包的大小和性能变得更加重要。多亏了 Babel 和 TypeScript 这样的项目,JS 社区重新适应了编译器和构建步骤,所以我就开始想,一个理解声明式组件的编译器能否将它们转换成高度优化的指令代码。到目前为止,我已经花了几年时间考虑 UI 框架设计,并且构建了一个模块打包器(Rollup)和一个编译器(Buble),所以我觉得自己有很好的条件来做尝试。


InfoQ:Svelte 3 引入了一个新的语法来解决一个组件内的同步问题。那么组件间的同步/通信呢?假设两个组件读写一个共享的状态片段,或者两个组件必须通信。您如何使用 Svelte 处理可能的同步问题?


Harris: Svelte 有一个名为 store 的原语,它与内置的反应系统一起工作。它是一个非常简单的契约——包中有一个引用实现,但是你也可以封装其他库,比如 Redux 或 xstate——可以任意组合。我们还对 TC39 提出的可观察性规范(由 RxJS 之类的库实现)提供了原生支持,因为它们恰好符合 Svelte store 契约。


InfoQ:是否有可能将一个 Svelte 的组件打包到一个可以在其他框架中使用的 Web 组件中?反过来,在 Svelte 中使用 Web 组件有多容易?


Harris: 编译器的一个好处是可以从相同的组件代码生成不同的输出。生成 Web 组件只需设置一个编译器选项。使用 Web 组件同样简单——Svelte 在Custom Elements Everywhere测试套件上的得分为 30/30。


InfoQ:如果 Svelte 可以编译成 Web 组件,这是否意味着开发人员可以在他们的代码库中逐步引入 Svelte?这可行吗(与现有代码可能存在任何冲突吗,如冲突标记、捆绑问题等等)?


Harris: 是的,Svelte 的设计考虑到了增量采用。自定义元素是实现这一点的一种方便的方法,只要你带来了合适的 polyfill。不过,这取决于“主”框架——例如,React 对自定义元素的支持很差,所以在迁移期间,最好使用一个 React 封装器来封装 Svelte 组件(比如react - svelte)。


InfoQ:开发人员怎么用 Svelte 处理嵌套路由?


Harris: 最简单的方法是使用 Sapper,这是一个构建在 Svelte 组件框架之上的应用程序框架。Sapper 基于应用的文件夹结构为你提供了一个完整的声明式嵌套路由系统,类似于 Next.js,但有许多重要的增强。

对于喜欢基于组件或配置路由的开发人员,有几个社区维护的项目可以供他们选择。


InfoQ:如何测试一个 Svelte 应用程序?


Harris:默认的 Sapper 模板内置了 Cypress 集成。对于单个组件测试,我经常使用 Puppeteer。我们还在研究最常用的测试故事,应该很快就可以拿出来分享了。


InfoQ:请您给出三个采用 Svelte 的理由?


Harris: 首先,你将编写更少的代码,这是加速软件构建和减少 Bug 的最可靠的方法。其次,与主流框架相比,你可以获得更好的性能保证,这意味着,随着应用的增长,或者随着你扩展到设备速度较慢和连接普遍存在的新市场,你不必停下来重写。

第三,Svelte 有许多传统框架认为超出范围的特性。这是因为——作为一个编译器——Svelte 只需要包含你实际使用的特性,而为其他人节省字节。这意味着我们可以自由地包含其他框架团队认为是浪费的东西,比如声明式转换和动画。


InfoQ:三个不使用 Svelte 的理由?


Harris:我们还没有像更成熟的框架那样丰富的编辑器集成和开发工具。我们还没有一流的 TypeScript 支持。我们不属于财大气粗的公司——我们只是一群真正的信徒。


InfoQ:Svelte 下一步有什么计划?


Harris: 呼声最高的特性是 TypeScript 支持,所以我们希望尽快在这方面取得进展。我个人对使用 Svelte 来构建 WebGL 应用程序感到很兴奋,并且我还处于早期的探索阶段。最后,还有一个名为 Svelte Native 的社区项目,它允许你使用 Svelte(由 NativeScript 提供支持)构建 Android 和 iOS 应用程序,并且正在取得一些令人难以置信的进展。


InfoQ:您能举几个使用 Svelte 的公司的例子吗?


Harris: 和其他几家新闻机构一样,我工作的《纽约时报》也将其用于许多项目。我们的网站在主页上还有很多其他的例子——也许最有趣的是,巴西的 Stone 和俄罗斯的 Mustlab 正在使用 Svelte 来驱动嵌入式设备,比如贩卖机系统和智能电视应用。越来越多的前端开发正在转向嵌入式 Web,这些公司意识到,传统的 JavaScript 优先框架不能满足这种环境的需求。


查看英文原文Svelte 3 Front-End Framework Moves Reactivity Into the JavaScript Language, Q&A With Rich Harris


2019-05-18 08:009341
用户头像

发布了 686 篇内容, 共 395.5 次阅读, 收获喜欢 1498 次。

关注

评论

发布
暂无评论
发现更多内容

IPFS云矿机系统开发|IPFS云矿机APP软件开发

系统开发

Python 打印回车换行

HoneyMoose

Python基础之:Python的数据结构

程序那些事

Python 程序那些事 python数据结构

2021 OS 大赛来了,为中国操作系统发展按下加速键

InfoQ写作社区官方

热门活动

@Component,@Service等注解是如何被解析的?

Java小咖秀

spring 面试 工作 注解 经验

设计有意义的选择——再谈心流

Justin

心理学 28天写作 游戏设计

Nirvana NA公链 NAC公链的两面观

区块链第一资讯

马特机器人系统开发(成品案例,快速上线)

系统开发咨询1357O98O718

百度大脑开放日重庆站-智能物流专场报名啦

百度大脑

百度大脑 智能物流 智能物流开放日 重庆站

干货 | 万字详解整个数据仓库设计体系

五分钟学大数据

大数据 数据仓库 28天写作 3月日更

《2020年IT行业项目管理调查报告》重磅发布

禅道项目管理

开源 项目管理 项目 调查报告 互联网行业薪资

小树系统开发案例(源码)丨小树机器人系统开发流程

系统开发咨询1357O98O718

fil挖矿系统开发|fil挖矿系统软件APP开发

系统开发

超简单的网站暗黑模式,它真的超简单!

HelloGitHub

大前端

华为云数据库GaussDB(for openGauss):初次见面,认识一下

华为云开发者联盟

数据库 分布式 华为云 GaussDB(for openGauss) 开源数据库

Continue 玩转像素点,Python 图像处理学习的第 3 天

梦想橡皮擦

28天写作 3月日更

【实战问题】-- 并发的时候分布式锁setnx细节

秦怀杂货店

Java 分布式 高并发

华为云应用服务网格最佳实践之从Spring Cloud 到 Istio

华为云开发者联盟

微服务 Spring Cloud istio 华为云 服务网格

企业大数据实战:Kyuubi 与 Spark ThriftServer 的全面对比分析

网易数帆

大数据 spark Kyuubi Thrift HiveServer2

全球币系统开发案例(源码)

系统开发咨询1357O98O718

uni-app跨端开发H5、小程序、IOS、Android(三):理解uni-app框架MVVM思想

黑马腾云

微信小程序 uni-app android iOS Developer 3月日更

MySQL的锁

一个大红包

3月日更

共筑“新基建” 京东云全面开启渠道合作伙伴招募计划

京东科技开发者

云服务

万物摩尔定律

soolaugust

AI

Python 生成 QR 二维码

HoneyMoose

「SaaS第一股」微盟集团财报业绩大涨,超预期财报揭示多元投资布局

ToB行业头条

SaaS 微盟

「 视频云大赛 — 大咖驾到 」下一代技术新浪潮,正由视频云驱动

阿里云视频云

阿里云 音视频 intel

uniapp实现音视频通讯

anyRTC开发者

uni-app 音视频 WebRTC 跨平台 sdk

Python if __name__ == ‘main’ 的作用介绍

HoneyMoose

看完了进程同步与互斥机制,我终于彻底理解了 PV 操作

飞天小牛肉

Java 程序员 面试 操作系统

高频量化交易系统开发功能丨量化交易机器人系统开发详情

系统开发咨询1357O98O718

InfoQ访谈:前端框架Svelte 3将反应性移入JavaScript语言_大前端_Bruno Couriol_InfoQ精选文章