作者:@Atila Fassina
原文:https://smashingmagazine.com/2024/11/the-hype-around-signals/
背景
"信号"(Signals)这一概念最早可以追溯到 20 世纪 70 年代,随着计算机科学的发展,它在 90 年代和 21 世纪初逐渐在不同领域中流行起来。在 Web 开发中,信号的概念首次通过 KnockoutJS 得到应用,随后在多种前端框架中得到了不同程度的实现,如 MobX、Vue.js 和 SolidJS 等。这些实现虽然名称和细节各异,但都属于细粒度响应式(Fine-Grained Reactivity)的范畴。
要点
信号的核心在于其能够实现高效的数据更新和避免中间状态的显示,这对于现代前端开发至关重要。
Signals 的工作原理
Signal 通常由一个访问器(getter)和一个设置器(setter)组成。设置器用于更新 signal 持有的值并触发所有依赖的 effects,而访问器则从源中提取值,并在每次上游发生更改时由 effects 运行。
const [signal, setSignal] = createSignal("initial value");
setSignal("new value");
console.log(signal()); // "new value"
在 SolidJS 中:
import { createSignal } from 'solid-js';
function ReactiveComponent() {
const [signal, setSignal] = createSignal();
return (
<h1>Hello, {signal()}</h1>
);
}
在这个例子中,signal()
是一个访问器,它从信号源获取值。每当 signal 的值发生变化时,只有
标签会更新,而不是整个 ReactiveComponent 函数。
【第3253期】Signal - 蓄势待发的 Virtual DOM 杀手
分析
API 架构
为了理解 signals 的重要性,我们需要深入了解 API 架构 和 细粒度响应性 的含义。
拉取系统需要处理轮询或其他方式来保持数据最新,同时也需要确保在数据更新时所有消费者都被销毁并重新创建,以避免 状态撕裂。
推送系统不需要担心保持数据最新,但数据源不知道消费者是否准备好接收更新,这可能会导致 背压。
推拉混合架构
在推拉混合系统中,状态维护一个订阅者列表,当数据更新时,订阅者可以被触发以重新获取数据。与传统推送方式不同的是,更新本身不会发送给订阅者,而只是通知他们当前状态已过时。
我们称这些数据为 signals,而触发这些订阅者更新的方式称为 effects。
【第2754期】从 Signals 看响应式状态管理
细粒度响应性
响应式系统是指数据可以通知消费者它已更改,并且消费者可以应用这些更改的系统。为了使其成为 细粒度 的,需要满足两个基本要求:
效率:系统只执行必要的最小计算量。
无故障:在更新状态的过程中不显示任何中间状态。
UI 中的效率
Signal 通过使用 访问器 来实现高效率。访问器本质上是一个 getter 函数,这意味着值不存在于组件的边界内,模板接收的是该值的 getter,每次 effect 运行时,它们都会获取一个最新的值。
细粒度响应式 UI 提供了以下优点
提高性能:通过只更新需要更改的部分,细粒度响应式可以显著提高应用程序的性能,尤其是在处理大量数据时。
简化开发:开发人员不再需要手动跟踪和更新数据更改,这使得代码更易于编写、阅读和维护。
减少错误:自动更新减少了人为错误的可能性,例如忘记更新特定组件或更新错误的数据。
无故障 UI
非响应式系统通过销毁 / 重新渲染机制来避免中间状态。它们丢弃可能包含过时数据的组件,并从头开始重新创建一切。这种方法有效且一致,但代价是效率低下。
响应式系统则通过不同的更新策略来解决这个问题,可以分为两类:
信号提供了许多优点,但也有一些潜在的挑战需要注意
学习曲线:对于不熟悉响应式编程的开发人员来说,理解信号的概念和工作原理可能需要一些时间。
调试:调试信号驱动的应用程序可能比调试传统应用程序更具挑战性,因为数据流可能更加複杂。
生态系统支持:并非所有 JavaScript 框架都支持信号,这可能会限制您对库和工具的选择。
细粒度响应式 UI 是一个不断发展的领域,以下是一些潜在的未来趋势
更广泛的採用:随著越来越多的开发人员认识到细粒度响应式的优点,预计它将在 JavaScript 框架中得到更广泛的採用。
工具和库的改进:预计将出现新的工具和库,以简化信号驱动应用程序的开发、调试和测试。
与其他技术的集成:细粒度响应式可能会与其他新兴技术集成,例如 WebAssembly 和服务器端渲染,以进一步增强 Web 应用程序的功能和性能。
对开发者体验和用户体验的影响
影响
信号的引入对前端开发产生了深远影响。它不仅提高了数据更新的效率,还减少了中间状态的显示,从而提升了用户体验和开发者体验(DX)。随着越来越多的前端框架采用信号机制,未来可能会看到更多基于信号的优化和创新。
结论
信号作为一种古老但不断进化的技术,正在重新定义我们如何思考和处理前端应用中的交互性和数据。随着细粒度响应式系统的普及,信号将在未来的前端开发中扮演越来越重要的角色。开发者应关注这一趋势,并学习如何在实际项目中有效利用信号机制,以提升应用的性能和用户体验。
😀 每天只需花五分钟即可阅读到的技术资讯,加入【早阅】共学群,可联系 vx:zhgb_f2er
5 分钟新知:了解技术资讯的一种方式。
🚀可直接通过阅读原文了解详细内容。