浏览器之争

在Netscape设计出JavaScript后的短短几个月,JavaScript事实上已经是前端开发的唯一标准。

后来,微软通过IE击败了Netscape后一统桌面,结果几年时间,浏览器毫无进步。(2001年推出的古老的IE 6到今天仍然有人在使用!)

没有竞争就没有发展。微软认为IE6浏览器已经非常完善,几乎没有可改进之处,然后解散了IE6开发团队!而Google却认为支持现代Web应用的新一代浏览器才刚刚起步,尤其是浏览器负责运行JavaScript的引擎性能还可提升10倍。

先是Mozilla借助已壮烈牺牲的Netscape遗产在2002年推出了Firefox浏览器,紧接着Apple于2003年在开源的KHTML浏览器的基础上推出了WebKit内核的Safari浏览器,不过仅限于Mac平台。

随后,Google也开始创建自家的浏览器。他们也看中了WebKit内核,于是基于WebKit内核推出了Chrome浏览器。

Chrome浏览器是跨Windows和Mac平台的,并且,Google认为要运行现代Web应用,浏览器必须有一个性能非常强劲的JavaScript引擎,于是Google自己开发了一个高性能JavaScript引擎,名字叫V8,以BSD许可证开源。

现代浏览器大战让微软的IE浏览器远远地落后了,因为他们解散了最有经验、战斗力最强的浏览器团队!回过头再追赶却发现,支持HTML5的WebKit已经成为手机端的标准了,IE浏览器从此与主流移动端设备绝缘。

V8(JavaScript引擎)

V8使用C++开发,并在谷歌浏览器中使用。在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。

