专栏名称: 前端早读课
我们关注前端,产品体验设计,更关注前端同行的成长。 每天清晨五点早读,四万+同行相伴成长。
目录
相关文章推荐
前端早读课  ·  【早阅】Signals分析:从历史到影响 ·  4 天前  
前端早读课  ·  【早阅】React 19 正式发布 ·  5 天前  
奇舞精选  ·  奇舞周刊第545期:React 19 正式发布 ·  5 天前  
奇舞精选  ·  奇舞周刊第545期:React 19 正式发布 ·  5 天前  
前端早读课  ·  【第3428期】Speculation ... ·  6 天前  
前端大全  ·  “应该禁止所有新项目使用 ... ·  1 周前  
51好读  ›  专栏  ›  前端早读课

【早阅】Signals分析:从历史到影响

前端早读课  · 公众号  · 前端  · 2024-12-08 08:00

正文

作者:@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 架构 和 细粒度响应性 的含义。

  • 拉取 (Pull):消费者向数据源请求更新。

  • 推送 (Push):数据源在更新可用时立即发送更新。

拉取系统需要处理轮询或其他方式来保持数据最新,同时也需要确保在数据更新时所有消费者都被销毁并重新创建,以避免 状态撕裂。

推送系统不需要担心保持数据最新,但数据源不知道消费者是否准备好接收更新,这可能会导致 背压。

推拉混合架构

在推拉混合系统中,状态维护一个订阅者列表,当数据更新时,订阅者可以被触发以重新获取数据。与传统推送方式不同的是,更新本身不会发送给订阅者,而只是通知他们当前状态已过时。

我们称这些数据为 signals,而触发这些订阅者更新的方式称为 effects。

【第2754期】从 Signals 看响应式状态管理

细粒度响应性

响应式系统是指数据可以通知消费者它已更改,并且消费者可以应用这些更改的系统。为了使其成为 细粒度 的,需要满足两个基本要求:

  • 效率:系统只执行必要的最小计算量。

  • 无故障:在更新状态的过程中不显示任何中间状态。

UI 中的效率

Signal 通过使用 访问器 来实现高效率。访问器本质上是一个 getter 函数,这意味着值不存在于组件的边界内,模板接收的是该值的 getter,每次 effect 运行时,它们都会获取一个最新的值。

细粒度响应式 UI 提供了以下优点

  • 提高性能:通过只更新需要更改的部分,细粒度响应式可以显著提高应用程序的性能,尤其是在处理大量数据时。

  • 简化开发:开发人员不再需要手动跟踪和更新数据更改,这使得代码更易于编写、阅读和维护。

  • 减少错误:自动更新减少了人为错误的可能性,例如忘记更新特定组件或更新错误的数据。

无故障 UI

非响应式系统通过销毁 / 重新渲染机制来避免中间状态。它们丢弃可能包含过时数据的组件,并从头开始重新创建一切。这种方法有效且一致,但代价是效率低下。

响应式系统则通过不同的更新策略来解决这个问题,可以分为两类:

  • 惰性 Signals:调度程序定义更新发生的顺序。

  • 主动 Signals:Signal 知道其父级是 过时、检查中 还是 干净 的。

信号提供了许多优点,但也有一些潜在的挑战需要注意

  • 学习曲线:对于不熟悉响应式编程的开发人员来说,理解信号的概念和工作原理可能需要一些时间。

  • 调试:调试信号驱动的应用程序可能比调试传统应用程序更具挑战性,因为数据流可能更加複杂。

  • 生态系统支持:并非所有 JavaScript 框架都支持信号,这可能会限制您对库和工具的选择。

细粒度响应式 UI 是一个不断发展的领域,以下是一些潜在的未来趋势

  • 更广泛的採用:随著越来越多的开发人员认识到细粒度响应式的优点,预计它将在 JavaScript 框架中得到更广泛的採用。

  • 工具和库的改进:预计将出现新的工具和库,以简化信号驱动应用程序的开发、调试和测试。

  • 与其他技术的集成:细粒度响应式可能会与其他新兴技术集成,例如 WebAssembly 和服务器端渲染,以进一步增强 Web 应用程序的功能和性能。

对开发者体验和用户体验的影响
  • 开发者体验:细粒度响应式简化了代码,使其更易于编写、阅读和维护。这也减少了错误的可能性,并使开发人员能够专注于构建功能而不是管理数据更新。

  • 用户体验:细粒度响应式可以提高应用程序的性能,使其感觉更快速和响应。它还可以防止 UI 故障,从而提供更顺畅、更一致的用户体验。

影响

信号的引入对前端开发产生了深远影响。它不仅提高了数据更新的效率,还减少了中间状态的显示,从而提升了用户体验和开发者体验(DX)。随着越来越多的前端框架采用信号机制,未来可能会看到更多基于信号的优化和创新。

结论

信号作为一种古老但不断进化的技术,正在重新定义我们如何思考和处理前端应用中的交互性和数据。随着细粒度响应式系统的普及,信号将在未来的前端开发中扮演越来越重要的角色。开发者应关注这一趋势,并学习如何在实际项目中有效利用信号机制,以提升应用的性能和用户体验。

😀 每天只需花五分钟即可阅读到的技术资讯,加入【早阅】共学群,可联系 vx:zhgb_f2er

5 分钟新知:了解技术资讯的一种方式。

🚀可直接通过阅读原文了解详细内容。