请选择 进入手机版 | 继续访问电脑版
  • 关注官方微信 微信公众号 添加方式:
    1:搜索微信号(gogolinux
    2:扫描左侧二维码
  • 登录 注册
  • 一起学LINUX - GOGOLINUX

    查看: 855|回复: 0

    为什么Web前端语言只有JavaScript?

    [复制链接]

    3

    主题

    3

    帖子

    20

    积分

    新手上路

    Rank: 1

    积分
    20
    发表于 2019-6-5 14:14:50 | 显示全部楼层 |阅读模式
    这是个很有意思的问题。

    一句话:这是命运的偶然安排,也是历史的必然选择。对,现在JavaScript绝对有资格矫情!

    这个话题很大,但确实值得web从业者去深究和探讨!但这是一个很有难度的问题,所以到目前为止我还看不到一个让人心锐诚服的答案!

    对,没有!为何?

    因为我从任何一本书籍中找不到合理的解析(在我看来的),更因为JavaScript这门语言本身给不了答案,还因为单纯从软件开发角度思考也可能存在说不清道不明的问题,甚至互联网自己也说不清楚这是为什么!

    在我看来,要找到相对合情合理的答案,得从计算机硬件(尤其是CPU)开始,从操作系统发展变化的角度审视互联网的进化,这样才更容易理解浏览器上的开发语言为什么是JavaScript,而不是其他的语言。

    ----2015-10-06 01:14:36补充------
    这个问题的全部解答,我是写在这里的:
    javascript既然是单线程语言 ,  为什么会分主线程和消息线程(event loop) ?
    下面是复制粘贴过来的,不知道会不会违反规则。
    ------------------
    ## 1,浏览器的进程都运行着什么?
    先上个图:
    (图片来源:http://grosskurth.ca/papers/browser-refarch.pdf
    这是浏览器内部的大致结构,也就是浏览器的主要组成部分有:

    • The user interface/用户接口: 除了网页显示区域以外的部分,比如地址栏、搜索栏、前进后退、书签菜单等窗口。
    • The brower engine/浏览器引擎: 查询与操作渲染引擎的接口,包含事件驱动引擎,提供浏览器进程及其线程之间的资源共享调度机制
    • The rendering engine/渲染引擎: 负责显示请求的内容,比如请求到HTML, 它会负责解析HTML 与 CSS 并将结果显示到窗口中,也是后面几个线程或引擎的父级控制线程。
    • Networking/网络: 用于网络请求, 如HTTP请求,执行POST、GET等操作就是由它来处理的。
    • UI backend/UI后台: 绘制基础元件,如消息窗口(alert默认的样子)、下拉选项卡等等。
    • JavaScript interpreter/JavaScript解释器:也就是JavaScript引擎,用于解析和执行JavaScript代码。
    • Data storage/数据存储:数据持久层,在我们浏览页面时,浏览器需要把一些数据存到硬盘或内存上,如Cookies、localStorage、sessionStorage、webSql等。
    我们用浏览器看到的每一个页面,背后都是由以上的组件或功能来完成的。浏览器完成打开一个页面的整个过程,通俗地说这是页面“渲染”。这里的“渲染”,其实是一个组合概念,即浏览器的“渲染引擎”并不是单独工作的,必须依赖其他引擎(组件),经过某种协同机制联合起来完成页面的展示及交互。

    关于浏览器如何渲染的,我就不详细展开,请阅读:

    相信很多人看完原文或译文依然是一头雾水,当初我也这样,但我们至少知道这样的知识:
    浏览器内部有很多组件或功能,不同的功能必定包含不同的模块,而不同的模块当然就需要不同的实现逻辑,书写并运行不同的代码。
    很显然,不同的逻辑,不同的代码,那么在操作系统中,当我们启动浏览器时,系统要运行指定的程序,在系统的任务管理器里面就表现为某个进程(可能是单个也可能是多个)。例如我所用电脑(MAC)在写这篇文章时需要打开Chrome(如下图所示)。
    发现没有,我其实只运行了一个Chrome,但打开了N个网站(N个Tab)。当然,我们看到是浏览器的主进程,事实上主进程下面还包含组N个子进程,每个子进程就是一个页面Tab的实例,在Mac系统中可以用以下的命令来打印:
    ps aux | grep 'Google Chrome'
    如果是Windows系统就更加简单了,Ctrl+Shift+Esc的组合键打开任务管理器,看到类似这样的图:
    (不是我的,网上找的,版权不归我)

    Windows会将所有运行中的进程列出来,如果你启动的时候只点击运行过一次360浏览器,那么系统中就只有一个主进程,当你打开很多页面之后可Windows就可能要启动N个子进程,如果你找到了主进程并右键“强制结束”,那么就是可以把子进程一起结束掉。

    --------------------
    ## 2,“进程”和“线程”是什么?它们有什么关系和区别?

    有点跑题了,咱们还是回到主题。这里涉及一个概念——“进程”,其实我们聊的是“JavaScript单线程”这个话题,暂时不管这个,先弄清楚“进程”和“线程”到底是什么玩意,要不没法把问题说清楚的。

    这两个是CPU和OS层面的概念,比较抽象。(下面的概念解析是抄的,但我认可这种解析,复制粘贴过来,但不知道原作者是谁)

    什么是进程?
    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
    什么是线程?
    线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。
    进程和线程的关系:
    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
    (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源;
    (3)处理机分给线程,即真正在处理机上运行的是线程;
    (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
    进程与线程的区别:
    (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;
    (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;
    (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源;
    (4) 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
    结论:
    (1)线程是进程的一部分;
    (2)CPU调度的是线程;
    (3)OS为进程分配资源,不对线程分配资源。
    很显然,这种解析还是比较晦涩难懂。很久很久以前,我曾写过比这上面更加通俗易懂硬件知识刊发在某杂志上,但一下子找不到了,随便找来两个替代品:

    在这里我再补充一点——主进程和子进程是什么?
    对于CPU而言,它是没有进程这个概念的,这其实OS层面的概念。这种主/子关系(也可称为父/子关系)是OS建立的关联,因为OS要知道谁启动了谁(例如A运行B,B运行C),知道了这种关系,那么在权重或安全层面就可以建立某种控制机制,让软件的运行有序起来。但是,不管主进程还是子进程都需要单独占用内存空间,运行时都要安排单独的硬件资源。

    OK,补脑先到这里,请客官您务必理解这两个知识点。当然了,如果还是没能分清楚它们两,那也没有关系,请继续往下看。

    --------------------
    ## 3,简单回顾CPU硬件和OS的发展

    先复制一段总结,括号里面的文字是我的理解:
    (根据CPU多核心和多进程特点,运行在OS上面的(软件)设计,可归结为三点:
    (1)以多进程形式,允许多个任务同时运行;(现在绝大多数软件都是这种设计)
    (2)以多线程形式,允许单个任务分成不同的部分运行;(软件在运行过程中的特点)
    (3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。(软件在运行过程中的特点)
    这是阮大神的总结,足够精简,但基本把浏览器这种软件的内部外部表现说得非常清楚明白了。当然,别人在总结这种文字的时候未必是为了用来解析浏览器原理的,但是这是计算机底层的知识,底层的东西是通用的。

    从这里可以看出,要想对程序开发有深层次的认识,最好对计算机底层的原理和机制有了解,越是高级别的开发,计算机硬件知识就要越丰富。™的又废话了,咱们回到进程和线程这两个概念。

    浏览器不是单线程的,它是多线程的,是多进程的(我在‘网站为什么 JS 调用尽量放到网页底部?’回复中有解析,但不详细),这话怎么理解呢?这还得从操作系统及硬件层面来解析,这样才更容易理解,也理解得更加深刻。

    我们都知道,现代的操作系统是支持多进程的多线程的,因此运行在它上面的软件就可以设计成这个样子,比如浏览器。这是现代软件的特点,这点不需要证明了吧?前面的系统管理器截图足够说明这一点。

    当然,在浏览器诞生初期,它并不是这样的,其他软件也不是。很久很久以前,在DOS时代,所有的软件都是单进程单线程的(如果你玩过DOS,就知道你只能逐条命令地键入,等上一条命令执行完成之后才能输入下一条命令),甚至到了后来的Win95/98时代,软件设计依旧是以单进程单线程为主,为什么?

    因为那个时代提供多线程并没有太实际意义,这是由计算机硬件层面的特性决定的。简单地说,在2000年以前,民用级别的CPU都只是单个物理核心,多线程技术还没被应用。因此,运行在硬件上面的OS,即便提供多进程多线程不会给电脑性能带来显著的提升,CPU处理程序只能一个挨着一个地排队慢慢处理。

    首个单核心多线程的CPU是Intel发布的,型号是Intel 奔腾4 3.06GHz,发布时间大约是2000年样子(具体时间记得不清楚了),它是首个提供 EM64T技术的民用级64位CPU,也是首个提供HT超线程技术的单核心CPU。
    Intel 奔腾4 3.06GHz CPU参数

    这是一款事关Intel生死的产品。那个时候,单纯地通过提高CPU运行频率对其性能的提高价值已越来越小,而且提高频率这种技术AMD也能可以做到,但超线程(多线程)技术却可以在不提高运行频率的前提下显著地改善CPU的性能。正是凭借着这一技术,Intel保住了CPU行业老大的位置。

    随后,多线程技术逐渐被CPU行业所接受,进而开启了Intel和AMD在CPU层面的性能PK大赛,当然Intel一直领先。性能PK大赛让普通用户尝到了多线程技术的好处,电脑性能更好了,而微软也顺势发布了WinXP

    WinXP刚刚上市的时候,和Win98一样,依然最多可以使用1个物理处理器,但它由于支持“超线程”,可以利用第2个(虚拟)处理器;另一方面,WinXP采用全新的NT内核(纯32位),CPU和内存的寻址能力更好也更稳定,多进程的处理能力显著提高。因此,除了外观更漂亮外,我们感觉到的是WinXP更稳定,性能也更好了。

    如果你用过Win98,那么一定记得要定期重启电脑,否则运行久了就会莫名其妙死机或蓝屏。虽然WinXP也一样,但频率低很多。为何?这其实是由微软Windows OS的内核设计决定的。OS的特性主要由内核决定的。在早期(大约是1988年-2000年),微软将Windows系统分为面向服务器的NT内核和面向终端用户的16位/32位混合模式内核两类。

    最为典型的代表就是Win95/98,它们都是16位与32位混合的内核,但是这种混合内核非常不稳定,时不时就蓝屏,用过Win98的用户一定深有感触。为了解决这个问题,微软决定将更加稳定的NT内核应用到普通用户市场,于是就有了纯32位的WinXP的诞生。至此之后,Windows系统都是NT内核设计,都要么纯32位,要么纯64位,而不存在两者的混合,以避免重蹈16位与32位混合的覆辙。
    详细了解Windows的历史:

    了解64位和32位有啥区别的:

    --------------------
    ## 4,从硬件和系统层面来理解浏览器和JavaScript的设计

    经过上述的知识补充,我们了解到浏览器必须运行在OS上面(比如Windows、Mac,Linux等),而OS则运行在硬件(硬盘、内存、CPU、主板、显卡等)上面,只有硬件(CPU)提供了多进程或多线程技术支持的前提下,OS的多线程多进程设计才有实用价值,而只有OS提供了这种运行环境支持,其上面的软件和开发语言才能谈多进程或多线程。

    有了这个层面的知识,我们再来看看浏览器Javascript的历史。这个历史很长,我就不复制粘贴了,补脑的传送门:浏览器请努力记住浏览器各个版本出生的时间,并详细看看网景和微软争斗史。
    一个关于浏览器的认识误区
    我们大多数人对“浏览器”是有误解的,认为“浏览器”只不过是个系统插件/软件而已,事实并非如此,真正的浏览器是应该可以独立存在系统的,比如Google Chrome OS,就是一个不依赖其他OS独立运行的浏览器系统。不过,是否了解这个知识点并不会影响我们对于它的运行机制的理解。
    浏览器的历史看完了,我们再来看看 JavaScript 的历史,补脑的传送门:javascript_百度百科

    百度词条有点扯淡,JavaScript的发行时间怎么变成了1992年?网景浏览器1994年才出生,没有妈哪来的儿子?我们还是看看阮大神的作品吧——JavaScript的历史 -- JavaScript 标准参考教程(alpha)
    这一段很关键,很多JavaScript的书籍都反复述说这一段,我认为作为前端开发者,你必须倒背如流才算合格。正是因为JavaScript这门语言的诞生背景有点奇特,它的设计是为了满足用户浏览网页时产生的交互需求,而且它的生产设计时间也相当紧张(只有10天),因此它有很多不完善的设计。但即便是这样,JavaScript居然能生存并存活到现在,并展现出其独特的生态和旺盛的生命力。

    这是一个奇迹。

    --------------------
    ## 5,为什么JavaScript被设计成单线程和异步运行?

    我只能说,Brendan Eich才是真大神,不管他是偶然,还是故意。事实上,换一个人来实现这门语言未必做得比他做的更好设计得更合理,为什么?

    这个我们要结合时代,特别是计算机硬件的背景。那个时候,操作系统还是DOS的天下,Win95才发布。要知道Win95/Win98都是基于DOS的GUI层面的封装,多进程能力弱,可能Brendan Eich还不晓得存在多线程这概念,这种情况下如何设计一门运行在浏览器下的语言才是最合理的呢?

    浏览器是单进程的,可能具备多线程能力,但是硬件不支持,因此那时的它页只好是单线程的。这就是语言运行的环境,请嘲笑JavaScript出身的人,请仔细理解这个时代背景。这种情况下,Brendan Eich只能将JavaScript设计成单线程的函数式编程语言,但将异步特点赋予了它。这绝对是神来之笔。

    我们应该都知道,单线程和异步运行是JavaScript区别于其他语言的最显著特性。正是由于Brendan Eich一开始定下的基调,让JavaScript既能够在浏览器这个狭窄的舞台上发挥其独特的魅力,即便它在语法、词法等层面有很多这样那样的问题,但这些都是可以被开发者所克服的。

    然而,语言设计层面的基调则不然,一旦定下来就无法被更改,甚至设计者本身也无法决定。很多历史事实反复证明这一点,JavaScript出生之后,其发展壮大并不是由Brendan Eich说了算,甚至基本没他什么事。

    从语言本身来解析这一疑惑其实很难,但如果结合时代背景,并从硬件和操作系统层面来解析,就很容易说通。

    请问在单核心单进程的CPU硬件环境下,同步执行和异步执行这两个设计方案,采用哪一种会更好?可能两者区别不大,但如果硬件层面优化了单进程的多线程能力,那么这两种运行模式谁更好?

    可能答案开始明确了,或许异步优秀一些。

    硬件发展并不是停滞不前的,在摩尔定律的指挥下,硬件技术飞速发展。当到了硬件具备了多核心(同步运行多个进程)多线程(同时处理多个线程)的能力,而且OS对于这种技术的利用逐渐完善之后,运行在OS上的软件(浏览器)也开始积极利用这种技术。

    记得我让大家仔细品味网景和微软的争斗历史吗?从硬件层面,网景的衰败是一个必然的结局,因为它离硬件的距离相对遥远,而微软则近很多。

    微软是操作系统起家的,操作系统是最接近硬件的,而浏览器可能只是顺手弄出来的,但是盖茨看到它在互联网上的价值,因此将它弄到了Windows里面,并Win98开始逐渐改善软件在单进程下的多线程机制。

    其实,作为用户用什么浏览器来看页面,并不会有特别明显的倾向。如果撇开系统内置这一招,你我都应该相信,从IE浏览器一定会在某个时候超越网景浏览器,毕竟要运行在OS上面(对于普通用户而言),谁会对浏览器的优化做得更好或新技术的运用更快一步呢?

    答案是显而易见的。对于IE浏览器的优化,几乎伴随着Windows的全部发展进程。2001年,微软发布了Windows XP后,并内置了新一代浏览器——Internet Explorer 6,这是当时最先进的浏览器,它统治了浏览器市场多年。不管是不是前端开发人员,对于IE6应该不会太陌生,它其实是那个时代单进程浏览器的巅峰之作了(IE6原生不支持多标签,记得吧?)。

    IE统一天下之后,垄断让微软变得傲慢而无理,具体表现在IE6/7/8在技术层面的停滞不前,这是前端开发者的噩梦。然而,硬件技术和互联网发展并不是微软说了就算的,否则浏览器端的语言可能是JScript或VbScritp

    --------------------
    ## 6,硬件高速发展,互联网也在进化!

    如果单纯从软件和互联网发展的角度看,很难解析这些和JavaScript的这门语言有什么关联,我还是谈谈硬件吧。

    事实上,互联网的高速发展离不开硬件的支持,但硬件的发展始终要领先软件一步甚至多步。如何理解?当CPU支持多线程技术时,微软利用Wintel组合得到了第一手资料,因而获得了先发优势。其他非底层的软件开发了解到这一知识已经是别人发布新版之后,公布最新的API才会知道,这里需要经历一个再学习的过程。

    很显然,除了微软外,其他浏览器的厂商大多属于这种情况,但是硬件技术发展并不会停下进化的脚步,它始终高速发展。

    Intel发布Intel 奔腾4 3.06GHz之后,2002年初,又发布了第二代130nm的Pentium 4(Northwood),加上支持DDR内存、FSB提升到533MHz等一系列动作,P4的威力得以发挥,帮助Intel夺下了性能的宝座。

    对手AMD的基于K7微架构的Athlon处理器开始呈现出颓势,但它并没有坐以待毙,一方面继续发布改进版本的Athlon XP(采用PR值类标识性能,避开Intel以频率的命名方式),另一方面宣布了新一代K8架构处理器(提出了多线程、多核心概念)。

    在2001年-2002年期间,Intel一直以高频、多线程来对付AMD,并基本处于领先位置,后者则通过更好的性价比来应对,尽管时有超越,但始终处于被动的挨打态势。直到2003年,AMD终于推出了他的AMD64 架构 Opteron 以及 Athlon 64 处理器产品线,开启了超线程竞争的时代,尽管新技术架构并没有直接表现为更好的性能,但是它展现出来的后续能力,还是让Intel疲于应付。

    2004年,Intel 承认 AMD 在市场上的成功,并着手开发 AMD64 延伸的替代品,称为 IA-32e,稍后改名为 EM64T。升级版本的 Xeon 和 Pentium 4 处理器家族支持了新推出的指令。

    2005年4 月 30 日,微软公开发布提供给 AMD64 和 EM64T 处理器的 Windows XP Professional x64 Edition。

    Intel在2005年5月26日,抢先AMD发布了桌面上第一款双核CPU——Pentium D_百度百科,虽然内部是由两颗Pentium 4共享FSB组成、后来还被证实为“高发热、低性能”,但也是历史上第一款双核了。约1周后,AMD拿出了自家的双核Athlon 64 X2。

    Athlon 64 X2可以说是AMD历史上最成功的CPU,凭借K8微架构的优势,功耗控制、双核性能,都领先Intel的Pentium D。凭借这款真正意义上的双核处理器,AMD挑起了“真假双核”CPU之争,Intel只好沉默了,这让AMD开始骄傲了起来,尽管市场方面它还并未获得应有的优势。

    在这个时候,AMD做了一个在今天看来属于鲁莽级别的决定——收购显卡厂商ATI,尽管从某些角度看这桩高达54亿美元交易是一个不错的决定,但这桩交易非常的不划算,有三个原因:

    第一,这件事情提醒了Intel,未来CPU和GPU会在某种程度上进行融合,也就是PC端的笔记本电脑会取代台式电脑,保持低功耗的同时,让CPU性能和GPU性能达到一个动态的平衡,进而提供符合笔记本电脑需求的整合产品;

    第二,触怒了显卡领域的老大—— NVIDIA,促使它不得不与Intel联合,一起对付AMD+ATI的组合。很显然,Intel > AMD && NVIDIA > ATI,这种PK基本上是一边倒;

    第三,AMD收购ATI并完成整合才会有战斗力,但这显然不是一个简单的过程,对手肯定不会停下来等待,于是AMD在没有将多核的优势保持太久,Intel就于2006年1月5日发行了新一代的Core(酷睿)架构处理器,而它却陷入了旷日持久的财务危机。


    自从Core处理器面世之后,直到今时今日,Intel在PC端的地位再也没有被撼动过。

    --------------------
    ## 7,Ajax的发明促进了Web2.0,JavaScript焕发了青春!

    ###(一)
    看到这里,可能有人会质疑笔者的啰嗦,为啥要花这么多笔墨来书写这些与浏览器、JavaScript无关的事情?

    或许,在很多人看来是毫无关系的,但是在我看来,这才是看清互联网技术为啥能够快速发展的关键。为什么这么说?

    这是因为CPU和GPU是PC的核心,而Intel、AMD和NVIDIA则是整条生态链的顶端,它们之间的竞争其实是PC硬件的行业风向标,硬件的快速发展促进了PC互联网(传统互联网,相对于移动互联网而言的)的高速发展,竞争尘埃落定的那一刻则正好是PC互联网辉煌的开始,你还觉得这是偶然吗?

    然而,事情并不是这样简单的,PC硬件领域的军备竞赛决出了胜负,参与对决的选手都可能太过于投入,Intel、AMD和NVIDIA都忽略它们的革命者——高通,并而在一定程度上错失了另一个世界——移动互联网。

    当然,我们依然要感谢Intel、AMD以及NVIDIA,如果没有他们的竞争,我们不可能这么快地使用到各种多核、多进程、多线程技术,互联网的发展也不会发展得这么快,这么的朝气蓬勃。

    从2000年到2006年,这是在PC硬件和PC互联网高速发展时代,在这个过程中,浏览器还只是一个相对狭窄的领域,尽管它是互联网的入口,但这个过程中,互联网信息的生产主要依赖传统的手段,直到分出了胜负那一刻,你我他等普通网民(YOU)才成为了信息的主要制造者。

    还记得这个封面吧?网民成为美国时代周刊2006年年度人物(图)

    ###(二)

    在IE称霸天下的途中,在Intel和AMD争霸的过程中,Web领域都发生了些什么大事?

    • 1999年,IE 5部署了XMLHttpRequest接口,允许Javascript发出HTTP请求,为后来大行其道的Ajax应用创造了条件。
    • 2000年,KDE项目重写了浏览器引擎KHTML,为后来的WebKit和Blink引擎打下基础。这一年的10月23日,KDE 2.0发布,第一次将KHTML浏览器包括其中。
    • 2001年,微软公司发布Internet Explorer 6。这是当时最先进的浏览器,它后来统治了浏览器市场多年。
    • 2001年,Douglas Crockford提出了JSON格式,用于取代XML格式,进行服务器和网页之间的数据交换。JavaScript可以原生支持这种格式,不需要额外部署代码。
    • 2002年,Mozilla项目发布了它的浏览器的第一版,后来起名为Firefox。
    • 2003年,苹果公司发布了Safari浏览器的第一版。
    • 2004年,Google公司发布了Gmail,促成了互联网应用程序(Web Application)这个概念的诞生。由于Gmail是在4月1日发布的,很多人起初以为这只是一个玩笑。
    • 2004年,Dojo框架诞生,为不同浏览器提供了同一接口,并为主要功能提供了便利的调用方法。这标志着JavaScript编程框架的时代开始来临。
    • 2004年,WHATWG组织成立,致力于加速HTML语言的标准化进程。
    • 2005年,苹果公司在KHTML引擎基础上,建立了WebKit引擎。
    • 2005年,Ajax方法(Asynchronous Javascript and XML)正式诞生,Jesse James Garrett发明了这个词汇。它开始流行的标志是,2月份发布的Google Maps项目大量采用该方法。它几乎成了新一代网站的标准做法,促成了Web 2.0时代的来临。
    • 2005年,Apache基金会发布了CouchDB数据库。这是一个基于JSON格式的数据库,可以用Javascript函数定义视图和索引。它在本质上有别于传统的关系型数据库,标识着NoSQL类型的数据库诞生。
    • 2006年,jQuery函数库诞生。jQuery为操作网页DOM结构提供了非常强大易用的接口,成为了使用最广泛的函数库,并且让Javascript语言的应用难度大大降低,推动了这种语言的流行。
    • 2006年,微软公司发布IE 7,标志重启浏览器的开发。

    (以上是阮老师的文字,我是复制粘贴)

    从这些事件看到,JavaScript本身变化并不明显,它依旧是单线程和异步运行的,但是浏览器及相关Web技术已经有了很大的飞跃。虽然我们鄙视IE,但是它还是提供了一些新的并且很有用的接口,比如XMLHttpRequest。

    2005年,Ajax方法(Asynchronous Javascript and XML)正式诞生,它实现的基础就是IE的XMLHttpRequest接口。有了它,更加注重交互体验的网络应用才会更加受欢迎,用户参与的积极性才会更高,于是Web2.0来了。
    什么是Web2.0?补脑的传送门:web2.0_百度百科
    简单地说,Web2.0 是相对于Web1.0 的新的时代,指的是一个利用Web的平台,由用户主导而生成的内容互联网产品模式。Web2.0模式下的互联网应用具有以下显著特点:

    • 1.用户分享。在Web2.0模式下,可以不受时间和地域的限制分享各种观点。用户可以得到自己需要的信息也可以发布自己的观点。
    • 2.信息聚合。信息在网络上不断积累,不会丢失。
    • 3.以兴趣为聚合点的社群。在Web2.0模式下,聚集的是对某个或者某些问题感兴趣的群体,可以说,在无形中已经产生了细分市场。
    • 4开放的平台,活跃的用户。平台对于用户来说是开放的,而且用户因为兴趣而保持比较高的忠诚度,他们会积极的参与其中。
    --------------------
    ## 8,为什么Ajax不是其他时刻出现,而是在2005年?

    这可能是一个偶然的事件。实际上,这个技术应该Google Maps发布之前就已经被使用了,时间应该在2004年-2005年之间,但是Jesse James Garrett还没有想好叫什么名字或暂时不想公布罢了。

    要知道早在1999年,IE 5就部署了XMLHttpRequest接口,后来很长一段时间里面,JavaScript本身并没有翻天覆地的变化,它完全可以在更早的时间里被发明出来。不是吗?当然,你完全可以说是一种偶然,但我依然不这么认为,可以从硬件层面解析,它的出生时间节点和CPU技术发展是密不可分的。

    下图是同步请求和异步请求的差异:

    再来看看这个CPU的单线程和多线程的差异;
    有没有发现,两种技术有着异曲同工之处吗?我之前反复强调过这样的概念——软件是根植于硬件,只有硬件层面的技术支持完善了,响应的软件技术才会有用武之地。

    我们都知道,js运行是一个单独的线程,而http请求也是,但它们都必须基于同一个浏览器进程。那么,请问在单核心单进程的硬件环境下,JavaScript发起一个异步http请求和发起一个同步请求,对于当前的浏览器进程而言,有很明显的性能优势吗?

    很显然,不会有明显的区别。

    因此,在Win98时代,理论上IE5已经支持AJAX了,但开发人员并不会考虑用它来做什么,理由是硬件和系统层面不给力。但是随着CPU的单核多线程和多核多线程技术的完善,OS对于积极利用这些技术,使得运行在其上面的软件在处理多个线程的能力明显加强了。

    于是,就有了程序员来思考单线程的JavaScript如何利用异步来发起http请求,由于OS层面可以根据CPU的多线程可以同步执行特点,将HTTP请求安排到JavaScript运行线程之外的线程堆栈里面来执行,如下图所示。
    这是我根据自己的理解所画的,表示在一个支持双线程系统上的某个浏览器进程中,JavaScript发起AJAX请求后的运行状态示意图。

    从CPU硬件及系统发展角度看,Ajax也应该在这个时间节点上出现,或许它不叫“Ajax”,而是其他名字,但这并不重要。

    当然,如果从Web互联网的角度思考,Ajax的出现是因为,随着互联网信息传输量的不断加大,传统的Web应用所采用的同步交互方式显现出越来越明显的问题。当服务器端处理请求时,浏览器端的用户就必须要等待,只有到最终的响应结果传输到浏览器客户端时,整个页面才会重新进行刷新,以显示处理的结果。

    可以想象,这样的一种处理方式往往会让用户的体验变得不连贯、不顺畅。JavaScript异步交互的处理方式则能够很好的解决这个问题,而正好IE提供了XMLHttpRequest接口,于是基于异步交互的js技术被人们发明了出来。

    --------------------
    ## 9,JavaScript成为宠儿,是命运的安排,也是历史的选择。

    在我看来,JavaScript被设计成单线程是由于它独特的运行环境决定的,它出生在一个普通的这个家庭(网景浏览器),而非底蕴更加深厚的豪门(接近底层的OS)。也就是说,JavaScript决定不了自己的出身,但是它的父亲(Brendan Eich)还是非常尽职尽责的,并且很有远见的。

    虽然只能给它一颗单线程的心,但却赋予了异步的灵魂。尽管出生的时机也不太对(微软开始独霸天下),并且准备也充分(10天时间),导致JavaScript天生有些营养不良,而显得单薄了许多,但是它还是赶上了一个好的时代——互联网的飞速发展。

    在众人的努力帮助下,改良的体制,将单线程+异步的特性发挥并很好地运作起来,进而焕发了青春!也就是,它跟随者互联网环境的发展,在没有可替代品的前提下,JavaScript的潜力被人们发挥到了极致。

    人们发明基于JavaScript的Ajax技术,这正好得益于其异步的灵魂。从某种意义上看,Ajax的发明是对于JavaScript语言而言是一个生死攸关的大事,因为正当人们对Web应用有更高的体验要求时,它的出现正好满足了这种需求,而这里的关键其实是JavaScript这门语言的异步特性,让浏览器端与服务器的对话不再阻塞用户的交互。

    事实上,除了JavaScript外,能够实现AJAX技术的HTML脚本语言还有VBScriptJScript,它们都来自微软,在当时都只能运行于Windows平台下,而且这两语言拥有得天独厚的优势,因为它的运行环境IE6发布之后不久就夺取了统治级别的地位,并于2002年达到96%的峰值。

    ### 为什么VBScript没能成为“JavaScript”呢?

    我下面讨论的是VBScript,而不是JScript,因为现在的JavaScript其实网景的JavaScript和微软的JScript的合体,两者都是ECMAScript规范在浏览器上的实现。

    原因很多,我认为有以下三点:

    #### 第1,来自非Windows体系的浏览器组织的抗争。

    其中,最重要的就是Mozilla,它最初是由网景公司内部成立的,后来网景被AOL收购后,这一组织独立了出来,并接管了网景许多业务,而它最重要的产品就是开发人员非常熟悉的Firefox。我们都知道Firefox一直和IE对着干,其原因就是它是网景体系的延续(JavaScript创造者Brendan Eich一直是Mozilla的带头人)。

    除了Mozilla组织外,还有苹果以及KDE项目等。虽然这些对手在当时还非常弱小,但星星之火可以燎原,后来就是这些不起眼的对手将IE赶下了神坛。很显然,死而不僵的网景起到了关键的作用,作为前端开发从业者,我们应该好好感谢网景。

    (前端人记得烧柱香,祭拜一下)

    #### 第2,微软的垄断导致Windows和IE的封闭。

    Windows 95/98之后,微软霸占了桌面系统,绝对垄断让它拥有了很多特权,比如IE直接内置在Windows里面,玩死了网景。绝对的市场地位,微软压根不用考虑IE是不是可以安装在其他系统上面,而正对网景的JavaScript,它弄出来的VBScript和JScript也只能运行在IE上面,够封闭吧?

    然而,除了Windows外,这世界还有不少系统需要浏览器,比如linux系统、比如苹果系统。虽然当时的它们市场份额很小,但是这些系统的用户都是高端用户,拥有非常强势的话语权。正是由于这个原因,浏览器需要一门可以跨平台的编程语言,JavaScript正好符合需求。

    #### 第3,VBScript的权限太大了,可以无法无天。

    这其实不是最重要的,因为这个问题可以被微软处理掉的(只要微软认为有必要),但我还是将它列为一个原因,只是让大家对于JavaScript的对手一个深刻的认识。VBScript是Visual Basic Script的简称,Windows环境下的轻量级解释型语言,它不仅能运行在IE浏览器下,还可以在Windows上的其他地方直接运行。

    这有什么问题?你可以想象一下,如果我做一个包含了VBScript脚本的网页,它可以直接修改你的Windows系统注册表,你会是怎样一个感受?Windows对于VBS程序是没有任何保护和限制设施,和其它EXE、BAT或CMD程序一样对待。当时的OS可没有监察VBS是否存在恶意的能力,请问你敢用这样的产品吗?

    相比之下,JavaScript就安全多了,它只能运行在浏览器上面。有些时候权力太大不一定是件好事。

    就这样,JavaScript成为了浏览器端编程的胜利者。

    于是,人们容忍了它的不足,并主动修补了它的各种缺陷,各种兼容类库纷纷涌现,而jQuery的出现,为Web开发人员操作网页DOM结构提供了非常强大易用的接口,为JavaScript这门语言的流行铺平了道路,而它则成为了最最广泛的JavaScript函数库,没有之一。

    就这样JavaScript成为了时代的宠儿。现在,它完全有资格矫情地说:“这是命运的安排,躲都躲不开。”

    --------------------
    ## 10,移动互联网的崛起,浏览器成为入口,JavaScript被迫成为王者。

    ### (一)
    时间来到2007年。

    对于整个互联网而言,这是非常重要的一年。这一年的互联网依旧是PC的天下,PC硬件依然在摩尔定律的指挥下高速发展,而AMD则依然在和Intel抗争。

    当然,计算机行业也在发生着变化,笔记本电脑开始取代台式电脑,成为了人们上网的主要选择,而网络成为了人们日常生活的重要组成部分,电脑工具化的趋势已经越来越明显。为此,人们发明了“上网本”这种东西,并掀起了一阵移动上网的热潮。
    首款上网本是由华硕于2007年8月发布的,但2013年1月1日华硕发布申明不再生产这类产品,这意味着在“上网本”告别了舞台。这类产品曾被誉为“未来之星”,但存世的时间只有短短5年,它一度“辉煌”过但却又快速消亡。这一定是有原因的。

    在我看来,这是PC行业(包括硬件和软件)看到移动互联网崛起的迹象后,发明的一种用于满足人们移动上网需求的产品,这显然只是传统PC领域的一次意淫。这里面的玩家都一度玩得很嗨,包括领头羊Intel也专门为此类产品开了专门的CPU产品线——Atom处理器,定位就锁定在个人的第二台电脑,希望人们专门用它来上网。

    领头羊的带头示范作用还是非常牛逼的。刹那间,PC行业来了非常多的跟随者,除了传统的笔记本厂商跟积极进外,许多非笔记本厂商也想分一杯羹。

    记得2009年的时候,我还是一名IT编辑时参加了报社的重要合作伙伴——多彩科技的上网本发布会,它高价请来了当时红极一时的周迅来代言,异常高调。在发布会的现场,我第一次近距离接触了娱乐圈的当红花旦,很是兴奋。

    不过我不是娱记,可没机会采访明星要个签名什么的,而是被安排对多彩科技总裁进行了专访(就是下面图片中男人),这是本人以媒体记者身份进行的最后一次相对高级别的采访,之后不久我就离开媒体转行了做了开发,因此对此记忆非常深刻。
    新闻传送门:周迅力挺 多彩上网本摆上淘宝店货架

    如果你了解PC行业的话,就应该知道多彩科技其实是一家以机箱、电源、键鼠等为电脑外设产品为主的传统硬件企业。就是这样一家外设企业也想来分一杯羹,可想而知,整个行业是多么重视“上网”这个需求!

    然而,这种为了上网而“上网”的PC硬件,其实是一个虚假的需求。或许,这个描述可能有点问题,“移动上网”这个需求并不虚假,但传统IT企业在大方向上弄错了!悲催的是,这是上游——由一线厂商华硕发起,然后由领头羊Intel主导的一次针对互联网移动化的变革。

    当然了,有头羊的带领,后面的小羊就会不假思索地往前冲,但用户并不是十分买账!上网本的结局早已注定,这不仅是一个短命的产品,而且整个PC行业几乎没人能够从这里面分到蛋糕。

    新闻传送门:永别了上网本! 本经典之华硕 EeePC 700_笔记本

    ###(二)

    当然,传统硬件企业在互联网变革大潮中的很多努力和尝试,并非没有任何意义。比如上面提到的上网本(Google的ChromeOS就是为了在它上面运行),传统硬件企业尝试通过更小号的笔记本电脑来满足移动上网这个需求,虽然不失败了,但也在一定程度上教育了市场,教育了用户。

    与此同时,在硬件变革的带动下,除了Intel和苹果外,Google、微软、诺基亚等各个领域的领头羊都在积极探索如何移动互联。

    微软一直都是努力的,旗下的Windows Mobile一直在求变,但缓慢的市场反应和布局而让其收效甚微。抱着号称最牛逼的智能手机系统——塞班大腿的诺基亚成为了手机行业的老大,但其实也没有闲着,联合Intel搞了一个叫MeeGo的手机系统,但最后也胎死腹中。

    除了苹果外,成功者唯有既不是传统软件也不是硬件的纯互联网大咖——Google,它针对移动互联网的布局要早于苹果。我们可以从三个关键事情上看到Google的野心。

    #### 第一,2004年,扶持Mozilla的Firefox来对抗微软的IE。

    自2004年起,Google搜索便开始作为火狐浏览器的默认搜索引擎,并且Google针对Firefox开发了响应的浏览器工具条,依靠搜索变现,Mozilla在IE的夹缝中生存了下拉(绝大多数营收来自Google的搜索分成),并在很长一段时间内是仅次于微软的第二大浏览器厂商。


    #### 第二,2005年,低价收购安卓Android

    2005年,Google仅花费5000万美元低调收购Android公司。Android公司起初仅仅是一家默默无闻的美国公司,经Google之手,摇身一变成为全球最流行的操作系统平台。2010年,Android操作系统已经在智能手机市场达到33%的市场占有率,Google曾表示Android是“史上最佳收购”。而今天,Android更是稳稳占据全球智能手机市场逾80%的份额。


    #### 第三,2006 年开发V8引擎,2008年发布Chorme。

    作为Web开发从业者对于V8(JavaScript引擎)Google Chrome一定不会陌生,这里就不介绍了。不清楚的,自己补脑。当然,在2006年和2008年之间,也就是2007年的11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。

    ###(三)

    今天,我们知道浏览器已经取代OS(APP内置浏览器也算在内)成为人们获取信息的标准入口。那么,从这一角度回头看Google当初针对移动互联网的布局,完全可以用环环相扣、步步惊心、招招致命等很多牛逼的形容词来描述。

    对此,我的解读是这样的:

    要想占领移动互联网的入口,从底层来思考,必须有两个武器——移动端的OS和浏览器引擎。Google两个都没放过,当然苹果也一样。

    咱先不说OS,单就我们熟悉的浏览器而言,要想获得更好的性能体验,必须解决浏览器的引擎性能问题,于是WebKit成为了Chrome和Safari的标配。但这还是不够的,除了渲染引擎外,要改善浏览器的性能更重要的其实是优化JavaScript引擎,只有提高了浏览器平台上的编程语言的性能,那么才会真正提高浏览器的性能。

    同时,考虑到未来移动互联网可能存在跨平台应用的需求,V8引擎一开始就没有说一定要在浏览器上才能运行,这一点或许不是Google当初做这个决定能够想到的(我无法确定,只是意淫),但正是这一举措,让JavaScript终于可以脱离浏览器这个环境而运行了。

    于是,就在Chrome发布后不久,NodeJS出来了!

    虽然NodeJS可以让JavaScript运行在服务端,本质上和在浏览器端进行开发是完全两个不同的工作,很难说有太直接的关系,但是正是由于它的出现,大大拓宽了JavaScript的应用范围,让Web开发的从业者看到了前端的深度,并且基于NodeJS开发的各种前端工具,极大地改良了前端开发的生态,JavaScript成为了最受欢迎的开发语言,让前端开发成为了炙手可热的技术工种。
    (数据来源Stack Overflow Developer Survey 2015


    然而,假设当初Google没有扶持FireFox来对抗IE,那么微软的VBScript完全有可能发展成为浏览器端的主流编程语言。一旦基于VBScript的开发生态圈建立起来,那么后来的网站首选服务端开发语言就可能是.NET,而客户端的首选则是VBScript了。

    以微软在民用OS上的垄断,再加上IE6统治级市场份额,只要身段稍微低那么一点点,比如及时出一个MAC版本和Linux版本IE6来封堵一下FireFox,那么上述的可能性是存在的,不是吗?

    但这只是假设,历史是不能重演的。在通过FireFox稳住了JavaScript的阵脚之后,针对IE内核在JavaScript渲染上的性能瓶颈,立马做出了优化JavaScript引擎的重要决定,于是V8项目就被立项了。

    而V8的出现极大地改善了JavaScript的性能,瞬间可以秒掉微软的JScript引擎,进而大大促进了JavaScript语言的发展。正是浏览器背后的JavaScript渲染引擎的对决,让Google获得了浏览器端开发语言的胜利,再加上安卓系统这个操作系统,使得它能够更加从容地对移动互联网进行布局。

    对于微软而言,死而不僵的网景是它的噩梦,正是它留下的那点点星火,在Google的照料下实现了燎原。

    ###(四)

    这里我还是想继续聊聊上网本这个移动上网设备,它为什么会被推出而又快速消亡?在我看来,有两个方面的原因:

    第一,2006年以后,CPU进入到多核多线程时代,在办公上网这种日常应用上面,PC硬件的性能已经出现盈余。通俗地说,电脑性能过剩了。剩余的性能如果不用来玩游戏,那么就是一种浪费,于是CPU开始被阉割。

    第二,互联网的快速发展,人们随时随地需要上网的欲望越来越大,而当时的智能手机及其生态圈还不足以满足人们的需求,因此更小号的笔记本或许可以胜任。

    就这样,上网本就被推上了历史的舞台。但是人们需要的是随时随地上网,比如一手扶着地体、公交的扶手时,另一只手也能上网!很显然,上网本并不能满足需求,能够上网的手机才是最佳的选择。
    2007年1月9日,苹果公司首席执行官史蒂夫·乔布斯宣布苹果将发布第一代iPhone,并在同年6月29日正式发售。乔布斯是第一个找准定位的人,他是开启移动互联网大门的人!从某种意义上,我们完全认可乔布斯和他带领的苹果,通过iPhone系列手机革了传统互联网的命。

    我们重新梳理一下移动端操作系统、浏览器以及JavaScript相关的历史事件:


    • 2004年,Google扶持Firefox来对抗IE,保住了JavaScript的命。
    • 2005年,Google低价收购安卓,埋下了革命的种子。
    • 2006年,开发V8,优化JavaScript引擎。
    • 2007年,苹果推出iPhone,重新定义了智能手机,开启了移动互联网。Google成立安卓手机联盟。微软发布IE7。
    • 2008年,Google将安卓开源,随后发布首款安卓手机,同年发布Chrome浏览器。微软发布IE8。
    • 2009年,基于Google V8引擎的服务端版JavaScript——NodeJS被推出,同年年底ECMAScript 5.0版正式发布。
    • 2010年,微软公司发布了智能手机操作——Windows Phone,Windows Mobile系列的退市。
    顶级玩家的对决,一步落后就可能步步落后。回顾这些历史,我们可以看到微软基本上是每一步都落后于Google和苹果,于是今天的移动互联网就基本和微软没太大关系了。

    到这里,我们可以这样总结移动互联网的发展轨迹:

    苹果重新定义了智能手机,乔布开启了移动互联网的大门,而Google的深远布局让安卓繁荣了起来,使得移动上网设备呈现出多样化,最终使得可以跨平台运行的浏览器成为了人们获取信息的标准入口。


    有意思的是,由于在这个过程中,浏览器端的开发语言只有一个选择,于是JavaScript被迫成为了王者,幕后的推手其实是Google的V8引擎。

    --------------------
    ## 11,10个浏览器和JavaScript相关的疑惑的快速解答。

    事实上,题主的疑惑到现在还没有一个正面的解析,扯得有点远了。但是,有了这些知识以及上面这么多章关于硬件、OS以及浏览器的历史之后,我们再来思考JavaScript的相关话题就简单多了。

    ### 第1个问题:为什么浏览器的开发语言是JavaScript?
    因为JavaScript唯一的对手VBScript,是一个既不可以跨浏览器,也不可以跨平台,而且还很危险的浏览器开发语言。JavaScript则正好可以跨平台,还比较安全,而且V8引擎的推出也大大地改善了它的性能,并且可以不依赖浏览器运行,尽管它有很多缺点,但问题是我们没有其他更好的选择。
    ### 第2个问题:为什么JavaScript被设计成单线程的?
    因为JavaScript出生的时候,CPU和OS都不支持多线程,浏览器单进程在运作,渲染线程、JavaScript线程、网络线程等多个线程已经需要排队才能处理了,这种情况下如果将JavaScript设计成多线程有意义吗?考虑到当时的项目需求(运行在浏览器上)、周期(10天)、硬件环境以及软件环境等因素,换作其他人也都会将JavaScript设计成单线程的!
    ### 第3个问题:为什么JavaScript没有设计成同步执行的?
    因为当web应用需要在客户端和服务端之间进行反复交互时,异步才是更合理的设计。如果JavaScript在一开始被设计成同步的,那么后来它也会被改造成异步的,否则会又意外一个叫“异步JavaScript”来取代它。
    ### 第4个问题:为什么JavaScript会分主线程和消息线程(event loop) ?
    这是一个错误的问题。到目前为止,在同一个页面进程中,JavaScript只有一个线程。可以分为主线程和消息线程的是浏览器进程。
    ### 第5个问题:为什么JavaScript可以表现出‘多线程’的特点?
    这其实也是一个错误的问题,能够实现多线程的其实是浏览器进程,它至少有7个以上不同的线程,核心线程有两个,一是浏览器引擎线程,二是渲染引擎线程。而JavaScript引擎线程、网络请求线程、html解析线程、UI线程也都是渲染引擎线程的子线程。

    消息线程(event loop) 其实是浏览器引擎线程一个表现。浏览器是事件驱动(Event driven),消息是事件的一种,此外还有很多,比如鼠标点击事件、窗口大小拖拉事件、定时器触发事件、XMLHttpRequest完成回调等等。
    ### 第6个问题:为什么浏览器是多进程的?
    因为OS是多进程的,也就是Windows是多任务系统,不过开始的时候可不是这样子的,后来才被设计成这样的。就因为浏览器是运行在OS上面的,而OS又允许软件可以同时运行多个进程,所以浏览器就可以多进程。
    ### 第7个问题:为什么浏览器是多线程的?
    这个问题没法回答,我真不知道为什么,一开始的时候它张成就这样的了。可能是因为单个线程完成不了显示页面这种高难度的活,于是浏览器就得设计成多个线程,即便CPU不支持多个线程也要设计成这个样子。
    ### 第8个问题:为什么JavaScript可否设计成多线程?
    好问题!之前我说过了,JavaScript的单线程的设计是因为当时CPU硬件和OS软件等环境不允许,因此被设计成单线程的。但是后来的确有很多需求希望JavaScript可以实现多线程任务机制,好在有异步机制,再结合浏览器的事件驱动设计,因而JavaScript也能模拟出多线程的效果。

    这个问题页可以看看《JavaScript 运行机制详解》一文,阮一峰老师也又关于此问题的解答。他的解析是一种答案,但我并不是十分认可,因为“避免复杂性”这个论点其实说不通。对于普通人而言,程序本来都是复杂的,但对于程序员而言却不是,再复杂的程序都有人书写,不在于多一个多线程的JavaScript。
    ### 第9个问题:JavaScript什么时候实现原生的多线程支持?
    这个问题我没能力回答,但可以预测。现在绝大多数编程语言都是支持多线程的了,我相信未来的JavaScript也应该演变成多线程语言,而且已经快了!在HTML5里面已经有类似的设计,已经提供类似多线程的Worker(请参考Introduction to HTML5 Web Workers),并且ECMAScript 2016已经在探讨JavaScript并行机制了。
    ### 第10个问题:在未来,会不会有一种新的语言取代JavaScript在浏览器上的位置?
    这个问题我依然没能力回答,只能假设。假设有一种新的语言取代了JavaScript,原来那一大堆使用JavaScript编写的页面交互应用是不是要重构?根据我这几年从事前端开发以来的经验,一旦一个项目已经在线上跑起来了,彻底打翻重构是不太可能。即便未来又一门可运行在浏览器端的开发语言,那也是从新项目开始,而JavaScript会一直存在,最多就是两者并存。

    因此,我认为JavaScript被取代的可能性几乎不存在,前端开发者不需要那么多开发语言,html、css和JavaScript这三者各司其职就已经够,它们就是Web页面的铁三角(三角形是最稳固的),多一个就乱了。
    或许,有人说Facebook的jsx,拜托,这是 html+JavaScript 好吧!
    (我能想到的就这么多了,如果你还有,请给留言。)

    --------------------
    ## 后记

    这篇文章完成于2015年的国庆长假,除了陪小孩玩耍,其他空余时间基本上交给了它。总得来说,总体行文还算通顺,前后逻辑还是可以衔接起来的,但依然有一些不够详细或遗漏的地方。

    比如移动互联网崛起的细节还是可以展开,这些细节对前端开发是存在深刻影响的,最为明显的就是多屏多终端带来前端开发的挑战,这些其实已经重新定义了前端开发这个工种,并改变了前后端协作的开发模式——让前后端分离模式成为互联网项目的必然选择。

    在这些过程中,JavaScript这门语言也需要做出一些改变,以迎合日益变化的需求,同时就意味着对前端开发者的要求会越来越高,如果你还是停留在传统前端的阶段,那么要么被淘汰或转型,要么就要适应它的变化,迎合现在或未来的互联网项目对于前端开发的要求。

    那么,现在互联网业务对于前端开发的要求是什么?我认为,对于大多数项目而言,可以分为两个层次:

    ### 基本要求:按照项目的需要,独立完成页面的前端开发。

    熟练掌握HTML、CSS和JavaScript,这是前端的铁三角,是基本功。在未来,企业对于前端开发者的基本功要求不会降低,反而会越来越苛刻。在这个层面,比较傲漂亮地完成切图,这是岗位的基本要求,并能够要以jQuery/Zepto等类库为基础完成页面的基本交互。

    只有掌握了这些并能完成基础的交互,入门的前端开发者才能尽快走进项目实战中来。开发者的技能的提高并不是通过看书就可以的,唯有多多地参与项目实战才是最佳的选择。

    在这个阶段,看书只要了解基本语法即可,不需要如“设计模式”、“原型继承”等高阶知识有理解,但一定要反复加强对于基础语法概念的理解,养成良好的编程习惯(比如空格、缩进、变量命名、逗号等等很基础的东西),别觉得这些东西并不影响逻辑的实现就可以随意处理。

    说一句难听的话,很多开发者在一开始的时候总是想着要“快”,对于那些看似影响“快”的东西就嗅之以鼻。不就是一个空格吗?不就是格式没有对齐吗?不就是函数名没有驼峰吗?这些玩意又不会影响业务逻辑的实现,干嘛要斤斤计较这些‘虚’无的东西呢?

    对此,我只能表示呵呵。多说无益,觉得有必要就按照别人的建议去做,不会害你就是了。如果非要我给出理由,其实很多,这里只说一点——


    程序并不是只给自己看的,只有你为别人着想,这样别人才会为你着想!只有照顾别人感受的人,才更容易获得更多的更好的锻炼机会,代码能力才会提高得更快,薪水也涨得更快,或许还有职位的提升。

    写好程序,先学会换位思考!写程序就在做人,别只顾着自己。就像我们能从一个人的字画了解他的性格为人,从一个人的代码也可以看到他的品质,两者的道理是一样的。我就不啰嗦了,说多了就是成了鸡汤。

    总之,前端入门其实是很容易的,并且快速跨过这个阶段也不需要太长的时间,一般半年就足够了,如果你做了超过1年甚至2年都还停留在这个阶段,那么请自己好好反思。

    ### 扩展要求:了解主流的开发类库和框架,具备前端工程化思维

    这个其实是初级训练实战之后的延续,这个阶段主要是对项目的战术有了解,可独立负责项目的开发和自我跟进。在互联网项目中,岗位级别一般就是中高级前端了。

    这个层面还是以实现项目的业务逻辑为标准,当然,也项目开始要求这种界别的前端负责带领2-3个人去做项目,同事也需要写代码的,实现比较有难度的项目。如果是成熟型互联网项目,可能不要求带队,但一般会安排到比较紧急、重要的需求的项目生产线上。

    这时候对于前端开发者的能力要求自然要高很多。以电商项目为例,我觉得是基本上能够独立解决各种业务需求,攻克常见的难关,能独挡一面。如果非要有一个衡量的标准,那么我认为至少要具备以下技能点:
    1,html、css和JavaScript较为扎实的基本功,尤其是JavaScript方面能力,要能脱离jq/zepto之类的工具类库也能干活,具备良好的面向对象编程的思维,能够书写和维护较大规模的前端业务代码。
    2,熟练使用Sass、LESS、Stylus等CSS 预处理器中的一款。
    3,掌握至少一种前端模块化开发规范及其相关框架,比如AMD(requireJS)或CMD(seajs)。
    4,掌握至少一款前端MVC/MVVM框架,并有一、两个项目实战经验。
    5,熟悉至少一门热门的后端开发语言,比如php,java。
    6,团队协作方面,有在具有较大规模的电商开发经验,必须具备至少一个有多人协作开发的项目参与经验,掌握SVN或Git中的一种。
    7,熟悉前端页面的优化原则,熟悉http协议的通讯机制,对静态资源缓存机制较深入的了解。
    8,熟悉HTML5和CSS3,有移动H5网站开发经验。
    事实上,初级的前端开发者要想真正掌握以上我所列的技能或要求,唯有通过大量的项目实战来获取和巩固,别期望看书也能学会。

    当然,这个阶段的前端开发者在理念层面,至少要阅读一些面向对象、原型继承等前端相关书籍,了解大型前端项目如何组织代码,特别是JavaScript方面的模块化设计模式,具备一定前端工程化的解决能力。

    得益于NodeJS的出现,它给我们带来了很多前端构建工具,解决了由于前端开发语言以及开发环境上的局限所导致的开发体验差、边际和重复工作多等问题,进而使得前端开发已经具备通用软件的特点——程序员开发、调试和维护的是源码,而源码必须通过编译才能用于生产,而不能像以往那样以裸奔的源码放在生产线上

    这就是前端项目的工程化。

    在过去或现在,掌握这种需求的实现可能属于高阶的技能,但随着JavaScript语言的发展和完善,前端工具也在不断进化,会涌现越来越多的前端工程化解决方案。掌握这种技能前端开发者也会越来越多,这就意味着企业以前可能会给具备此类技能的人开30K以上的薪水,或许以后最多就20K甚至更低。

    ### 我眼中的顶级前端Coder
    (未完待续)

    ## 参考文献:
    How browsers work
    Processes and Threads
    进程与线程的一个简单解释
    JavaScript 运行机制详解:再谈Event Loop
    JavaScript的历史 -- JavaScript 标准参考教程(alpha)
    Intel曾经也败过!回忆AMD史上的经典CPU_应用
    http://support.microsoft.com/zh-cn/kb/810231
    ECMAScript_百度百科
    mozilla_百度百科
    多核cpu_百度百科
    Ajax (programming)
    Ajax: A New Approach to Web Applications
    Web 2.0与Ajax
    为什么V8引擎这么快?
    多核时代的浏览器应该是这样的:再探Mozilla浏览器布局引擎Servo
    http://36kr.com/p/217101.html
    Introduction to HTML5 Web Workers

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    分享到:
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    官方微博:

    官方头条号:

    官方微信

    手机访问:

    官方微信

    QQArchiver 手机版 小黑屋 一起学LINUX - GOGOLINUX 闽ICP备18025837号-1 Discuz! X3.4 Powered by © 2001-2013 Comsenz Inc. 

    本站资源均来自互联网或会员发布,如果侵犯了您的权益请与我们联系,我们将在24小时内删除!谢谢!

    快速回复 快速发帖 返回顶部 返回列表