全棧不能保證一定能夠解決複雜的問題, 但卻能幫你打開解決複雜問題的大門.
近些年,前端技術變得愈發複雜。這一趨勢除了導致全球變暖,也讓全棧開發的難度越來越大。
但是,阻礙一個後端開發去寫頁面的根本原因到底是什麼呢?
我認為是開發環境的搭建,如果環境變量準備好,可以用自己平時使用的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不是一個好的選擇