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.pswp.cn/diannao/13441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13441.shtml
英文地址,請注明出處:http://en.pswp.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中的使用場景、定義和意義以及公式…