V8中实现的ECMAScript中指定 ECMA - 262 ,第3版 运行在Windows XP和Vista,Mac OS X的10.5(雪豹和Linux系统使用IA - 32或ARM处理器。

V8可以独立运行,也可以 嵌入 到任何C++应用程序。项目托管在Google Code上 [1]  ,基于BSD协议,任何组织或个人可以将其源码用于自己的项目中。

浏览器大战和Node有何关系?

话说有个叫Ryan Dahl的歪果仁,他的工作是用C/C++写高性能Web服务。对于高性能,异步IO、事件驱动是基本原则,但是用C/C++写就太痛苦了。于是这位仁兄开始设想用高级语言开发Web服务。他评估了很多种高级语言,发现很多语言虽然同时提供了同步IO和异步IO,但是开发人员一旦用了同步IO,他们就再也懒得写异步IO了,所以,最终,Ryan瞄向了JavaScript。

因为JavaScript是单线程执行,根本不能进行同步IO操作,所以,JavaScript的这一“缺陷”导致了它只能使用异步IO。

选定了开发语言,还要有运行时引擎。这位仁兄曾考虑过自己写一个,不过明智地放弃了,因为V8就是开源的JavaScript引擎。让Google投资去优化V8,咱只负责改造一下拿来用,还不用付钱,这个买卖很划算。

于是在2009年,Ryan正式推出了基于JavaScript语言和V8引擎的开源Web服务器项目,命名为Node.js。虽然名字很土,但是,Node第一次把JavaScript带入到后端服务器开发,加上世界上已经有无数的JavaScript开发人员,所以Node一下子就火了起来。

在Node上运行的JavaScript相比其他后端开发语言有何优势?

最大的优势是借助JavaScript天生的事件驱动机制加V8高性能引擎,使编写高性能Web服务轻而易举。

其次,JavaScript语言本身是完善的函数式语言,在前端开发时,开发人员往往写得比较随意,让人感觉JavaScript就是个“玩具语言”。但是,在Node环境下,通过模块化的JavaScript代码,加上函数式编程,并且无需考虑浏览器兼容性问题,直接使用最新的ECMAScript 6标准,可以完全满足工程上的需求。

Note.js的应用场景分析(I/O密集型)

NodeJS是近年来比较火的服务端JS平台,这一方面得益于其在后端处理高并发的卓越性能,
另一方面在nodeJS平台上的npm、grunt、express等强大的代码与项目管理应用崛起,几乎重新定义了前端的工作方式和流程。

在讲NodeJS之前我们不仿先看一下传统(以Apache为代表)的服务器端处理平台处理并发的方式。

Apache的多线程高并发模式

Apache是当前世界排名第一的Web服务端软件,它由于支持多线程并发而受到广大服务器技术选型者的欢迎。但发展到后来,Apache在一些WEB的大型应用中也渐渐暴露出它的缺点:阻塞。

那有的同学会奇怪,Apache不是多线程处理并发吗,为什么还会出现阻塞呢?

要明白这一点我们首先需要了解线程这个概念:

我们可以看到同一个进程下的线程是会共享相同的文件和内存的(内存地址空间),所以大家可以想象,当不同的线程需要占用同一个变量时,根据先到先得的原则,先到的线程在运作时,后来的线程只能在旁边等待,也就是加入到了阻塞排队序列。所以这就是造成线程阻塞的原因。

因此,虽说进程可以支持多个线程,它们看似同时执行,但互相之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易,因为程序设计者必须小心,确保它们不会妨碍同一进程里的其它线程。

了解了多线程并行的缺陷后,我们就可以更好地理解NodeJS的强大所在了。因为NodeJS是异步单线程的

NodeJS的工作原理其实就是事件循环。可以说每一条NodeJS的逻辑都是写在回调函数里面的,而回调函数都是有返回之后才异步执行的!

NodeJS不是没有阻塞,而是阻塞不发生在后续回调的流程,而会发生在NodeJS本身对逻辑的计算和处理。我们已经知道,NodeJS的分发能力无比强大,可以循环事件进行异步回调。但如果在循环事件时遇到复杂的逻辑运算,那么单薄的单线程怎么支撑得起上百万的逻辑+并发呢?NodeJS它的所有I/O、网络通信等比较耗时的操作,都可以交给worker threads执行再回调,所以很快。但CPU的正常操作,它就只能自己抗了。

既然NodeJS处理并发的能力强,但处理计算和逻辑的能力反而很弱,因此,如果我们把复杂的逻辑运算都搬到前端(客户端)完成,而NodeJS只需要提供异步I/O,这样就可以实现对高并发的高性能处理。情况就很多啦,比如:RESTFUL API、实时聊天、客户端逻辑强大的单页APP,具体的例子比如说:本地化的在线音乐应用,本地化的在线搜索应用,本地化的在线APP等。

Note.js好的用例

JSON API

建立轻量级的REST / JSON api正是node.js的亮点。如果你要包上你的数据库操作或web服务,同时通过JSON把接口暴露出来,node.js的无阻塞模型和JavaScript技术让它成为你非常好的一个选择。

单页的app

如果你打算写一个AJAX操作非常多的单页面app(比如gmail),node.js是非常合适的。在极短的响应时间内处理大量请求的能力,不同的客户端共享像确认信息之类的东西,这些都让node.js成为那种在客户端做很多处理的web程序的很好的选择。

对unix工具的脚本化调用

node.js现在还很年轻,它正在试图为自己重新发明各种软件,不过更好的办法是深入到现有的广阔的命令行工具世界里。Node.js拥有产生数以千计的子进程的能力,同时可以把这些子进程的输出以流的方式处理,这让它成为那种和现有软件寻求平衡时的很好的选择。

流数据

传统的web程序讲http请求和响应作为元事件处理。可事实是它们是流,很多很酷的node.js程序正是利用这个优点创建的。最牛的例子是实时解析上传文件,还在不同的数据层建立了代理。

软件实时程序

node.js另一个很大的方面是你可以很轻松的开发软实时系统。这是指那些像twitter,聊天软件,体彩或实时通讯网络的接口。

但是这里你得注意了,因为JavaScript的动态垃圾回收特性,你得到的响应次数是依赖于你多频繁以及多久触发垃圾回收机制(此时你的程序停止了)。所以不要试图在node里建立硬实时系统,那需要永远一致的响应时间。Erlang在这一类的程序上应该是更好的选择。

Note.js的前世今生相关推荐

  1. 为什么Note.js 里面没有sap.ui.core.Control.extend()这样的代码,但是runtime有自动生成有

    Sent: Wednesday, March 18, 2015 6:43 PM UI5 team的人写了一些Maven plugin,Maven build时,首先通过一个xslt在target fo ...

  2. 为什么你们的Note.js 里面没有sap.ui.core.Control.extend()这样的代码,但是runtime有自动生成有

    From: Wang, Jerry Sent: Wednesday, March 18, 2015 6:44 PM Subject: RE: 另一种方法做本地reuse library的开发 UI5 ...

  3. SAP UI5 CRM Reuse Fiori应用 note.js代码审查结果

    目录 1. Unused require statement Line4 could be deleted. 2. Unused code _dateBound = true Is this _dat ...

  4. note js 创建项目_vue.js使用vuecli3快速创建项目

    vue-cli作为vue的脚手架,集成了webpack环境及主要依赖,对于项目的搭建.打包.维护管理都非常方便. Vue.js 全家桶系列:包含了 vue-router.vuex.vue-resour ...

  5. node.js的前世今生(特色篇)

    前言 在上一篇的文章里我们见证了node的诞生和发展史知道了node是怎么出现的,私下我查阅了很多资料和询问了一些有经验丰富的人在加上一些自己对node的理解,对整体有了一个稍微清晰的认识 希望通过这 ...

  6. note.js和mysql的优劣_nginx与Node.js的优缺点是什么?

    ngx相对node有这么几个较大的优点: 1.性能更高,毕竟C写的,而且ngx的epoll是裸的,node的epoll是libuv封装的. 2.完备的静态资源支持--这个就不说了,你用node写一个和 ...

  7. 高阶前端开发人员必备工具-Node.JS知识讲解

    想要成为一个"值钱"的高阶Web前端开发人才,Node.JS是必须要掌握的技术之一.今天小千就为大家详细讲解Node.JS的知识,让你完全了解Node.JS的前世今生. 1.说起N ...

  8. 前端科普系列(2):Node.js 换个角度看世界,

    [前端科普系列]往期精彩内容: 前端科普系列(1):很有趣的一篇前端简史,作者有心了~主要介绍 web 前端发展的历史.大事件. 本文为系列文章(2),主要介绍 Node.js 的前世今生.核心科技以 ...

  9. 修改js版本_啥都学点之使用nvm安装Node.js并实现Node.js多版本管理

    刚开始使用Node.js的时候,直接到官网下载安装 中文站点:https://nodejs.org/zh-cn/ Node.js网站截图 当接触的项目多以后,会出现一个问题,2个项目,使用的是不同的N ...

最新文章

  1. 无限极:对虚假宣传行为查处不力 推十条整改措施
  2. postgresql 9.1 暂停 stream 后使用 rsync 异机同步文件
  3. Qmake创建项目文件
  4. 您拒绝了位置共享服务器,共享服务器拒绝访问
  5. 物联网ZigBee3.0协议E18-2G4U04B模块无线数据抓包调试的方法
  6. python集合去重_python集合去重
  7. AWS云架构策略副总裁:开源是基础,也是未来
  8. Spring的单例模式底层实现
  9. 编译原理与编译构造 LR文法
  10. 果园机器人的写作思路_《果园机器人》教材理解
  11. 这么用 if-else,小鹿差点被辞退!
  12. IOS个人开发者账号和wp公司开发者帐号申请注意点
  13. Email邮件发送设置 工具开发整理(网易邮箱、Mailgun为例) 下篇
  14. VTK:绘制圆锥体(附完整源码)
  15. python实现目标检测voc格式标签数据增强
  16. 软件测试基础知识大全【乐搏TestPRO】
  17. python关于递归求组合与组合数-通过阶乘, fibonacci加深对递归的理解
  18. 最新美团代付源码+支持多模板/多支付通道/全开源
  19. 基于YOLO的人脸检测和人脸计数(课程设计)
  20. 【宝塔面板】紧急安全更新通知

热门文章

  1. JVM之(Shenandoah、ZGC收集器)(基于《深入理解Java虚拟机》之第三章垃圾收集器与内存分配策略)(下)
  2. 【厚积薄发系列】Python项目总结1—后端常驻程序的基本要求
  3. 上海市重点小学排名(2018年)
  4. java接口开放平台设计,OpenApi开放平台架构实践
  5. GPRS/GPS模块组学习——服务器搭建之云服务器 ECS
  6. nyoj453 小珂的烦恼 (set容器)
  7. Chrome控制台打印输出彩色调试信息
  8. 计算机如何增加网络地址,如何添加网络打印机到电脑
  9. 一个,两个,蓝精灵 (10 分)(Python)
  10. 低代码开发,染发界的白转黑|“低代码”系列(一)