Signal 即将成为JavaScript的一部分

什么是响应性?

在过去的几年中,响应性成为了所有现代前端框架以及React库的核心。

对于不熟悉前端开发的人来说,起初这可能是一个令人困惑的概念,因为它改变了常规的、自上而下的、从调用者到被调用者的顺序工作流。

在响应性范式中,当事情发生变化时,数据会自动更新,下面简单展示一下伪代码:。


effect: console.log(x+2)
x = 2
x = 3

这种方法允许开发者以一种更直观的方式处理数据和UI的更新,使得用户界面能够实时反映底层数据的变化。

根据响应性范式,应用程序可以在变量x发生变化时,无需程序员的特别努力,就能显示NaN、4和5等多种结果。

这里极度简化了这个话题,只是为了给那些对响应性一无所知的人一个大致的了解。

需要指出的是,响应性在前端开发中的许多情况下都非常有用。例如,在显示用户界面时,一个框架可以识别变量何时发生变化以更新用户界面。比如当你展示一个实时的温度计时。

响应性的应用场景远不止于此,几乎所有的前端框架都在使用响应性技术。甚至还有一个响应式的jQuery库。

如何实现响应性?

响应性在实际应用中的一个很好的例子是电子表格。当你在电子表格中基于其他单元格的值输入一个计算公式时,你不需要手动更新计算结果。电子表格应用会自动检测到变化,并更新所有基于修改过的单元格的计算值。

在前端框架中,实现响应性有多种方法。一个著名的例子是使用RxJS,它依赖于观察者(Observables)、订阅者(Subscribers)和主题(Subjects)。如果你经常处理异步数据流,这是一个很棒的库。

在各种框架中,响应性的复杂性对开发者来说是隐藏的。

在React中,你必须明确提供依赖列表:

一旦reactive roomId 或 serverUrl 发生变化,上面的代码片段将会断开当前房间并连接到新的房间。

在Vue中,你甚至不需要提供依赖列表:

Vue会自行判断,如果copy.count发生变化,就应该重新运行代码。

如果我们审视所有主要的框架和库,会发现每个框架和库中的响应性几乎达到了相同的API水平,并且从用户的角度看几乎在做相同的事情。

Signals 的起源如何?

Angular进行的最后一次主要切换到类似的API是在2023年4月3日发布的一份RFC中详细说明的。该文档深入探讨了为什么zone.js的反应性不足,并且Angular必须转向更细粒度的Signals。

并不是说Signals在这方面完全是新事物,更多的是基于研究如何以最佳方式提供响应性的结论。我真的认为应该将Signals的来源归功于Solid。

自从那次重大工作完成以后,它巩固了整个社区对细粒度响应性的采纳。因为从那时起我们知道,几乎每个框架和库都使用几乎相同的响应性模型,但有些用的是tomato,有些则用的是tomato。

推动 Signal 标准化的努力

考虑到这一点,我们可以想象许多可能的结果。一切可能维持现状,每个框架使用自己的响应性模型。在这种情况下,人们实际上在使用不同名称下的相同事物。

另一个情景是,每个人突然使用提供响应性模型的库。到目前为止,这还没有发生,但它仍然是桌面上的一个选项。

第三个,也是最疯狂的情景,将是将 signals 纳入 Ecmascript 本身。这意味着它将成为 JavaScript 本身的一部分。

听起来疯狂吗?

确实。

但一切都在2023年2月一次偶然的 Twitter 聊天中浮出水面:每个人已经有或正在调整响应模型以基于 Signals 的模型。参与讨论的人之一是 Daniel Ehrenberg。

在过去的一年中,你真的不知道是否有什么事情正在酝酿,直到一个月前。

那时,Daniel 在纽约提议了一个名为 queerjs 的演讲,这个名字相当令人费解:

他提供了一个相当引人入胜的描述:

一种选择是通过使 Signals 内置到 JavaScript 中,如 Promises,来稳定生态系统,提高性能和互操作性。但是...最好避免像 Promises 那样的一些陷阱,例如它们始终开启的调度器。

这意味着,Daniel 真的在考虑 Signals 是否应该成为 JavaScript 的一部分!

Signals可能会成为JavaScript的一部分

总的来说,这些都还只是讨论阶段。但是在JavaScript世界里,事情发展迅速。甚至比C++成为一种内存安全的编程语言还要快,这是肯定的!

两天前,Daniel提议在4月的TC39会议上讨论这个主题。这意味着它可能很快就会进入第一阶段!

这是一件大事,因为TC39,即技术委员会39,负责标准化Ecmascript,而一旦某样东西成为标准的一部分,迟早会成为JavaScript的一部分!

当然,这不会像在周五晚上发布到生产环境那么简单。

Signals 可能需要时间才能成为 JavaScript 的标准功能

