Web发展简史

来自:天码营javascript

原文:http://www.tianmaying.com/tutorial/web-history前端

Web的诞生

    提到Web,不得不提一个词就是“互联网”。Web是World Wide Web的简称,中文译为万维网。“万维网”和咱们常常说的“互联网”是两个联系极其紧密但却不尽相同的概念。今天“互联网”三个字已经承载了太多的内涵,提到互联网,咱们一般想到的一种战略思惟,或者是一种颠覆传统的商业模式。抛开那些纷繁凌乱的商业化概念,回归技术自己,互联网就是指经过TCP/IP协议族互相链接在一块儿的计算机网络。而Web是运行在互联网上的一个超大规模的分布式系统。Web设计初衷是一个静态信息资源发布媒介,经过超文本标记语言(HTML)描述信息资源,经过统一资源标识符(URI)定位信息资源,经过超文本转移协议(HTTP)请求信息资源。HTML、URL和HTTP三个规范构成了Web的核心体系结构,是支撑着Web运行的基石。用通俗的一点的话来讲,客户端(通常为浏览器)经过URL找到网站(如www.google.com),发出HTTP请求,服务器收到请求后返回HTML页面。可见,Web是基于TCP/IP协议的,TCP/IP协议把计算机链接在一块儿,而Web在这个协议族之上,进一步将计算机的信息资源链接在一块儿,造成咱们说的万维网。你们开发的Web应用本质上就是能够提供信息或者功能的Web资源,成为Web这个全球超大规模分布式系统中的一部分。在技术层面进一步理解Web和互联网,建议找一本计算机网络的书去看看,了解一下计算机网络的分层结构和发展历史。java

    1991年8月6日,Tim Berners Lee在alt.hypertext新闻组贴出了一份关于World Wide Web的简单摘要,标志了Web页面在Internet上的首次登场。最先Web主要被一帮科学家们用来共享和传递信息,全世界的Web服务器也就几十台。第一个Web浏览器是Berners Lee在NeXT机器上实现,也只能跑在NeXT机器上,苹果和乔布斯的粉丝对NeXT的历史确定耳熟能详。真正使得Web开始流行起来的是Mosaic浏览器,这即是曾经大名鼎鼎的Netscape Navigator的前身。Berners Lee在1993年创建了万维网联盟(World Wide Web Consortium,W3C),负责Web相关标准的制定。浏览器的普及和W3C的推进,使得Web上能够访问的资源逐渐丰富起来。这个时候Web的主要功能就是浏览器向服务器请求静态HTML信息。95年的时候马云在美国看到了互联网,更准确的说他其实看到的就是Web,阿里早先作的黄页也就是把企业信息经过进行HTML展现的Web应用。程序员

动态内容的出现:CGI

    最初在浏览器中主要展示的是静态的文本或图像信息,GIF图片则第一次为HTML页面引入了动态元素。不过人们已经不只仅知足于访问放在Web服务器上的静态文件,1993年CGI(Common Gateway Interface)出现了,Web上的动态信息服务开始蓬勃兴起。CGI定义了Web服务器与外部应用程序之间的通讯接口标准,所以Web服务器能够经过CGI执行外部程序,让外部程序根据Web请求内容生成动态的内容。Perl由于跨操做系统和易于修改的特性成为CGI的主要编写语言。固然,CGI能够用任何支持标准输入输出和环境变量的语言编写,好比Shell脚本,C/C++语言,只要符合接口标准便可。好比你用C语言编写CGI程序,你把但愿返回的HTML内容经过printf输出就能够发送给Web服务器,进而返回给用户。web

