1.1 前端技术的发展
纵观整个前端发展史,我们可以发现,几个关键的时间节点都是和重大的技术飞跃息息相关的,如Ajax的诞生、Node的问世等。笔者将结合这几个点,和大家一起回顾和展望前端开发的历史发展轨迹和未来发展前景。
1.1.1 从静态走向动态
最初的网页是欧洲粒子物理研究所的科学家为了方便查看共享文档和论文,而基于XML(Extensible Markup Language)语言创造的,这也是为什么在前端开发中,最重要的全局对象被称为document而不是context、page、application等的原因。当时,网页只具备文本图片的显示及页面间相互跳转(Hyper Link)的功能,因此人们称为HTML(Hyper Text Markup Language)。
最初的Web,功能十分单一,开发也并不复杂。开发者先把写好的网页放在服务器指定位置(网站根目录)下,然后将映射URL分享给使用者,使用者在浏览器地址栏输入URL即可访问网页内容,如图1.1所示。
图1.1 早期的浏览器和网页
早期的HTML作为静态文件,即使只有部分内容是需要变动的,那么有多少种变动的可能性,就需要准备多少份文档,这对开发者来说是非常不友好的,并且无法与用户进行交互。
CGI(Common Gateway Interface)的出现改善了这一情况。CGI作为服务器拓展功能,可以从数据库或者文件系统获取数据,在将数据渲染为HTML文档后,返回至客户端,从而实现了网页的动态生成。在接收到用户请求后,CGI还可以在服务端进行处理,并返回对应的处理结果,如图1.2所示。
图1.2 动态网页渲染流程
CGI被广泛认为是服务端脚本语言的鼻祖。然而,它也有着非常致命的缺陷。首先,CGI每接收到一个请求,都会新开一个进程进行处理,占用服务器的CPU和内存,当请求量成千上万时,服务器可能无法支撑以致崩溃。其次,黑客很容易通过不完善的CGI程序非法进入开发者的服务器系统,这从安全方面来考虑是绝对不允许的。
以后来人的角度来看,笔者认为CGI出现的最大意义就是给当时刚起步的Web提供了一个发展方向。在这之后,PHP、JSP、ASP等各种服务端语言层出不穷,不仅弥补了CGI的缺陷,而且在性能上愈加高效,在开发上愈加简捷。这些语言的出现和广泛应用,使得Web技术飞速发展,前端网页从此从静态走向动态,这个时代被称为Web 1.0时代。
1.1.2 从后端走向前端
在Web 1.0时代,前后端是如何协作的呢?由于网页是在服务端使用动态脚本语言和模板引擎渲染出来的,所以一般由前端先写模板,写好后交付给后端套用,之后再由前后端联调,以确认模板套用无误。
在这种开发环境下,前后端耦合密切,项目开发需要很高的沟通成本。在模板引擎的变量、判断和循环、宏区块等语法糖的支持下,前端也可以拿到环境变量来实现部分业务逻辑。如果前端开发者表现得稍微弱势一些,就很有可能被后台摁着在视图层实现一些业务代码。同时,整个项目的代码质量也随之降低。
网站的这种组织架构还会带来另外一些问题。比如,页面哪怕仅有一小块内容需要变更,浏览器也需要重新请求和渲染整个页面。一方面,网站资源的传输耗费了更多的时间;另一方面,页面重载的用户体验也十分糟糕。
举个例子,用户在登录页面输入了错误密码时,服务器要将校验信息渲染到页面并传给浏览器。实际上,页面只是多了一行类似于“密码错误”的提示,然而网站资源却需要重新进行传输,同时页面还会丢失用户输入的表单数据(即便到了今天,这种现象依然可以在一些政府和国企的老旧网站中看到)。
当时虽然出现了各种页面和数据的缓存技术,稍有成效地缓解了这一问题,但也无法从根本上解决问题。于是,从事Web的前辈们开始探寻其他一些解决方案,如Ajax异步数据加载。
Ajax(Asynchronous JavaScript And XML,异步JavaScript和XML)通过XMLHttpRequest对象,可以在不重载页面的情况下与Web服务器交换数据,再加上JavaScript的document对象,开发者们可以很轻松地实现页面局部内容刷新。
从1999年开始,ActiveX和XMLHttpRequest陆续问世,Ajax的星星之火渐渐燃起。时间推移到2005年,互联网巨头Google发布了全面使用Ajax打造的Gmail(如图1.3所示)和Gmap两款应用。人们惊讶地发现,原来使用异步数据传输获得的应用体验是如此地良好。自此,Ajax获得了井喷式的发展。
图1.3 Gmail使用界面
得益于Ajax的发展,前后端分离的趋势日渐明显,前端不再需要依赖后台环境生存,所有服务器数据都可以通过异步交互来获取。在取得一个良好定义的RESTful (Representational State Transfer,表述性状态转移)接口后,两端甚至可以在零沟通成本的情况下并行完成项目任务。
随着Google V8引擎问世、PC和移动端设备性能提高、ES6和H5日趋成熟,浏览器端的计算能力和功能性似乎愈加过剩,开发者们开始将越来越多的业务逻辑代码迁移到前端,前端路由的概念也逐渐清晰。
路由这个概念首先出现在后台。传统Web网页间的跳转,需要开发者先在后台设置页面的路由规则,之后服务器根据用户的请求检索路由规则列表,并返回相应的页面。而前端路由则是在浏览器端配置路由规则,通过侦听浏览器地址的变化,异步加载和更新页面内容。
可以这么说,Ajax实现了无刷新的数据交互,而前端路由则实现了无刷新的页面跳转;Ajax将Web Page发展成Web App,而前端路由则给了Web App更多的可能,如SPA(Single Page Application,单页面应用),如图1.4所示。
图1.4 单页面应用CSPA
Angular、React、Vue等知名的前端框架都有前端路由的概念。在之后的章节中,笔者会专门讲解前端路由的实现原理和Vue.js项目的核心内容之一——Vue Router。
现在,很多Web项目采用这样的架构,后台只负责数据的存取和组装,而前端则负责业务逻辑层和视图层的全部工作。这一路走来,项目重心已从后端转移到了前端。
1.1.3 从前端走向全端
下面是笔者在2018年春节时,在CSDN(国内的技术交流社区)的官网上截取的一张图,如图1.5所示。读之深有体会,有兴趣的同学可以细细品味,这里不再多作赘述。
图1.5 2018年CSDN春联
若要说2009年Web界最为爆炸性的新闻,那一定是Node.js的问世。
2009年2月,一个名叫Ryan Dahl的开发者在博客上宣布准备基于Google V8引擎创建一个轻量级的Web服务器并提供一套组件库。
同年5月,Ryan Dahl在GitHub上发布了最初版本的Node.js,这标志着Node.js的诞生。从此,Javascript也占据了服务端编程语言的一席之地。前端工程师可以以很低的成本用Node.js和MongoDB搭建一个后台。乍一看,前端工程师和全栈工程师之间的距离,只在于一个DataBase(数据库)。
从Node.js诞生至今,无论是新手还是专家,大批量地涌入Node社区,大家围绕着项目,使用并贡献着自己的力量,努力使之适用于更多的应用场景。这些年来,人们对Node.js褒贬不一,但毋庸置疑的是,它的问世必是前端发展史上浓墨重彩的一笔,如图1.6所示。
图1.6 Node.js主页
这两年来,随着微信小程序和支付宝小程序的问世,前端技术早已超脱了Web和Hybrid应用的范围。前端工程师很容易基于固有技术栈快速上手和开发小程序类微应用。以微信小程序为例,框架使用语法通用的WXML代替HTML、WXSS代替CSS,开发语言由HTML+CSS+JS变为WXML+WXSS+JS。此外,与Vue.js一样,它们也是MVVM模式,如图1.7所示。
图1.7 微信小程序开发
2018年3月20日,IT技术圈里又爆出一热搜新闻:小米、中兴、华为、金立、联想、魅族、努比亚、OPPO、vivo、一加十厂联合共建“快应用”的标准和平台。
快应用类似于小程序,不用下载和安装即可使用和生成桌面快捷方式,但有区别的一点在于,快应用不必依赖于微信或者支付宝这样的第三方平台,它是手机厂商从系统应用层面支持的。对于前端工程师来说,这又是一则喜讯,因为开发快应用使用的也是前端技术栈。
可以预见,未来的前端和前端衍生技术很有可能遍布从Web到桌面应用,从PC、移动端到智能电视、游戏机等的各个角落。
未来的工程师也许只分为两种,一种是负责数据方面的云端工程师,另一种则是全端(前端)工程师。