Signals 要成为 JavaScript 的标准功能,需要经过六个标准化阶段。因此,鉴于 Signals 的复杂性和响应性,这对整个委员会来说是一项艰巨的工作。但同时,它也将吸引包括前端框架开发者在内的许多开发者的关注。

在最佳情况下,他们所有人都应该满意于将来某天切换到 Signals。

但这需要仔细的工作和解决许多难题。例如,标准应该是开放的还是封闭的。

展望未来几年,我们可能会发现每个框架都使用标准的 JavaScript Signals。

这将有助于提高性能、可维护性,并能够将知识从一个框架转移到另一个框架。

许多好处确实可以让这种努力变得值得。

同时,这个过程也可能在任何时候被终止,所以目前一切皆有可能。

然而,我无法停止这种感觉,现在是推动 Signals 前进的绝佳时机。特别是知道从2024年3月18日开始,还有一个Observable/Subscription模型的孵化过程,Signals 可以从中受益。

Signal 提案刚刚发布!

Rob Eisenberg 和 Daniel Ehrenberg 刚刚发布了 Signal 标准的第0阶段提案。

已经有一个 polyfill 可供测试,而这个提案已经秘密开发了8个月!

作者成功地吸引了来自各种框架和库的作者参与:

他们在这里合作,开发了一个可以支持他们核心响应性需求的通用模型。当前的草案基于来自 Angular, Bubble, Ember, FAST, MobX, Preact, Qwik, RxJS, Solid, Starbeam, Svelte, Vue, Wiz 等作者/维护者的设计输入。

以下是一个如何使用 Signals 的例子:

const counter = new Signal.State(0);
const isEven = new Signal.Computed(() => (counter.get() & 1) == 0);
const parity = new Signal.Computed(() => isEven.get() ? "even" : "odd");// 库或框架定义基于其他 Signal 原语的效果
declare function effect(cb: () => void): (() => void);effect(() => element.innerText = parity.get());// 模拟对计数器的外部更新...
setInterval(() => counter.set(counter.get() + 1), 1000);

这是多么令人震惊的简单易用啊!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AR系列路由器配置VLAN间通信

AR路由器是华为公司推出的企业级路由器产品系列,具有高可靠性、高性能和易管理等特点。AR 系列路由器提供的功能包括路由转发、安全接入、语音、视频、无线等多种业务,支持各种接入方式和协议,并且可以方便地进行扩展和升级。 实验拓扑图&…

微信小程序介绍

一、微信小程序概述 微信小程序是一种不需要下载、安装即可使用的应用,用户只需扫一扫或搜一下即可打开。它实现了应用触手可及的梦想,降低了应用的使用门槛。微信小程序自2017年1月上线以来,已经吸引了大量开发者加入,构建了一个…

【全开源】云界旅游微信小程序(源码搭建/上线/运营/售后/维护更新)

开启您的云端旅行新体验 一、引言 在快节奏的现代生活中,旅行成为了人们放松身心、探索世界的重要方式。让您的旅行更加便捷、高效,打造了云界旅游小程序,带您领略云端旅行的无限魅力。 二、小程序功能概览 云界旅游小程序集成了丰富的旅游…

【代码随想录算法训练营第37期 第九天 | LeetCode28. 实现 strStr()、459.重复的子字符串】

代码随想录算法训练营第37期 第九天 | LeetCode28. 实现 strStr()、459.重复的子字符串 一、28. 实现 strStr() 解题代码C&#xff1a; class Solution { public:void getNext(int* next, const string& s) {int j 0;next[0] 0;for(int i 1; i < s.size(); i) {whi…

【Maven】Nexus私服简介_下载安装_登录

1、简介 1.1介绍 Nexus私服&#xff0c;也被称为Maven仓库管理器&#xff0c;是许多公司在自己的局域网内搭建的远程仓库服务器。提供了强大的仓库管理功能和构件搜索功能&#xff0c;使得开发人员能够更方便地管理和使用Maven项目中的依赖库。 1.2作用 内网访问&#xff1…

Python代码:七、小数化整数

1、题目 日常生活中我们会遇到很多小数&#xff0c;但是有的人不喜欢小数&#xff0c;因此会用四舍五入的方式将其去掉。在Python中我们更加简单&#xff0c;可以利用强制类型转换将小数转变成整数&#xff0c;请你试一试。 2、代码 import sysn float(input()) print(int(…

微服务(Spring Clould)--Nacos的安装、配置

简介&#xff1a;&#xff08;取自官网&#xff09; Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了…

<sa8650>QCX Usecase 使用详解—什么是可剪枝节点属性以及何时使用

<sa8650>QCX Usecase 使用详解—什么是可剪枝节点属性以及何时使用 用例剪枝可实现光流设计分段(节点和目标缓冲区),这些分段实现了共享的逻辑接口,而这些接口的实现可能会发生冲突,但不会重复流水线。例如,overridesettings.txt 中的 enableAutoNoIPE=FALSE。 在 /qc…

