# Web的历史3️⃣-Web应用 随着技术的不断发展,尤其是移动设备的普及和移动互联网的发展,使得动态网页对于日益复杂的需求力不从心。 具体地来说,业界开始需求Web的“应用化”,也就是要把网页变成一个应用程序:在以前,我们介绍的动态网页技术可以很好地支持博客,论坛,新闻网站,企业官网等;而现在,我们需要在浏览器上写文件(腾讯文档),聊天(Discord),直播,点外卖,玩游戏(实际上,很多手机APP都是浏览器套壳,本质上就是向你展示一个网页;包括微信小程序,也是一个只可以使用微信内置浏览器打开的网站) 那些开发APP的程序员也很乐意把自己的项目搬到浏览器里,因为用HTML+CSS写GUI非常方便,而且Web😇具有跨平台的特性:你需要付出很多努力才能确保一个传统APP能在手机,电脑,MacOS,Windows,Linux上运行,但是你写网页只需要很轻松地写,不用考虑兼容,浏览器会确保你的网页在这些平台上都能运行。 包括我们的报修系统,也算是一个Web应用。Web应用相比传统的高级动态网页有如下特征: - 页面少:动态网页可能要有成千上百个页面,所以必须使用模板动态生成。而应用程序可能只有几个或者几十个界面。 - 高交互:动态网页的主要目的是供人观看,用户的交互(例如点击链接,按钮等)比较少且简单。而Web应用中,用户的交互非常频繁且复杂。前后端通信更加频繁。 - 部分更新:动态网页在不同页面之间也有不变的内容,比如页头页脚之类的,但是这些内容只占网页的少部分;在应用程序中,页面的绝大部分元素都没有怎么变化,只有少部分数据会发生变化,这时候,每更新一次数据就请求一次新页面就十分浪费了。 Web应用程序的这些需求都是我们之前介绍的动态网页技术所不好满足的,于是Web开发进入了一个新时期: ## AJAX与前后端分离 ### JavaScript 之前我们一直在介绍服务器的技术,而一直忽略了浏览器的发展。实际上,浏览器也慢慢变得复杂,也在慢慢进行技术演进。 在1995年,也就是差不多后端处于SSI和CGI的时代,网景公司的员工发明了一种编程语言,叫做"JavaScript",这是对当时新兴的Java Applet的回应。Java Applet可以让你在浏览器运行Java代码,和它同一生态位的一个技术大家应该很熟悉:Flash,不过它们后来都被淘汰了。 JavaScript作为Java Applet的竞争者,是专门设计出来在浏览器内运行的脚本语言。连名字都是在蹭Java的热度:)网景浏览器(也就是火狐浏览器的前身)为JavaScript提供了一个强大的能力:动态地改变当前页面HTML和CSS的内容。 另外,浏览器还为JavaScript提供了发起HTTP请求的接口,不只是GET请求。这本是非常强大的功能,不过,由于JavaScript早期语法混乱,再加上当时人们对于前端能力需求并不是太大,所以直到2010年左右,前端和JavaScript才被重视起来。也就是我们接下来的内容: ### AJAX 传统的动态网页有一个不灵活的特性:每次只能返回一个完整的页面。也就是说,要么不更新网页,要么就全部更新,没办法更新现有网页的一部分。 比如我们有一个在文章下面评论的功能:用户需要在文本框里输入评论,然后点击"发布评论"的按钮。如果创建成功,那么我们应该让用户看到"评论成功"的提示并且在评论区显示用户最新评论的内容;如果失败也要提示有关的信息。 传统的动态网页只能这么做:返回一个完整的网页,这个网页和用户之前的网页的大部分内容没有区别,只是多了提示的信息和新的评论。但实际上,页面的有效信息只有那一部分。这极大地浪费了网络带宽和服务器性能(因为要重新渲染)。 AJAX(Asynchronous JavaScript and XML)就是解决这一痛点的技术,既然JavaScript可以动态地修改页面内容,发送HTTP请求,那么就直接让JavaScript程序发送带有评论内容的POST请求到服务器,然后服务器返回纯数据(通常使用JSON或XML的格式,把数据用格式包装起来有一个术语,叫做"序列化")而不是HTML,送给JavaScript程序而不是浏览器,JavaScript根据返回的操作HTML或CSS,实现网页部分更新的效果。 AJAX的核心在于"异步",浏览器发送请求后,不会等待后端返回数据,而是允许用户继续浏览。即是指在发评论时,页面不会整个刷新一下的特性。 ### 一个AJAX报名系统的例子 下面举一个例子,来详细说明AJAX的工作原理:用户需要通过一个网页进行某项活动的报名,填写个人信息,然后点击网页上的提交按钮,服务端会返回报名的结果,成功还是失败,与传统的方法不同,服务器返回信息时不是重新返回一个HTML,而是让浏览器直接在原有的界面上(比如提交按钮的下面)显示报名的状态。 用户通过浏览器输入地址,使用`GET`方法发起对`http://example.org/submit`的请求,服务器程序获得请求后,在路由表中查得`/submit`这个路径匹配静态文件`/static/submit.html`,于是将文件发送给浏览器; 浏览器得到文件后开始解析渲染这个文件,发现这个html在头部又要求浏览器向服务器获取`submit.js`文件和`submit.css`文件,于是浏览器不需要用户处理自己又发送了两条`GET`的HTTP Request,在文件返回后,浏览器自动执行返回的脚本并应用CSS样式。脚本的内容是监听html文件中提交按钮的“点击”事件,当按钮被点击时,执行提交报名表函数。 返回的html文件包括了提示框,要求用户输入姓名,手机,空闲时间等信息,在这些输入栏的最下面有一个提交按钮,当点击这个按钮时,脚本中的指定函数就会被激活,这个函数将读取用户从上面输入进来的内容,做一些简单的认证(比如说手机号的格式等),如果检验失败则让用户重新填写信息。 如果检验成功,则将这些信息组织成一个JSON文件(虽然AJAX中的X就是XML,但是现在其实最常用JSON),向服务器发送一个`POST`请求,地址是`http://example.org/api/submit`,在请求体中包含刚才的JSON文件。 服务器在接收这个请求后,在路由模块中查得这个URL匹配`HandleTicket()`函数,于是这个请求的上下文全部转交给`HandleTicket()`这个函数,函数会创建一个`Ticket`类的实例,将数据做后端检验后赋给实例的成员,如果检验成功则调用方法`Ticket.Create()`录入数据库,并向客户端(在这里指JavaScript脚本,而不是用户)发送回应成功的状态码(200); 检验的内容除了冗余检查格式是否合法之外,还要执行业务逻辑方面的检查: - 一个人只准报名一次,所以如果数据库中存在“姓名”字段相同的记录的话,检验则不通过(这个只是个例子,所以不考虑重名的情况) - 如果我们活动的时间的范围没有包含在空闲时间的范围内,检验则不通过,因为用户的时间和我们活动的时间冲突 - 如果数据库中的记录(表示报名成功的用户)大于或等于我们设定的数字的话,检验则不通过,因为人够了 如果检验没有成功,则回应失败的消息,除了依据失败的类型设置对应的错误码外,还要返回一个JSON文件来简述错误信息。 报名成功的消息的示例: ```JSON title="StatusCode:201 Created" { "status":"success", "submit":{ "name":"小明", "freeAt":"2023-11-25_15:00~19:00", "phone":12345678900 }, "createdAt":"2023-11-23_9:23:22" "message":"恭喜!你已成功报名我们的活动" } ``` 报名失败的消息的示例: ```JSON title="StatusCode:400 Bad Request" { "status":"fail", "submit":{ "name":"小明", "freeAt":"2023-11-25_9:00~15:00", "phone":12345678900 }, "createdAt":"2023-11-23_9:23:22" "message":"抱歉,你的空闲时间与我们的活动时间有冲突" } ``` 在JavaScript脚本接收到回应后,根据返回的内容,操作html文件的内容,在提交按钮的下面一行插入一个文本块: 报名成功时: ```HTML
请检查你的信息:
姓名:小明
空闲时间:2023-11-25 15:00至19:00
手机号:12345678900
服务端提交创建时间:2023-11-23 9:23:22
请检查你的信息:
姓名:小明
空闲时间:2023-11-25 9:00至15:00
手机号:12345678900
服务端提交创建时间:2023-11-23 9:23:22
1966年
互联网的前身“阿帕网” (ARPANET) 立项: 美国国防部高级研究计划局(ARPA)启动了阿帕网项目,旨在研究能够在部分网络遭到破坏后仍能维持通信的计算机网络。
1969年
阿帕网首次成功通信: 10月29日,阿帕网上的第一条消息成功从加州大学洛杉矶分校(UCLA)发送到斯坦福研究院(SRI)。
1983年
TCP/IP协议成为阿帕网标准: 1月1日,TCP/IP协议取代了原有的网络控制协议(NCP),成为阿帕网的标准通信协议,这一事件被认为是互联网诞生的标志。
1989年
HTTP协议被发明: Tim Berners-Lee在欧洲核子研究中心(CERN)发明了超文本传输协议(HTTP),为万维网的诞生奠定了基础。
1990年
HTML被发明: Tim Berners-Lee开发了超文本标记语言(HTML),作为创建网页的标准化语言。
世界上第一个网页浏览器和Web服务器诞生: Tim Berners-Lee编写了第一个网页浏览器WorldWideWeb(后改名为Nexus)和第一个Web服务器CERN httpd。
1991年
互联网向公众开放: 8月6日,Tim Berners-Lee在公共新闻组上发布了万维网项目,标志着互联网开始向公众开放,并逐渐普及。
1993年
NCSA Mosaic浏览器发布: NCSA(美国国家超级计算应用中心)发布了Mosaic浏览器,这是第一个能够图文混排的浏览器,极大地推动了Web的普及。
CGI被发明: NCSA HTTPd服务器第一个实现了通用网关接口(CGI),使得Web服务器能够调用外部程序,从而实现动态网页。
1994年
HTTPS协议被发明: Netscape公司发明了HTTPS协议(安全的HTTP),并在其浏览器中实现。
Netscape浏览器发布: Netscape Navigator发布,迅速成为当时最流行的浏览器。
CSS被发明: Håkon Wium Lie首次提出了层叠样式表(CSS)的构想。
1995年
MySQL首次发布: MySQL数据库的第一个内部版本发布,之后逐渐发展成为Web领域最受欢迎的开源数据库之一。
Apache项目启动: Apache项目组接手了NCSA HTTPd的开发,并将其发展成为至今仍然非常流行的Apache HTTP Server。
JavaScript发布: Netscape公司发布了JavaScript(最初名为LiveScript),为网页添加了动态交互能力。
PHP发布: Rasmus Lerdorf发布了PHP(Personal Home Page Tools),一种用于创建动态网页的服务器端脚本语言。
1996年
HTTP/1.0发布: HTTP/1.0作为RFC 1945发布,对早期的HTTP协议进行了补充和规范。
CSS 1成为W3C推荐标准:CSS Level 1正式发布,为网页样式提供了标准化方案。
XML被发明: W3C开始制定可扩展标记语言(XML),旨在以结构化的方式传输和存储数据。
1997年
HTTP/1.1发布: HTTP/1.1作为RFC 2068发布,引入了持久连接、管道化和分块传输等重要改进,至今仍是广泛使用的协议版本。
Java Servlet发布: Sun Microsystems发布了Java Servlet技术,提供了一种在Web服务器上运行Java程序的方式。
1998年
XMLHttpRequest对象出现: 微软在Internet Explorer 5.0中首次引入了XMLHttpRequest对象,为日后AJAX的出现奠定了基础。
1999年
JSP发布: Sun Microsystems发布了JavaServer Pages(JSP),允许开发者将Java代码嵌入到HTML页面中。
HTML 4.01发布: HTML 4.01成为W3C推荐标准,是2000年代使用最广泛的HTML版本。
2000年
REST被提出: Roy Fielding在他的博士论文中提出了表述性状态转移(REST)的软件架构风格,为Web API的设计提供了重要的理论指导。
JSON被发明: Douglas Crockford提出了JavaScript对象表示法(JSON),作为一种轻量级的数据交换格式。
2002年
Firefox发布: Mozilla基金会发布了Firefox浏览器,作为Netscape的继任者,以其开源、可扩展和对Web标准的良好支持而受到欢迎。
2004年
Ruby On Rails发布: David Heinemeier Hansson发布了Ruby on Rails,这是一个全栈Web应用框架,以其“约定大于配置”的理念和快速开发能力而闻名。
2005年
MVC架构的流行: 模型-视图-控制器(MVC)架构模式大约在2000年代中期随着Ruby on Rails和Django等框架的兴起而在Web开发领域流行起来。
AJAX被广泛认知: Jesse James Garrett创造了AJAX(Asynchronous JavaScript and XML)这个术语,描述了一种使用现有技术创建更具动态性和交互性的Web应用的方法。
Django发布: Django,一个基于Python的高级Web框架,首次发布。
2006年
jQuery发布: John Resig发布了jQuery,这是一个快速、小巧且功能丰富的JavaScript库,极大地简化了HTML文档遍历、事件处理、动画和Ajax交互。
2008年
HTML5第一份公开草案发布: WHATWG发布了HTML5的第一份公开工作草案。
2009年
Node.js发布: Ryan Dahl发布了Node.js,这是一个基于Chrome V8引擎的JavaScript运行环境,使得JavaScript可以在服务器端运行。
ES5发布: ECMAScript 5(ES5)发布,为JavaScript语言带来了重要的改进,例如严格模式和对JSON的原生支持。
AngularJS发布: Google发布了AngularJS,这是第一个被广泛采用的现代前端框架,引入了数据绑定、依赖注入等概念。
2010年
Express.js发布: Express.js,一个基于Node.js平台的极简、灵活的web应用开发框架,首次发布。
2011年
WebSocket协议标准化: WebSocket协议被IETF标准化为RFC 6455,提供了浏览器与服务器之间全双工通信的能力。
2013年
前后端分离架构的兴起: 大约在2013年左右,随着前端框架(如AngularJS, React)的成熟和RESTful API的普及,前后端分离的架构模式开始兴起。
React.js发布: Facebook发布了React.js,这是一个用于构建用户界面的JavaScript库,以其组件化和虚拟DOM的概念而受到欢迎。
Electron发布: GitHub发布了Electron(最初名为Atom Shell),这是一个使用Web技术构建跨平台桌面应用的框架。
2014年
HTML5正式发布: W3C正式发布了HTML5推荐标准。
Vue.js发布: 尤雨溪发布了Vue.js,这是一个渐进式JavaScript框架,以其易用性和灵活性而著称。
SPA架构的流行: 单页面应用(SPA)架构随着AJAX的出现和前端框架的发展而逐渐流行,大约在2010年代中期成为构建富交互Web应用的主流方式。
2015年
ES6发布: ECMAScript 2015(ES6)发布,为JavaScript带来了大量新特性,如类、模块、箭头函数、Promise等,是JavaScript语言的一次重大更新。
REST开始流行: 随着移动互联网和前后端分离架构的兴起,RESTful API成为Web服务的主流设计风格。
WebAssembly首次宣布: WebAssembly,一种新的、可移植的、大小和加载时间高效的格式,旨在为Web带来近乎原生的性能,首次被宣布。
2016年
Next.js发布: Vercel(当时名为ZEIT)发布了Next.js,这是一个基于React的服务端渲染框架,简化了React应用的开发。
2017年
WebAssembly MVP发布: WebAssembly的最小可行产品(MVP)在主流浏览器中得到支持。
2018年
WebAssembly首个公开工作草案发布: W3C发布了WebAssembly核心规范、JavaScript接口和Web API的第一个公开工作草案。
2019年
WebAssembly成为W3C推荐标准: WebAssembly核心规范成为W3C的官方推荐标准。