Angular 16引入的Signal原始类型:令人振奋的原因
你好!嗨,奧斯汀哪去了?
总结
最近,Angular宣布正在考虑将名为signal的新原始类型包含在下一个发布版本中。
如果你是Angular的开发者,首先要理解这是一个令人高兴的事件。
整理
-
- signalという新しいプリミティブ型をAngularに追加する
-
- signalを使えば、RxJSを使わずにリアクティブ開発ができる
- AngularのRxJSとの相性が一気に良くなる
信号是什么意思。
Signal是由SolidJS的发明家Ryan Carniato先生提出的概念。
在SolidJS中,我们使用以下方式来使用。
import { createSignal } from "solid-js";
const [count, setCount] = createSignal(0);
count() // 0
function Counter() {
return <div>Count: {count()}</div>;
}
这个很像React的useState,但实际上差别很大。
Signal是非常出色的性能,类似于RxJS的BehaviorSubject。
只要你明白实际上是BehaviorSubject就可以了。
Angular的Signal是什么意思?
有关SolidJS的signal,Angular中有类似的实现方式。
据报道,Ryan Carniato先生似乎正在与Angular团队合作。
在Angular中,上面的例子会呈现如下:
@Component({
selector: 'my-app',
standalone: true,
template: `
<h1>Count: {{ count }}</h1>
<button (click)="add()">Add</button>
`,
})
export class App {
count = useSignal(0);
add() {
this.count.set(this.count.value + 1)
}
}
尽管实际的句法还不确定,但Svelte Store的写法可能会类似。
最新消息/更新情况/最近一刻
由于Angular的Signal实现变得具体了,所以在另一篇文章中介绍了如何使用。
为什么在Angular中需要Signal?
我相信你已经了解到这一点,不知道是什么样的故事,你可能会产生疑问:“为什么要这样做?”
只需要一个选项,简单回答就是必须埋葬zone.js。
如果您对Zone.js不熟悉的话,只需要把它看作是一个从document中接收并收集各种事件的库即可。
Angular的变更检测系统依赖于Zone.js。当用户点击了某个元素时,即使没有监听器,Zone.js也会向Angular发送指令,要求它检查所有可能的变化。
这被称为“Dirty Change Detection”。
当听到“脏”这个词时,通常会产生不好的印象,但事实上并不是太好。
尽管如此,令人意外的是,Angular在改进变更检测方面有很多优化,因此性能并不差。
不过,这个Zone.js存在着各种问题,可以说是Angular面临的最大技术挑战。
为了消除这个问题,我们必须给Angular提供能够检测变化的工具。
為了阻止Zone.js的存在,這就是Signal應該承擔的使命。所以選擇了Signal。
Angular有一个严重的问题:学习难度太高了。
最近的Angular给人的印象是不断推出新功能。
然而,即使是新功能,也只是为了让用户无需使用以前的功能即可完成任务的功能。
这让Angular的专家级用户相当担忧,并且被贬低。
然而,就算作为Angular的高级用户,笔者也深刻理解学习Angular的困难之处,甚至可以说非常厌恶。
而且,Angular可不是个时髦的东西。
「我要学习Angular!我会努力的!」在Web开发圈,这样说的人会被嘲笑。就像优等生拍马屁给老师一样,没有什么酷的形象。
人们经常说 Angular 已经过时了。
在日本,React是唯一被谈论的话题。React不仅不是一个框架,而且是一个糟糕的库。真的很糟糕。
Angular正在输掉宣传战。虽然有些开发者可能认为不必在意这种事情,但是明眼人都能看到,就算Angular再好用,如果新人不想学习它,它在市场上的应用范围也会逐渐缩小。
为了 Angular 的持续存在,我们不必改变成为一个能够稳健地做任何事情的优等生,但也必须放弃过分谄媚,稍微变得时尚一些。
我理解Angular团队也明白这一点。
因此,我们采用一种一举两得的方法,即借助潮流来解决Angular的一些问题。
我们在使Angular更简便易用的同时,也引入了类似信号(signal)这样的现代概念。
我认为之前让Angular能够独立地使用模块,而不需要使用外部模块,也是这项战略的一部分。
我们正在努力扩大Angular的门槛,使其更易于进入。
这对我们Angular爱好者来说是个好消息。当我们要教新手学习Angular时,我们将能够回答他们对于ngModule是什么的问题。
就算是RxJS,那个东西学习起来也非常有难度。
無論是對於圖書館,還是對於改變對於編程的態度來說,可以說這是一個非常困難的事情,甚至可以說是難以理解的。
响应式编程在中国不容易。RxJS的异步操作符比我拥有的所有衣服还要多。数量比比尔·盖茨终生流下的眼泪还要多。
仅仅解释SwitchMap和MergeMap的区别就足够写一篇文章了。
学习Angular就像是克服所有这些挑战,有时还得攀登陡峭的山坡一样,是一段非常漫长的旅程。
登上那座山之后,可以看到壮丽的风景,但是经常有太多人因为坠落而死,令人恐惧不已。
我觉得Angular团队确实在处理这个问题。
与RxJS的兼容性
如果听到Signal的提议,我认为以下的反驳可能出现。
useSignalを導入するくらいなら、asyncパイプをなくしてRxJSとの相性をよくすればいいだろう
然而,正如上述所述,对于初学者而言,RxJS的学习曲线实在是太陡峭了。
不要忘记这个事实。
因此,应该欢迎Signal。
因为承诺要注意与RxJS的兼容性,所以这就是为何。
如果在Angular中添加类似于toObservable、fromObservable的函数,并且可以在模板中像Signal一样使用,或者在RxJS流中使用,我认为没有人会抱怨!
使用异步管道也是很麻烦的吧。
如果我能在模板中使用Observable而不需要使用async pipe,那么作者认为即使圣诞节再也不来也没问题。
总结
最近,关于Angular的令人兴奋的讨论正在变得越来越少,我认为这种话题性对于Angular来说也是一件好事情。
总之,我认为Angular发出的信息是“我还没死呢?哈哈”,这一点不错。
希望大家都能感到兴奋。