-
Notifications
You must be signed in to change notification settings - Fork 761
This issue was moved to a discussion.
You can continue the conversation there. Go to discussion →
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
组件化 or 分层 #50
Comments
我是组件化党,看了叔叔的文章,我已经变成了分层党 😂 |
学习 |
受管控的代码编写机制,这个如何理解?是不是提供类似组件的生命周期的hooks,在业务逻辑的特定时期做特定的事情? |
不是这意思,是:写出来的东西可被分析,不到执行的时候就能明确你的意思。 |
组件化其实是模块化的一种形式,而设计良好的模块化,其model和view是可以单独复用的,只需要将类型约束在VM层实现的接口即可。而VM层其实也应该可以替换其实现。最终分层都通过接口类型来约束。 MV*是分形的,而前端的组件化,其实是把一个有完整内部逻辑的MV*模块,视作一个view层组件。这本质上只是模块化的一种特例而已。 分层和模块化都是很重要的,但组件化只是它们的一种实现,不足以与它们相比。所以在这个角度,分层当然是优先于组件化的。 |
This issue was moved to a discussion.
You can continue the conversation there. Go to discussion →
从大的方面说,我是一个很坚定的分层党,而不是组件化党。
在之前这篇中,我详细阐述过这方面的看法,到现在回头看,里面有些细节待修补。大致总结一下观点如下:
这两者的区别在于复用方式。
对于组件来说,我们期望的复用方式是传递不同的参数,以达到不同形态和行为。我们需要在编写它的时候,审慎地考虑参数的设定,并且,在使用的时候,需要考虑版本变更所带来的影响。比如说,修改了一个组件,这个修改会传导到所有使用了它的链路上,因此,你的修改会需要作“是否兼容”的判断。
对于模板来说,它并不存在”复用“这个事情,我们只把它视为一次性的,如果说这个上面想要存在什么复用,我们用 snippets 去承载它。一旦一个模板被创建,它的变更仅影响自身,没有依赖链路。
仅从上面的内容来看,这些观点显得可能很非主流,甚至看上去跟我自己早先的一篇回答都是不兼容的,而且,我们通常都认为,组件化是批量制造的基础。那么,为什么我会有这样的观点呢?
这取决于我们对“模板”这个东西的认知。
从使用代价的角度看,一旦你在比较大的组件上追求可复用性,那必然会面临这样的问题:
越是大粒度的东西,要满足不同情况,必定会有越多的可配置项。一旦你的配置项多了,单个组件搞出 10 个以上的属性,或者有些配置项很复杂了,比如要搞得像 React 的 renderProps 那样,这种挖了很多洞的组件,跟不组件化到底有什么区别?
仔细想想,大部分场景下,它们真的一定要组织成这样吗?你为了把 A 弄成一个可复用的东西,所以要这么绕一圈,但如果你从来不把 A 视为一个可复用的东西,而是把其内容拿出来作为 snippets,用的时候在 B 和 C 里各写一份,到底会影响什么呢?
所以,很大程度上,如果你过于追求在大粒度组件上的可复用性,一定会导致抽象上的高复杂度,在这个层级的抽象,其实意义很小,还因此引入了一个依赖树的管理复杂度,性价比不高。在业务上做抽象的时候,需要慎重地权衡组件抽象所引入的代价。
从更大的角度看,如果一个组件存在非常多的可配置项,那就等同于把所有配置项及其变更逻辑抽离到一个承载容器中,剩下的部分只负责渲染。
所以,从这个角度看,真正的视图仍然是分层的,分出来的那个展示部分都可以泛指为模板。至于分层到什么形态,是函数式、流、OOP,那都是各框架自身所倾向的方法论,并不影响把视图隔离出去这么一个明显“分层”的动作。
此时,视图不过是逻辑容器的附属物,可以视为是一种配置而已。
下面,我们顺带探讨一下“模板式写法”,从这里开始,提到的“模板”都是这个含义了。
很多人感觉,模板这个东西,在组件化体系里显得很违和。这取决于你从什么角度理解了。
注意下面这个论断:
如果从这个角度去看,那“模板”这个东西在组件化体系里就是自洽的了。我们整体上仍然是以组件化的方式来生产软件,只是在写视图的时候,采用了一些声明式的配置来简化其描述过程而已,并不会因为这么做了,就导致组件化的大方向出现偏差。
不仅如此,我们还发现了,如果以这种方法论来进行业务软件的前端开发:
之后,我们可以很便利地做可视化的页面搭建系统:
整个过程,彻底绕开了复杂的技术难点(你想自己解析 JSX 吗?),而且,在产品实现上也能够很平衡。在一个相对稳定的体系中,将视图和逻辑分开进行管控和复用,可以营造出门槛很低的可视化开发系统。
从整个体系来看,需要编写代码的那种组件在平台上被视为黑盒(或者是一个无限小的质点),大粒度的业务视图看作大块的平面,逻辑与数据成为骨架。整个业务系统的开发过程就是:
在骨架上铺设表皮,表皮上嵌入适当的瓷砖或者马赛克(组件)
如上所示:分层与组件化同时存在,组件化不是一个直接切到底的东西。
The text was updated successfully, but these errors were encountered: