第2章 编程语言

编程语言不仅仅是一种技术,也是一种习惯性思维。

——摘自《黑客与画家》

开发iOS应用可以选择Objective-C或者Swift,开发Android应用可以选择Java、Kotlin甚至Scala,服务端编程语言更是数不胜数,比如PHP、Java、Go等。而前端的编程语言始终只有HTML、CSS和JavaScript,而且严格来讲,只有JavaScript才能被称为编程语言,HTML是一种标记类语言(Markup Language),CSS是一种样式语言(Style Language),两者更倾向于DSL(Domain Specific Language,领域特定语言)范畴。当然,我们可以期待WebAssembly的进一步完善和普及能够给前端带来更丰富的编程语言选择。

技术栈单一的好处是初学者有明确的学习方向,不必像其他领域的开发者一样纠结于编程语言的选择;然而长期使用固定的编程语言很容易令开发者形成思维定式,缺乏跨领域思考和解决问题的能力。技术演进与架构设计不仅以本领域技术栈的特征为基础,同时也需要在其他领域汲取灵感,比如被Vue、React、Angular等流行前端框架广泛采用的MVVM(Model-View-ViewModel)架构模式便借鉴自WPF。[1]

从架构层面思考编程语言一是为了选择适用于业务的架构模式和技术选型;二是根据语言特征制定技术规范和开发范式可提高个人以及团队的开发和维护效率;三是由于前端编程语言的单一性,“编程语言仅仅是一种工具”这种论调并不适用于前端。以JavaScript为例,虽然宏观架构并非必须深入语言的每一个技术细节,但是必须将某些非常关键的特征作为架构设计的重要考量因素,比如弱类型、异步编程等。

本章以上述三个方向为切入点,阐述在前端技术架构设计中于编程语言层面的考量,包括:

● 服务端渲染和客户端渲染HTML的对比。

● 使用预编译和后编译技术弥补CSS编程的缺陷。

● 为JavaScript加入强类型和数据不可变性的必要性。

● JavaScript异步编程的方案选择。