成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Signal:更多前端框架的選擇

開發 前端
Signal的技術在10年前Knockout框架中就有應用。為什么這項技術正受到越來越多前端框架的青睞?

Signal:更多前端框架的選擇

大家好,我卡頌。

最近,Angular?、Qwik?的作者「MI?KO HEVERY」發文表示Signal是前端框架的未來[1],并考慮在Angular中實現它。

在此之前,Vue?、Solid.js?、Preact?、Svelte?都已實現Signal?。實際上,signal并不是一個新概念,他還有很多別名,比如:

  •  響應式更新
  •  細粒度更新

如果你了解過Vue?響應式更新的實現原理,對Signal就不會陌生。

實際上,Signal?的技術在10年前Knockout框架中就有應用。為什么這項技術正受到越來越多前端框架的青睞?

本文,讓我們一起探討下這個話題。

signal的本質

signal?的本質,是將「對狀態的引用」以及「對狀態值的獲取」分離開。這么說可能有點抽象,讓我們先看一個非signal的例子。

以下是React中定義狀態的方式:

function App() {
const [state, dispatch] = useState(0);
return <p onClick={
() => dispatch(state + 1)
}>{state}</p>
}

useState的返回值包括兩部分:

  • state:狀態的值
  • dispatch?:狀態的setter

可以發現,state耦合了「對狀態的引用」以及「對狀態值的獲取」這兩個含義。

再來看一個signal?的例子。以下是同一個例子用Solid.js書寫的樣子:

function App() {
const [getState, dispatch] = createSignal(0);
return <p onClick={
() => dispatch(getState() + 1)
}>{getState()}</p>
}

createSignal的返回值包括兩部分:

  •  getState:對狀態的引用
  •  dispatch:狀態的setter

區別就體現在getState上,其中:

  • getState是對狀態的引用
  • getState()是對狀態值的獲取

也就是說,我們可以不必立刻獲取狀態的值,而是在需要的時候再獲取(即在需要時再執行getState())。

這么做有什么好處呢?如果我們在需要的時候再獲取狀態的值,就能感知當前的上下文環境。

舉個很粗糙的例子,在下面的代碼中,組件實例(Component實例)在render時會將全局變量cpnContext指向自己:

let cpnContext = null;

class Component {
render() {
cpnContext = this;
// ...省略邏輯
}
}

那么在createSignal返回的getState方法內部,可以獲取全局變量cpnContext來感知當前處于哪個組件的渲染流程:

function createSignal() {
// ...省略邏輯
function getState() {
const curContext = cpnContext;
// ...
}
function dispatch {}
return [getState, dispatch]
}

這么做的目的是建立「狀態變化」與「需要更新哪個組件」之間的聯系。

相比于React?,基于Signal實現的框架會有兩個優勢:

  •  更好的細粒度更新性能
  •  更好的DX(開發者體驗)

更好的細粒度更新性能

由于Signal建立了狀態與組件之間的聯系,所以相比于React更有性能優勢。

比如,在我的電腦上,用Svelte渲染1w個li,點擊某個li后改變他的內容:

<ul>
{#each items as item (item.id)}
<li on:click={() => items[item.id].name = 'change!'}>{item.name}</li>
{/each}
</ul>

從點擊事件觸發,到Svelte邏輯運行完,再到瀏覽器重排重繪,總用時18.88ms,其中Svelte的邏輯執行只花了9.5ms:

圖片

同樣的例子用React實現,觸發點擊后總用時98.5ms,其中React的邏輯執行了89.38ms:

圖片

在這個例子中,React?性能比Svelte差了一個數量級。之所以會有這樣的差異,很大一部分原因在于「Svlete在更新前就知道狀態變化時需要更新哪個組件」。

而這一切的源頭就在于Signal。

更好的DX

更好的開發者體驗主要體現在兩方面:

1、Signal感知上下文環境的能力減少了代碼心智負擔。

比如在React中,useEffect在使用時需要指明依賴的狀態:

useEffect(() => {
// ...state1, state2變化后的邏輯
}, [state1, state2])

如果采用Signal的實現,狀態能感知到自己在useEffect上下文環境,可以自動建立兩者之間的聯系,不用再擔心少寫依賴狀態、閉包陷阱等問題,減少心智負擔。

比如在Vue中,類似useEffect(僅僅是功能類似,兩者的用途其實是不同的)的watch,就不需要顯式指明依賴:

<script setup>
import { ref, watch } from 'vue'

const name = ref('')

watch(name, (newName, oldName) => {
// ...省略邏輯
})
</script>

2、減少開發者性能優化的心智負擔

使用Signal的框架通常能獲得不錯的運行時性能,所以不需要額外的性能優化API。反觀React,開發者如果遇到性能問題,需要手動調用性能優化API(比如React.memo、useMemo、PureComponent)。

總結

有以上這么多優點,難怪很多框架都使用了Signal?。那么React對Signal是什么態度呢?

React團隊成員對此的觀點是:

  1.  有可能引入類似Signal的原語
  2. Signal?性能確實好,但他不太符合React的理念?

圖片

React的理念可以用一句話概括:「UI反映狀態在某一刻的快照」。

既然是快照,那就不是局部的,而是個整體概念。在React?中,狀態更新會引起整個應用重新render?,就是對React快照理念的最好詮釋。

React?現階段的所有實現都是基于快照理念。所以,即使引入類似Signal?的原語,可能也是類似Mobx這樣的上層實現,而不是從底層重構。

我個人比較傾向于認為:React?團隊承認Signal的優點,但由于積重難返,而且現代設備的性能通常是過剩的,所以性能問題并不是首要問題。

如果這個觀點是正確的,那么React?可能會在開發者體驗(Signal的另一個優點)方面努努力。比如去年提出的RFC: useEvent[2]可能就是這方面的一次嘗試。

參考資料

[1]Signal是前端框架的未來:https://www.builder.io/blog/usesignal-is-the-future-of-web-frameworks#code-use-ref-code-does-not-render。

[2]RFC: useEvent:https://github.com/reactjs/rfcs/pull/220。

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2021-12-06 15:35:01

CSS前端開發

2015-04-17 15:56:15

戴爾云計算

2013-10-24 10:40:23

前端框架

2023-02-20 08:41:08

SignaluseState()

2015-09-25 10:23:06

SDN

2024-12-27 10:20:54

2018-06-10 15:45:40

物聯網IoT工業

2010-05-19 14:38:11

Web開發框架Web層

2022-01-06 22:04:03

JavaScript語言開發

2015-07-13 13:47:34

以太網標準帶寬

2016-07-06 11:13:02

云計算

2013-01-16 11:35:05

Latitude 10平板電腦

2019-07-17 22:07:14

前端開發框架

2010-08-05 14:32:16

Flex框架

2010-05-24 13:14:16

開放思杰云計算

2020-09-08 10:28:28

云計算云平臺

2020-04-14 15:54:07

5G物聯網Wi-Fi

2010-04-15 04:05:25

惠普UNIXTCO

2020-03-25 13:59:22

前端開發編程

2010-12-29 09:51:29

前端基礎框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠操狠狠操 | 亚洲在线免费 | 欧美一区二区网站 | 粉嫩一区二区三区四区公司1 | 日韩在线欧美 | 国产精品久久久久久久久久久久 | 久久午夜视频 | 久久久精 | 欧美一级黄色片免费观看 | 色综合久久天天综合网 | 五月天综合影院 | 国产亚洲精品美女久久久久久久久久 | 日韩高清一区二区 | 久久精品这里 | 午夜视频免费 | 日本a视频 | 亚洲一区二区免费看 | 日韩一区二区在线视频 | 美女午夜影院 | 一区二区不卡视频 | 精品成人在线观看 | 91日日| 亚洲图片一区二区三区 | 亚洲精品国产一区 | 日韩久久在线 | 精品在线一区二区三区 | 欧美一二精品 | 黄色国产 | 成人亚洲视频 | 国产高清精品在线 | 激情一区二区三区 | 91传媒在线观看 | 九九热精品视频 | 久久久久久久久淑女av国产精品 | 欧美自拍日韩 | 亚洲一区二区中文字幕 | 无码日韩精品一区二区免费 | 精品九九久久 | 久久国内精品 | 国产目拍亚洲精品99久久精品 | 亚洲精品一区二区三区在线 |