基于MVC的范式写React应用

广告位招租
扫码页面底部二维码联系

从大约两年前开始写 nautil,从一开著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】始主要目标是创造一个跨平台开发的框架,现本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】在来看,这个目标开始有所转变了。以前觉得【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。跨平台开发是趋势,是一项重要工作,是亮点【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。,但随着时间的推移,我越来越觉得,跨平台【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。是一种技巧,而不是一种技术。在我长期以来本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】的开发中,我逐渐意识到,项目工程的可靠性【未经授权禁止转载】转载请注明出处:www.tangshuang.net是团队/个人开发的重中之重。如何让一个项【本文首发于唐霜的博客】【原创不易,请尊重版权】目的代码组织更加合理呢?特别是以 rea原创内容,盗版必究。【原创内容,转载请注明出处】ct 为基础的应用中,怎么去更好的组织码【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net流(代码顺序和引用)?

【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。

代码写的多了以后,追求一种抽象的范式。所著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。谓范式,是在方法范畴层面更广的风格。我发【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net现在前端领域,react 和 angul【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】ar 是两个极端,react 是只关注视【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】图更新,不断深入,寻找各种方式提升视图更【原创内容,转载请注明出处】【原创不易,请尊重版权】新性能,但是在工程性上完全放飞,性能代码原创内容,盗版必究。【版权所有,侵权必究】量全部由开发者自己去处理。而 angul【转载请注明来源】【版权所有,侵权必究】ar 反过来,它根本不关注(或者说不是卖著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】点)视图更新问题,angular 沿用了【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】 angularjs 时代的脏检查思路,转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。只是做了优化,做到了没有 digest,著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。只需要一次检查;而在工程性方面,angu著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】lar 想尽一切办法约束开发者,因此,a著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。ngular 的语法多得多,所以学习曲线【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】比较漫长,但是我个人认为收益会很大,其中【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】,引入 typescript 以静态类型【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net语言的风格编写应用程序,会让应用更加健壮转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net(但编程的灵活性降低,同时增加了类型编程未经授权,禁止复制转载。原创内容,盗版必究。的麻烦/乐趣),引入 rxjs 让事件处【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。理从原始的 single push 模式【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】升级为 multiple push 模式【原创内容,转载请注明出处】【转载请注明来源】,增加了事件处理的灵活性;angular原创内容,盗版必究。【作者:唐霜】 具有 module 和 service【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】 的概念,module 可以认为是一个业未经授权,禁止复制转载。原创内容,盗版必究。务模块(和 react 中的 compo【未经授权禁止转载】【作者:唐霜】nent 概念相似但不同),包含该模块的【未经授权禁止转载】本文作者:唐霜,转载请注明出处。所有信息,并通过工具进行解析构建;ser未经授权,禁止复制转载。原创内容,盗版必究。vice 为模块提供处理能力,可以通过 【原创内容,转载请注明出处】【本文首发于唐霜的博客】angular 特殊的依赖注入完成比较魔【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。法的写法。

【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。

而在 react 的生态中,除了 nex未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。tjs 比较知名外,还没有比较成熟的工程【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net框架方案。而且 nextjs 走 ssr【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。 路线,更像是以前的 php 换 nod【转载请注明来源】原创内容,盗版必究。ejs 来过一遍,而非纯前端(运行时)的转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net方案。于是,我想写一个框架来融合各种优秀【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net理念(大部分其实还是我自己的),提供一种【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】可靠的工程性框架的可能性。市面上其实也有【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。一些自称为 react 框架的方案,比如著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net dva,但是实际上大部分 react+【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netredux+react-router 的未经授权,禁止复制转载。【原创不易,请尊重版权】项目,就可以称自己为框架,但是,这类框架【未经授权禁止转载】【本文首发于唐霜的博客】仍然停留在视图层编程的层面,没有上升为工【原创内容,转载请注明出处】【原创不易,请尊重版权】程性框架,没有提供真正的编程范式。而写 【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】nautil 之初是为了实现跨端开发,但【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】是,随着慢慢深入开发,我发现 nautil 有可能成为真正的对标 an本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。gular 的 react 工程性框架本文作者:唐霜,转载请注明出处。

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

首先,前端应用需要区分数据、界面和事件,本文作者:唐霜,转载请注明出处。【作者:唐霜】而类似 dva 之类的框架,你按照它的写本文作者:唐霜,转载请注明出处。【转载请注明来源】法,永远只会写出把业务逻辑最终杂糅在视图著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。组件中。没有区分数据和界面,是前端项目目【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。前最大的问题。举一个简单的例子,在一段明本文作者:唐霜,转载请注明出处。【本文受版权保护】显只描述业务逻辑的代码块中,你很容易找到著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net一两句用来处理界面的代码,比如打开一个弹著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。窗、颜色变化等。而 nautil 则首先著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】要求开发者有分层的概念在里面,从代码层面著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。看,就是有关业务的代码写在一个或多个文件本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。中,有关界面的代码写在一个或多个文件中,【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。这两者绝对不会出现直接的联系,这也就是 【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.netMVC 中的 M 和 V,同时,需要有一【原创内容,转载请注明出处】原创内容,盗版必究。个东西将它们串联起来,也就是 C。在 n著作权归作者所有,禁止商业用途转载。【本文受版权保护】autil 中编程,很像传统的 MVC 转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】编程,需要写 .model.js, .c【转载请注明来源】转载请注明出处:www.tangshuang.netontroller.js,看上去又回到了未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net MVC 的老路,但是有一点,这里我们避【版权所有,侵权必究】未经授权,禁止复制转载。免了一些坑,我们不可能直接照搬后端的 M【作者:唐霜】【版权所有,侵权必究】VC 概念,后端的 C 才是请求的入口,转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net而在前端 V 才是入口。所以在前端 mo【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】dule 中必须存在视图组建,但可以不存【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】在 controller 和 model未经授权,禁止复制转载。【原创内容,转载请注明出处】

转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

其次,关于事件,我认为是大部分前端容易忽原创内容,盗版必究。【本文受版权保护】略的一个点,很多人认为事件就是事件,很简【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net单,没必要整那么复杂。但是在实际开发中,【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net事件几乎串联了所有业务和交互,可以说,没【未经授权禁止转载】【原创内容,转载请注明出处】有事件处理就没有这个应用。但是大部分编程未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net,都只有事件回调函数,在 react 中著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】通过 on 开头的一些回调来获得 DOM本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net 的事件回调。但是,回调函数的方式比较钝著作权归作者所有,禁止商业用途转载。【本文受版权保护】,当一个动作可能引发一连串非线性的反应的【未经授权禁止转载】转载请注明出处:www.tangshuang.net时候,回调函数是不可能解决的。举个例子,转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】比如我们有一个场景,当用户点击 A 时弹本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】出一个弹框,当点击 B 时需要先放大 B【本文首发于唐霜的博客】原创内容,盗版必究。 元素然后再相当于点击 A。这里点击 B未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net 就是一个会带来一连串非线性的反应的场景著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。,在 jquery 时代,我们可以通过 本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.nettrigger A 的 click 来达未经授权,禁止复制转载。【原创不易,请尊重版权】到这个目的,但是在 react 中,我们转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。无法做到这个效果。而在 nautil 中本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。,我引入了 rxjs 来解决事件处理。普转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net通的回调函数是 single push 【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。模式,只能处理单一线性的任务,而 rxj原创内容,盗版必究。【本文首发于唐霜的博客】s 是 multiple push 模式未经授权,禁止复制转载。【作者:唐霜】,可以处理多向离散任务,同时,由于 rx【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】js 的 Subject 既是观察者也是原创内容,盗版必究。【原创不易,请尊重版权】被观察者,所以多个事件之间可以轻松串联起未经授权,禁止复制转载。【作者:唐霜】来。在 v0.30 之前,我在 Comp未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】onent 中使用 on/off/emi【版权所有】唐霜 www.tangshuang.net【作者:唐霜】t 作为事件的处理工具,但是这种命名仍然【关注微信公众号:wwwtangshuangnet】【作者:唐霜】是传统的事件注册与回调的意味,因此,我改转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。为了 subscribe/unsubsc转载请注明出处:www.tangshuang.net【未经授权禁止转载】ribe/dispatch,虽然只是名字未经授权,禁止复制转载。未经授权,禁止复制转载。的改变,但体现了事件流处理的理念的转变。

未经授权,禁止复制转载。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

最后,Controller 的发明也是非【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。常有意思。一个 controller 观本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。察模型,保管一些用于完成事件到数据交互的【版权所有,侵权必究】原创内容,盗版必究。组件,这些组件只完成交互(事件->【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net数据),而不完成布局和样式,所以细小碎片【版权所有,侵权必究】【原创内容,转载请注明出处】化,但是却形成了另外一种模式:业务不仅包本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。含数据描述,还包含交互描述。通过 Mod【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。el+Controller,我们可以很好【未经授权禁止转载】转载请注明出处:www.tangshuang.net的还原需求文档中有关业务逻辑的描述(一般【未经授权禁止转载】原创内容,盗版必究。需求文档除了描述业务数据本身,还会描述用转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。户的某一个交互所带来的数据变化,而在这个【未经授权禁止转载】【原创不易,请尊重版权】描述中,往往还没有给出具体的界面效果)。【未经授权禁止转载】【未经授权禁止转载】所以,在我看来,一个 Controlle【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。r 其实是一个交互模型,这个交互模型的基【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】础,就是拥有基于 rxjs 的事件流管理【转载请注明来源】【原创不易,请尊重版权】机制。基于这种思想,一个 module 【本文首发于唐霜的博客】【转载请注明来源】除了视图组件和样式文件之外,其他的都是模【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net型(包括 Service 在内,因为它为【转载请注明来源】【原创不易,请尊重版权】业务服务)。只有视图组件是为界面服务的,【转载请注明来源】【本文受版权保护】这就导致我们的开发方式与以往的 reac【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】t 开发方式具有极大的不同,这个不同非常【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。非常大!可以说,视图组件的编写,只占到整本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。个应用的一小部分,而真正的大头应该是在 著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。Model+Controller 上,这【关注微信公众号:wwwtangshuangnet】【作者:唐霜】也符合我们对“业务系统的重点是这实现业务未经授权,禁止复制转载。【转载请注明来源】”的朴素认知。

【未经授权禁止转载】【原创内容,转载请注明出处】未经授权,禁止复制转载。【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。

2021 年已经 5 月了,今年我做 R【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。obust 的期数特别少,因为手上的工作转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。比较多,同时,我也逐渐发现,要完成一些具【版权所有,侵权必究】【本文受版权保护】有挑战的项目逻辑是比较困难的,不是有了想【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】法和行动,就能做到尽善尽美,特殊的场景实【原创不易,请尊重版权】未经授权,禁止复制转载。在太多了,想要做一个完完全全通用化的功能转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net模块,几乎是不可能的,这也意味着,未来还【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。有很长的路要走,而且是不可替代的。

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】
已有3条评论
  1. 1188 2021-05-07 13:35

    nautil看着确实有意思, 有能跑起来的demo吗

    • 否子戈 2021-05-07 13:49

      打算写一个 beautiful-admin 的 demo,有什么建议么?

      • 1188 2021-05-08 13:51

        希望能尽量简单点, 方便理解其中的各种概念.