在使用过React并了解了Angular 2将会是什么样子之后,我感到有些沮丧:这些框架都系统性地强制我使用BFF“页面可替换模式(Screen Scraping)”模式,按照这种模式,每个服务端的API要匹配页面上的数据集,不管是输入的还是输出的 。
弃用MVC之后怎么走?
此时,我决定“让这一切见鬼去吧” 。我构建了一个Web应用,没有使用React、没有使用Angular也没有使用任何其他的MVC框架,通过这种方式,我看一下是否能够找到一种在View和底层API之间进行更好协作的方式 。
就React来讲,我最喜欢的一点在于Model和View之间的关联关系 。React不是基于模板的,View本身没有办法请求数据(我们只能将数据传递给View),看起来,针对这一点进行探索是一个很好的方向 。
如果看得足够长远的话,你会发现React唯一的目的就是将View分解为一系列(纯粹的)函数和JSX语法:
<V params={M}/>
它实际上与下面的格式并没有什么差别:
V = f( M )
例如,我当前正在从事项目的Web站点,Gliiph,就是使用这种函数构建的:
文章插图
图1:用于生成站点Slider组件HTML的函数
这个函数需要使用Model来填充数据:
文章插图
图2:支撑slider的Model
如果用简单的JAVAScript函数就能完成任务,我们为什么还要用React呢?
【为什么我不再使用MVC框架?】虚拟DOM(virtual-dom)?如果你觉得需要这样一种方案的话(我并不确定有很多的人需要这样),其实有这样的可选方案,我也期望开发出更多的方案 。
GraphQL?并不完全如此 。不要因为Facebook大量使用它就对其产生误解,认为它一定是对你有好处的 。GraphQL仅仅是以声明的方式来创建视图模型 。强制要求Model匹配View会给你带来麻烦,而不是解决方案 。React团队可能会觉得使用“客户端指定查询(Client-specified queries)”是没有问题的(就像反应型团队中那样):
GraphQL完全是由View以及编写它们的前端工程师的需求所驱动的 。[…]另一方面,GraphQL查询会精确返回客户端请求的内容,除此之外,也就没什么了 。GraphQL团队没有关注到JSX语法背后的核心思想:用函数将Model与View分离 。与模板和“前端工程师所编写的查询”不同,函数不需要Model来适配View 。
当View是由函数创建的时候(而不是由模板或查询所创建),我们就可以按需转换Model,使其按照最合适的形式来展现View,不必在Model的形式上添加人为的限制 。
例如,如果View要展现一个值v,有一个图形化的指示器会标明这个值是优秀、良好还是很差,我们没有理由将指示器的值放到Model中:函数应该根据Model所提供的v值,来进行简单的计算,从而确定指示器的值 。
现在,把这些计算直接嵌入到View中并不是什么好主意,使View-Model成为一个纯函数也并非难事,因此当我们需要明确的View-Model时,就没有特殊的理由再使用GraphQL了:
V = f( vm(M) )
作为深谙MDE之道的人,我相信你更善于编写代码,而不是元数据,不管它是模板还是像GraphQL这样的复杂查询语言 。
这个函数式的方式能够带来多项好处 。首先,与React类似,它允许我们将View分解为组件 。它们创建的较为自然的界面允许我们为Web应用或Web站点设置“主题”,或者使用不同的技术来渲染View(如原生的方式) 。函数实现还有可能增强我们实现反应型设计的方式 。
在接下来的几个月中,可能会出现开发者交付用JavaScript函数包装的基于组件的HTML5主题的情况 。这也是最近这段时间,在我的Web站点项目中,我所采用的方式,我会得到一个模板,然后迅速地将其封装为JavaScript函数 。我不再使用wordPress/ target=_blank class=infotextkey>WordPress 。基本上花同等的工夫(甚至更少),我就能实现HTML5和CSS的最佳效果 。
这种方式也需要在设计师和开发人员之间建立一种新型的关系 。任何人都可以编写这些JavaScript函数,尤其是模板的设计人员 。人们不需要学习绑定方法、JSX和Angular模板的语法,只掌握简单的JavaScript核心函数就足以让这一切运转起来 。
有意思的是,从反应型流程的角度来说,这些函数可以部署在最合适的地方:在服务端或在客户端均可 。
但最为重要的是,这种方式允许在View与Model之间建立最小的契约关系,让Model来决定如何以最好的方式将其数据传递给View 。让Model去处理诸如缓存、懒加载、编配以及一致性的问题 。与模板和GraphQL不同,这种方式不需要从View的角度来直接发送请求 。
推荐阅读
- 为什么说要用DDD替代CRUD来设计API
- 优化Python代码的4种方法
- 聪明的女人结婚不领证 女方为什么要先办婚礼再领证
- 李想|把游戏机统统搬到车上!李想:我要在理想L9上玩真正的3A大作
- 梦见牛追我但躲开了 梦见被牛追到处躲藏
- 肌肉松弛剂介绍
- 祁门红茶的历史典故
- 吸盘挂钩时间长了为什么会掉 粘钩吸盘老脱落怎么办
- 清朝出现过僵尸吗 僵尸为什么穿着清朝的衣服
- 为什么会有绿帽子的说法 为什么有绿帽子这个说法