一切的开始
1989年的某一天,在cern(欧洲核子研究实验室)上班的老李(蒂姆·伯纳斯·李)向领导提出了一项提议:Information Management(信息管理),Information Management是为了方便全世界的研究人员分享和更新信息。(在1989年,研究机构交换信息以发邮件为主,这个非常不方便,而且实时性很差。)
领导觉得可以,就让老李放手去干。于是在1990年,老李以超文本语言HTML为基础在NeXT电脑上发明了第一个浏览器:WorldWideWeb。并且搭建了历史上第一个网站:info.cern.ch/。
世界上第一个浏览器:
世界上第一个网站:
然后,互联网时代正式宣告来临。
逻辑的诞生
1991年,老李开始大肆推广他的Web理念,并且在1994年,老李带头成立了W3C(万维网联盟),该组织主要制定和推广网页技术的规范。
老李的努力没有白费,一些机构、公司也开始尝试开发浏览器。其中最成功的是网景浏览器,有多成功的?网景公司在1994年成立,只花了4个月,就用他们的浏览器:Netscape Navigator占据了四分之三的市场。
很快网景发现100%静态的HTML网页带给用户的体验很差。举个例子,在注册页面,用户需要输入自己的信息,然后点击注册按钮将信息发送给后台去录入数据库。但是如果用户忘记输入自己的年龄,那么只有后台在收到信息后才能反馈错误给用户,提醒用户要把自己的年龄也填写好。基于当时的网络速度,这种交互模式体验是非常差的。所以网景的高层希望有有一种语言可以嵌入的浏览器中,能够帮助让网页更加动态化,比如判断输入框中是否有文本。
1995年,布兰登·艾克接下了这个活,花费的10天时间他设计出了JavaScript的第一版,并被网景命名为Mocha,后来又改名成了LiveScript,最后和Sun达成协议,改名为JavaScript。那么Java和JS到底有什么关系呢?答案是没有关系,最多算是个李逵和李鬼的关系。
随着JS的嵌入,网景浏览器的用户体验远超市场上同类产品。1996年,网景浏览器的市占率到达了90%左右。
网景1.2:
楚汉争霸
随着老李对Web理念的推广,万维网的影响力越来越大,用户也越来越多。网景也成为了很多互联网企业眼红的对象,其中眼睛最红的是谁呢?微软。为什么呢?因为当时Windows系统的市场占有率非常高,1995年Windows发售总量就超过了1亿套,没理由在自家系统上让用户去安装三方的浏览器。所以微软打响了楚汉争霸的第一枪,那么微软对网景发动了哪些进攻手段呢,如下:
- 1995年,微软打响了第一枪,开发出了IE浏览器,并且透过win95搭售。
- 逆向了网景浏览器,基于JavaScript实现了JSctript,并且内置于IE3。
- 光速迭代,与网景打功能战。
- 开发非标准的专属标签,令某些网页只能在IE中才能使用。
- 要求主机厂商在桌面展示IE图标,并且不能使用网景,否则涨价。
- 率先支持CSS,让网页设计者更愿意制作支持IE的网页。
- 在服务器行业与网景打价格战,打击网景的主要收入来源。 面对微软的挑衅,网景也发动了反击:
- 将JavaScript提交到了欧洲计算机制造商协会(ECMA),促进其国际化。
- 光速迭代,与微软打功能战。
- 开发非标准的专属标签,令某些网页只能在网景中才能使用。 最终的结果可想而知,面对微软这种巨无霸企业,网景还是没有逆天改命。这一次浏览器大战以微软完胜告终。
这一次浏览器大战主要的影响其实只有一条:ECMA以JavaScript语言为基础制定了ECMAScript标准规范。
网景在1999年被收购,但是在收购前,网景开源了当时最新版本的浏览器代码,并且核心成员组织成立了非赢利性组织Mozilla,也为网景留下了一颗种子。
懒惰的程序员
Web的发展出乎预料的顺利,网页需要承载的内容也在爆炸式的增长,传统的静态网页经常无法完成某些需求。举个例子:1995年,C国鸟类研究院数据库中存有约1000种鸟类信息,研究院想要做一个网站,用于展示数据库中的所有鸟类信息。如果使用静态页面来做,那么就需要将数据库中的1000种鸟类做成1000个HTML文件,部署在服务器上。这无疑是一个巨大且繁琐的打字工作,那么作为一名懒惰的程序员,你有什么想法呢?
1000个HTML文本格式其实是一样的,所以只需要开发一个程序,从数据库中依次读出1000种鸟类的信息,然后对应生成1000个HTML文本即可。当数据库有更新时,只要再次执行该程序,重新生成HTML文件。
那么爱偷懒的程序员满足了吗?没有,程序员甚至懒得去跟随数据库更新去执行程序,所以懒惰的程序员把这个程序也放在服务器上,当用户想看哪个鸟类的信息时,Web服务器自动执行程序,程序根据鸟类名称动态生成一个HTML文件让Web服务器发送给用户。这样就实现了网页和数据库的同步。
这就是动态网页技术,PHP、ASP、JSP的原理都是如此。
1998年,C国鸟类研究院记录的鸟类达到了10000种,并且提出了新的需求,需要做一个鸟类列表,将10000种鸟类的简要信息放在一个页面中展示。但是10000种鸟类数据一次性返回数据量过大,那么作为一名程序员,你有什么想法呢?
做翻页,每页展示20种鸟类数据,更具页码来动态生成对应页面的HTML文本。
但是翻页体验较差,无法在一个页面中看到所有鸟类信息。改造后,默认展示20种鸟类信息,页面滚动低再加载20种,如此往复。但是这个方案存在一个明显的问题:由于HTML文本完全是由后台生成的,所以每次加载新的20种鸟类信息,后台都需要完全重新生成HTML文本。当用户滚到所有数据都展示的时候,就是把10000种鸟类一次性返回。那么这个问题怎么解决呢?我们放到后面再说。
群雄逐鹿
在网页技术发展的同时,IE依靠着Windows系统这一强大后盾,迅速占领了浏览器市场,在2002年IE的市占率达到了恐怖的96%。但是微软的IE其实有着非常致命的几个问题:
- 一战期间功能战遗留下了很多安全问题,导致很多恶意程序入侵事件。
- 后续版本不尽人意,饱受用户质疑。
- 作为独裁者,IE并不遵循W3C的标准,IE成了事实标准。
而随着浏览器技术的成熟,优秀的浏览器如雨后春笋般冒出,浏览器市场开始形成群雄逐鹿的情景。
我们先来看一下参赛选手:
| 厂商 | 浏览器 | 首版发布年份 |
|---|---|---|
| Microsoft | IE | 1995年 |
| Opera | Opera | 1996年 |
| Apple | Safari | 2003年 |
| Mozilla | Firefox | 2004年 |
| Chrome | 2008年 |
由于市场上存在众多的浏览器,而每个浏览器都多少存在一些差异。导致当时很多小网站由于开发资源的问题往往无法全部照顾到,所以网站维护人员往往会在首页标明推荐使用的浏览器。但是这种问题是不会困扰到程序员的,为了解决不同款浏览器之间的适配问题,二战期间涌现出了一批前端兼容性框架,其中jQuery独领风骚,几乎成为了当时网站的标配。也使企业级Web成为了可能。
说回二次大战,虽然IE不够好,但是毕竟根深蒂固,想要在IE手上沾到便宜还是非常困难的。举个例子,5个人赛跑100米,有一个人已经跑出去50米了,另外四个人怎么才能超过他?最好的方式就是想办法把大家拉回同一起跑线。2004年,Mozilla、Opera在W3C主办的研讨会上提出了HTML5的雏形,但是并没有被通过。这直接引起了Mozilla和Opera两个公司的不满,然后拉上了Apple,成立了WHATWG组织(网页超文本技术工作小组)。在2007年,该组织再次建议W3C新的HTML工作组采用完善后的HTML5规范作为新的工作起点,被采纳。
从这开始,各个浏览器都以支持HTML5新特性与提升JS运行效率为主要目标,促进了浏览器的良性竞争。在这一次浏览器大战中,虽然Chrome最后出现,但是从发布开始一直攻城略地,打败了其他浏览器,成功占据了浏览器市场的半壁江山。2015年,微软宣布IE不在是Win10的默认浏览器,并且在2021年发布的Win11中彻底删除了IE。
二战的影响要远远大于了一战,由于浏览器之间的良性竞争:
- Web技术规范极大的得到了纠正。
- 出现了V8等优秀的JS引擎,JS执行效率明显提高。
- HTML5的普及让Web有了更多的可能。
前端的独立
还记得上面C国鸟类研究院的那个问题吗?为了解决类似的问题,出现了一项新的革命性技术AJAX(Asynchronous JavaScript and XML)。
AJAX提供给网页在不刷新页面的情况下从后台获取数据的能力,这为网页前后端分离打下了基础。
AJAX的最早是在1998年就被微软实现,但是真正流行是在2005年前后,原因是谷歌在推出的谷歌邮箱、谷歌地图等产品种大量使用了AJAX技术,并且效果非常好。
随着HTML5的流行,网页承载的内容越来约丰富,动态网页的开发模式已经不适用于日渐成长的网页了。
我们先来看下动态网页的开发模式:
简单来说就是前端工程师在完成HTML页面开发后并不能独立调试,必须集成进JSP框架中才能在浏览器中打开,而且由于大部分工作都被后端工程师承接了,导致前端工程师成为了不那么重要的角色,甚至更多的情况下,不存在前端工程师这一个职位,都是由后端工程师来操刀。
在这种开发模式下,HTML5带来的丰富特性反而降低了整体开发效率,所以前端的独立是必然的。
借助AJAX技术,JS发送请求到后端服务器获取数据,然后通过操作DOM在必要的时候动态加载出所需要内容,让前后端分离成为了现实。伴随着SPA(Single Page Application)概念流行,涌现出了很多前端框架,比如React,Angular,Vue等。
采用SPA技术实现的前端网页往往在最初只会返回给浏览器一个空白的HTML结构,在浏览器执行完一次JS脚本后,才会插入首屏的内容。
这种方式称作客户端渲染-CSR:
借助前端框架,前端程序员可以很轻松实现复杂需求,管理好更多的代码,但是仔细思考后这其实是一个恶性循环,因为大部分的代码都被丢到了用户的浏览器中去执行,如果用户的设备性能较差,那么在网站功能越多,用户的体验就越差,特别是在首屏展示的时候。
并且CSR还会导致另一个问题:SEO(Search Engine Optimazition),SEO的原理是利用爬虫获取HTML文本中的内容,然后对网站进行排序,内容约丰富并且约符合搜索需求的网站,会被排到前面。但是CSR往往只会返回一个空白的HTML文本,因哪怕是首屏页面也需要执行完一次JS脚本之后才会被创建出来。
如果Web服务器可以将首屏的HTML完整的输出给浏览器就舒服了。但是这样做是不是又回到了动态网页时代呢?不是的,注意,只是首屏,并且项目依旧还是基于前端框架来实现的。那么就意味着需要赋予Web服务器执行JS的能力。所以,前端程序员们先到了Node.js,借助Node.js的能力,Web服务器也可以运行JS代码了,所以在用户打开网页的时候,Web服务器会先执行下JS代码,将首屏HTML文本生成之后再返回给浏览器。
这种方式被称作服务端渲染-SSR:
CSR-SSR:
但是SSR也并非是必须的,需要开发者考虑投入产出比,比如大部分应用系统都不需要SEO,而且首屏时间并没有非常的慢,如果使用SSR反而小题大做了。