全栈不能保证一定能够解决复杂的问题, 但却能帮你打开解决复杂问题的大门.
近些年,前端技术变得愈发复杂。这一趋势除了导致全球变暖,也让全栈开发的难度越来越大。
但是,阻碍一个后端开发去写页面的根本原因到底是什么呢?
我认为是开发环境的搭建,如果环境变量准备好,可以用自己平时使用的IDE直接写代码,刷新就能看效果,这事貌似可行。
那么如何解决这个问题呢?
我觉得终极解决方案是用一门编程语言同时写前后端代码。
Kotlin配合DSL就可以。
DSL
DSL(Domain Specific Language),领域特定语言。专注于一个方面而特殊设计的语言。
比如SQL是数据库领域的DSL。
特点
- 只描述和解决特定领域
优势
- 语义更明确,直观
- 可以屏蔽数据结构和技术细节,由领域专家编写
缺点
- 额外的理解、学习成本
- 抽象设计难度高,需要平衡表现力和实现成本。
比如描述2天前的时间,你可以定义为
2 days ago
也可以是
new Date().before(2, DAY)
这又引出了DSL的2种分类
- 内部(Internal)DSL,借助宿主语言(如:Scala、Kotlin)实现。和提取函数方法不同,提供了一套更接近自然语言的语法表现形式
- 外部(External)DSL,语言无关,需要自定义语法并实现解析器。比如 XMl、YAML
kotlin DSL
Kotlin 借助 Lambda + Extensions扩展 来实现内部DSL
expression函数的入参是一个Expression.() -> Unit类型的lambda。未简化的代码为
简化后借助 Lambda argument should be moved out of parentheses 变为
是不是有DSL内味了
kotlinx
kotlinx.html 是一个通过DSL构造HTML的kotlin扩展库。
本质上是通过kotlin定义好了一套htmlTag类。
DSL定义
生成的HTML
在此基础上扩展并封装UI组件,达到简化开发成本的目的。比如
封装bootstrap4的header资源引用
封装基于bootstrap4的dropdown
封装基于bootstrap4的table
则View层代码为
浏览器效果

通常table的最后一列为action列,所以table rows类型为List Unit>>,可以传入html元素
其他
Javalin
示例项目使用了Javalin
Javalin is more of a library than a framework. Some key points:
You don't need to extend anything
There are no @Annotations
There is no reflection
There is no other magic; just code.
想必你也听得出是在影射哪个框架
结论
- kotlinx.html可以作为jsp、FreeMarker这类模板方案的替代,优势是无需在两种语法之间切换。
- 如果没想清楚如何解决问题,那DSL不是一个好的选择