Web编程脚本语言:PHP/ASP/JSP

    这个时候咱们已经能够在Web上提供动态功能了,好比网站访问的计数,表单的处理。CGI对每一个请求都会启动一个进程来处理,所以性能上的扩展性不高。另外,想象一下用在Perl和C语言中的程序中去输出一大堆复杂的HTML字符串,是否是有点蛋疼,可读性和维护性是个大问题。为了处理更复杂的应用,一种方法是把HTML返回中固定的部分存起来(咱们称之为模版),把动态的部分标记出来,Web请求处理的时候,你的程序先生成那部分动态的内容,再把模版读入进来,把动态内容填充进去,造成最终返回。举个例子,搜索一个关键词,搜索引擎的Web服务器能够先从后台索引服务器里拿到数据,而后把这些数据填充到返回结果的HTML模版中,返回给浏览器。可是这件事情本身来作显然太繁琐并且是重复劳动。因而1994年的时候,PHP诞生了,PHP能够把程序(动态内容)嵌入到HTML(模版)中去执行,不只能更好的组织Web应用的内容,并且执行效率比CGI还更高。以后96年出现的ASP和98年出现的JSP本质上也均可以当作是一种支持某种脚本语言编程(分别是VB和Java)的模版引擎。96年W3C发布了CSS1.0规范。CSS容许开发者用外联的样式表来取代难以维护的内嵌样式,而不须要逐个去修改HTML元素,这让HTML页面更加容易建立和维护。此时,有了这些脚本语言,搭配上后端的数据库技术,Web更是开始大杀四方了,像电子商务这样的应用系统也能够经过Web技术来构建。Web已经从一个静态资源分享媒介真正变为了一个分布式的计算平台了。反过来看,你也应该知道,不是只有当今这些流行脚本语言能够写Web应用,C语言同样能够作这件事情。前面举的搜索引擎经过C语言来获取数据和渲染Web页面的例子在追求极致访问速度的互联网公司是很是常见的,可是脚本语言在开发效率上更胜一筹。数据库

分布式企业计算平台:J2EE/.Net

    Web开始普遍用于构建大型应用时,在分布式、安全性、事务性等方面的要求催生了J2EE(如今已改名为Java EE)平台在1999年的诞生,从那时开始为企业应用提供支撑平台的各类应用服务器也开始大行其道。Java Servlet、Java Server Pages (JSP)和Enterprise Java Bean (EJB )是Java EE中的核心规范,Servlet和JSP是运行在服务器端的Web组件,EJB运行在服务器端的业务组件,是一种分布式组件技术。2000年随之而来的.net平台,其ASP.net构件化的Web开发方式以及Visual Stidio.net开发环境的强大支持,大大下降了开发企业应用的复杂度。ASP.Net第一次让程序员能够像拖拽组件来建立Windows Form程序那样来组件化地建立Web页面,Java平台后来出现的JSF也承袭了这一思想。两大平台在相互竞争和模仿中不断向前发展。编程

框架横飞的年代:MVC,ORM

    两大平台诞生以后,组件化编程技术盛极一时,Web技术的发展开始了一段框架横飞的年代,各类辅助Web开发的技术框架层出不穷。虽然脚本语言大大提升了应用开发效率,可是试想一个复杂的大型Web应用,访问各类功能的URL地址纷繁复杂,涉及到的Web页面多种多样,同时还管理着大量的后台数据,所以咱们须要在架构层面上解决维护性和扩展性等问题。这个时候,MVC的概念被引入到Web开发中来了。2004年出现的Struts就是当时很是流行的Java Web开发的MVC框架。MVC早在1978年就做为Smalltalk的一种设计模式被提出来了,应用到Web应用上,模型Model用于封装与业务逻辑相关的数据和数据处理方法,视图View是数据的HTML展示,控制器Controller负责响应请求,协调Model和View。Model,View和Controller的分开,是一种典型的关注点分离的思想,不只使得代码复用性和组织性更好,使得Web应用的配置性和灵活性更好。这是Spring MVC的示意图,典型的MVC架构。后端


    此外,数据访问也逐渐经过面向对象的方式来替代直接的SQL访问,出现了ORM(Object Relation Mapping)的概念,2001年出现的Hibernate就是其中的佼佼者,已经成为Java持久层的规范JPA的主要参考和实现。更多的全栈框架开始出现,好比2003年出现的Java开发框架Spring,同时更多的动态语言也被加入到Web编程语言的阵营中,2004年出现的Ruby开发框架Rails,2005出现的Python开发框架Django,都提供了全栈开发框架,或者自身提供Web开发的各类组件,或者能够方便的集成各类组件。好比Spring基于IoC和AOP思想能够方便得整合出全套Web开发组件,SSH(Struts+Spring+Hibernate)一度成为Java Web开发的标配。值得一提的时Rails这个MVC框架,26岁的丹麦大神David Heinemeier Hansson在开发著名项目管理软件BaseCamp的过程当中造成,Ruby语言自己在快速开发上的优点,加上Rails诸如崇尚DRY(Don't)Repeat Yourself)原则, 约定优于配置,拥抱REST等特性,使其迅速成为一个极其流行的Web开发框架。设计模式

回归Web本质:REST

    注意,看到这里的时候,你会发现Web开发的重点已经不在于HTTP/HTML/URL这样的Web基础架构了,而是各类平台下的各类框架和组件技术(MVC/ORM/分布式组件技术等等)。因此今天不少人可能会用一个MVC框架构建Web网站,可是可能并不了解Web自己。2000年的时候,Roy Fielding在他的博士论文中从构架风格的角度来剖析了Web自己,将Web内在的设计原则和思路系统得论述出来。Roy Fielding是HTTP协议的主要设计者,也是Apache服务器项目的联合创始人,他的这篇博士论文提出来的REST(Representation State Transformation)也成为一种流行的Web架构风格。REST鼓励基于URL来组织系统功能,充分利用HTTP自己的语义,而不是仅仅将HTTP做为一种远程数据传输协议。Web应用的开发应该回归Web的本质特征。Rails在发展过程当中也彻底拥抱REST,成为REST的坚决支持者。有些人认为REST和MVC是两种对立的风格,其实不尽然,二者是互为补充的,从Rails是一个全面支持REST的MVC框架这一点就可窥见。浏览器

浏览器端的魔术:AJAX

    Web应用同时涉及到浏览器端和服务器端,以前的介绍除了简单提到了CSS规范以外,主要关注的是服务器端的技术发展。在客户端,1995年NetScape公司设计的JavaScript被用做浏览器上运行脚本语言为网页增长动态性。微软随后推出相似JScript,可是缺少统一的语言规范,使得浏览器兼容性成为一个程序员的梦魇。JavaScript最终被提交到欧洲计算机制造商协会(ECMA),作为中立的ECMA开始了标准化脚本语言之路,并将其命名为ECMAScript。JavaScript能够响应浏览器端的用户事件,检测表单的正确性,动态修改HTML页面结构DOM,所以能够减小与服务器端的通讯开销,而且作出很酷的页面动态效果。2005年出现的AJAX这个概念使得JavaScript再次大放异彩。AJAX即“Asynchronous JavaScript and XML”(异步的JavaScript与XML技术),指的是一套综合了多项技术的浏览器端网页开发技术,能够基于JavaScript的XmlHttpRequest的用于建立交互性更强的Web应用。AJAX是一种已有技术的mashup,多种技术组合在一块儿造成了其特点和优点,早在1998年就已经开始有人使用。Google在地图和Gmail等产品中对这项技术的深刻应用,以及AJAX这个吸引眼球的名字的提出,使其正式站在了聚光灯下,开始吸引无数人的目光。咱们知道Web应用中用户提交表单时就向Web服务器发送一个请求,服务器接收并处理传来的表单,并返回一个新的网页。而先后两个页面中的每每大部分HTML代码是同样的,每次都返回整个页面内容是一种带宽资源的浪费。而AJAX应用仅向服务器发送并取回必须的数据,并在客户端采用JavaScript处理来自服务器响应,更新页面的局部信息。这样不只浏览器和服务器的数据交换大大减小,并且客户端也能够更加快速地响应用户操做。若是你用Gmail就应该知道,Gmail历来都不刷新页面,全部的请求都是经过AJAX获取数据进行局部更新。AJAX的出现,以及诸如EXTJS、DOJO等一些前端开发框架的出现,也使得单页应用(Single Page Application)在这个时候流行起来。

前端MVC:Angular/Backbone

    这种模式下,先后端的分工很是清晰,先后端的关键协做点是 Ajax 接口,规定好交互接口后,先后端工程师就能够根据约定,分头开工,开发环境中经过Mock等方式进行测试,同时在特定时间节点进行先后端集成测试。可是,随着业务功能的愈发复杂(看看如今的Gmail),这种模式本质上和JSP时代的Web开发并没有本质区别,只不过是将复杂的业务逻辑从JSP文件转移到了JavaScript文件中而已。如今,对于一个前端功能、交互复杂的SPA,JavaScript代码很容易膨胀(超过10万行)。很天然地,像服务端从JSP向MVC框架转换的过程同样,前端开发也出现了大量的MVC框架,比较典型的包括BackboneJS, AngularJS, EmberJS, KnockoutJS。总的来讲,MV*框架的提出是为了解决前端开发的复杂度,提供一套规则组织代码、分层(MVC),经过合理的组织和分层,前端的代码职责明确、清晰,便于开发与测试。

JavaScript在服务器端的逆袭:Node

    各大浏览器的竞争,使其引擎的性能不断提高,至今Google V8引擎的性能已经足以运行大型Javascript程序。在V8之上加以网络、文件系统等内置模块,造成了现在的Node.js。

    随着Node.js的出现,JavaScript开始拥有在服务端运行的能力,它的异步本质使得Node.js在处理I/O密集型业务中优点凸显,而大多Web业务中I/O性能都是瓶颈。eBay、Yahoo、甚至Microsoft Azure纷纷引入Node.js以提高性能。Node.js的package天天都有几千万的下载量。这对前端工程师来讲但是一个好消息,精通JavaScript的他们也可以作服务端开发了!虽然现实中并非这样美好(服务端开发涉及的不只仅是语言层面),但一种新的开发模式也所以兴起:浏览器端处理展示层逻辑、而服务端Controller这一层以及相关的模板渲染、路由、数据接口以及Session/Cookie先关处理实际上交给了Nodejs来作。经过Nodejs, 意味着先后端不少代码能够复用(例如数据验证逻辑),在须要SEO的场景下也能够选择服务端模板渲染。

    但另外一方面,JavaScript刚被引入到服务器端开发,其生态环境还未成熟,甚至大量的经常使用package主版本号都是0。长期用来实现页面逻辑,天生自由的JavaScript,在服务器端开发中,仍未造成统一的开发范型。不一样开发原则和编码风格的应用,都将对Node.js项目的性能、可维护性产生重大影响。如今而言,服务器端javascript开发到底是魔鬼仍是天使,仍取决于团队中的开发者

结语

    Web技术依然在快速发展,Web自己的基础规范也在不断完善,HTML5和CSS3引入了更多激动人心的特性。回顾Web的发展历史,从某个角度看,就是抽象层次不断提升的一个过程,更高的抽象层次屏蔽更低层的复杂性,从而提升开发效率。每当技术发展到必定程度,出现某些局限性的时候,就会有更优秀的技术出现来突破这些局限性。其实这是计算机技术发展的一个广泛规律,好比高级语言的出现屏蔽了汇编语言的复杂性,帮助咱们更快速的编程;数据库技术的出现使得咱们无需关心物理存储和访问细节,写简单的SQL语句就能搞定,更进一步,ORM框架使得咱们经过一条语句调用一个类的一个方法就能方便就行数据操做。咱们应该让本身的技术视野具有必定的高度和广度,看到一门技术的发展规律和发展历程,这是一种技术修养的体现,其实跟人文修养是同样的。同时也应该具备必定的深度,由于咱们每每站在比较高的抽象层次,好比今天你写几行代码就能把数据库建立好,增删改查的功能也自动生成好了,可是成为高手须要你对底层的原理机制有更透彻的理解,真正遇到问题的时候才能抽丝剥茧迎刃而解。

相关文章
相关标签/搜索