响应式系统与 React | 青训营笔记

127 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

一,React的历史与应用

1.React的历史

  • 2010年Facebook在其PHP生态中引入了xhp框架,首次引入了组合式组件的思想,启发了后来的React的设计。

  • 2011年Jordan Walke创造了FaxJs,也就是后来的React原型:

  • 2013年React正式开源,在2013 Jsconf上Jordan Walke介绍了这款全新的框架:

  • 2012年在Facebook收购Instagram后,该Faxus项目在内部得到使用。Jordan walke基于FaxJs的经验,创造了React。

  • 2014年–今天生态大爆发.各种围绕 React的新工具/新框架开始涌现…

2. React的应用

  1. 前端应用开发,如Facebook,Instagram,Netflix网页版。
  2. 移动原生应用开发,如Instagram,discord,Oculus。
  3. 结合Electron,进行桌面应用开发。

二,React的设计思路

1.响应式编程

  1. 状态更新,UI自动更新。
    “状态更新,UI不会自动更新,需要手动地调用DOM进行更新。”
  2. 前端代码组件化,可复用,可封装。
    “欠缺基本的代码层面的封装和隔离,代码层面没有组件化。”
  3. 状态之间的相互依赖关系,只需声明即可。
    “UI之间的数据依赖关系,需要手动维护,如果依赖链路长,则会遇到“Callback Hell”。”

三,函数式,响应式,react之间的关系

函数式提供的是底层抽象能力。

而业务是由一个个模块实例组成的,这些模块实例是承载了业务逻辑的对象,而不是数据。

OOP不过是以类和this为载体对模块进行组合,而模块组合的核心问题是依赖管理,依赖注入。依赖注入是以依赖描述为前提的,OOP的annotation就是在描述依赖。

函数式其实也可以实现对依赖的描述,比如hooks的API设计。

实现响应式必须依赖一个持有数据的对象,而这一对象显然自身是mutable的而它持有immutable的数据。使用immutable+diff来实现响应式是个性能大杀器,把变更信息转化为结构变化,再diff出来是完全没有必要的。这里可以点名批评redux。

而redux这么做的原因本质上还是react内部实现太不reactive,官方从未提供对数据的响应式封装(vue reactive/angular rxjs),和将响应式数据高性能接入view的能力(angular async pipe)。

可以说是完成度低,又缺失了关键能力的view-library。(react根本算不上framework,可是连library都做不好也太失败了)