《表格革命:数据可视化的力量与创新》

在当今数字化的时代&#xff0c;表格已不再是简单的罗列工具&#xff0c;而是一场正在悄然兴起的革命&#xff01; 表格&#xff0c;这个看似平凡无奇的存在&#xff0c;却在各个领域发挥着至关重要的作用。无论是商业数据分析中精准呈现销售趋势和市场动态&#xff0c;还是学…

React 第三十七章 Scheduler 最小堆算法

在 Scheduler 中&#xff0c;使用最小堆的数据结构在对任务进行排序。 // 两个任务队列 var taskQueue: Array<Task> []; var timerQueue: Array<Task> [];push(timerQueue, newTask); // 像数组中推入一个任务 pop(timerQueue); // 从数组中弹出一个任务 time…

【深入理解MySQL的索引数据结构】

文章目录 &#x1f4d5;索引底层数据结构与算法&#x1f4d9;索引数据结构&#x1f4d8;二叉树&#x1f4d8;红黑树&#x1f4d8;Hash&#x1f4d8;B-Tree&#x1f4d8;BTree &#x1f4d9;表在不同存储引擎的存储结构&#x1f4d8;MyISAM存储引擎索引实现&#x1f4da;文件结构…

C语言如何创建⼀个动态链表?

一、问题 创建动态链表就是指在程序执⾏过程中&#xff0c;从⽆到有&#xff0c;按照需求开辟结点和输⼊各结点数据&#xff0c;并建⽴起前后相连接的关系。那么&#xff0c;如何创建动态链表呢&#xff1f; 二、解答 以建⽴⼀个有任意名学⽣数据的单向动态链表为例&#xff0…

使用mysql主从热备+keepalived服务+ipvsadm工具 实现 mysql高可用主备+负载均衡

目录 1、工作原理 2、环境准备 3、分别在主服务器和备用服务器上安装keepalived和ipvsadm 4、修改keepalived服务的配置文件 4.1 修改主服务器上的keepalive服务的配置文件 4.2 修改备用服务器上的keepalive服务配置文件 5、编写mysql监控脚本放到主服务器上 6、在主服…

echers配置项:X轴,Y轴颜色修改

如上图绿框所示&#xff0c;修改x&#xff0c;y轴的颜色 let option {xAxis: {axisLine:{lineStyle:{color:red}},},yAxis: {type: value,axisLine:{lineStyle:{color:red}},}, }

学习MySQL(六):Python的连接与操作

安装第三方模块pymysql pip install pymysql 或者 通过PyCharm后台操作 连接mysql # 语法示例 import pymysql db pymysql.connect(hostlocalhost,userroot,password"123456",databaseschool,port3306,charset"utf8") 数据操作的基本语法 import pymys…

通过gen_compile_commands.py产生compile_commands.json文件的方法

大家在使用vscode查看linux源代码时&#xff0c;会有很多飘红处&#xff0c;而且函数的跳转非常不方便。所以linux给了一个脚本gen_compile_commands.py&#xff0c;此脚本类似ctags这样&#xff0c;产生相应的关联之类的数据库&#xff0c;方便函数及文件的跳转等等。非常好。…

软件测试委托合同(Word原件实际参考)

一、 任务表述 二、双方的主要义务 三、履约地点 四、合同价款 五、测试费用支付方式 六、履行的期限 七、资料的保密 八、 风险责任的承担 九、验收方法 十、 争议解决 十一、 其他 十二、签章 十三、计算机软件产品鉴定测试保密协议 软件资料清单列表部分文档&#xff1a; …

Object.wait()和LockSupport.park()

Object.wait() 和 LockSupport.park() 都是用来使当前线程等待的方法&#xff0c;但它们在使用场景和机制上有所不同&#xff1a; Object.wait() 用途&#xff1a;wait() 方法属于对象监视器&#xff08;Monitor&#xff09;的一部分&#xff0c;通常与 synchronized 块或方法…

电感式传感器

电感传感器是基于电磁感应原理&#xff0c;将被测非电量&#xff08;如位移、压力、振动等&#xff09;转换为电感量变化的一种结构性传感器。利用自感原理的有自感式传感器&#xff08;可变磁阻式&#xff09;&#xff0c;利用互感原理的有互感式&#xff08;差动变压器式和涡…

AI学习指南线性代数篇-矩阵的运算

AI学习指南线性代数篇-矩阵的运算 线性代数中&#xff0c;矩阵的运算是一项重要而基础的内容。在人工智能领域&#xff0c;矩阵的运算被广泛应用于各种算法中&#xff0c;如神经网络、图像处理、自然语言处理等。本文将从矩阵的运算概述、在AI中的使用场景、定义和意义以及公式…