node js是什么

一、Node.js不是什么

首先,不是另一个JavaScript框架,不是另一个jQuery、ExtJs、RequireJS、AngularJS。

其次,不是运行在浏览器中的,也不是运行在Web服务器里的,而是单独就能运行的。

Node.js和JavaScript有什么关系呢?Node.js采用的是JavaScript的语法,仅此而已。

需要注意的是Node.js采用的JavaScript是标准的ECMAJavaScript标准,由于不运行在浏览器中,所以不存在浏览器兼容性的问题。也没有DOM处理的相关事情。

二、Node.js是什么

1、Node.js是一个平台,是另一种语言

Node.js是一个平台。

为了帮助理解,我们可以把Node.js看作另外一种语言,只是这种语言碰巧采用了JavaScript的语法而已。

好吧,我们就把Node.js看作一种新的语言,这是一种脚本语言,脚本是解释执行的,所以需要一个解释器。

2008年发起的JavaScript引擎速度大战,极大提高JavaScript解释效率,V8是胜出者之一,Node.js直接采用V8作为JavaScript解释运行的底层支持(类似JVM之于Java)。

2、Node.js能做什么?

作为一个平台,一种语言,最基本的,可以开发基于命令行的或图形界面的桌面程序。

作为一种语言,Node.js支持基本的I/O操作,包括:文件I/O、网络I/O。

基于网络I/O能力,可以进一步实现连接数据库;

基于网络I/O能力,可以用来开发一个提供网络服务的服务器或客户端,如FTP、邮件服务器的服务器和客户端,如写个游戏外挂等。

一般来说,Node.js可完整地运行在Linux/Mac操作系统上,在Windows系统上,会越来越好,但不能保证所有的功能是完整健全的。

采用JavaScript的便捷语法,能做这么多事情,想象也有点小激动呢。

在这里,JavaScript终于升格为一等公民,同Java平起平坐了,不再是那个在浏览器里把Dom当主子伺候当受气小媳妇。

3、Node.js架构

为了实现这些功能,Node.js提供了Node标准库,采用JavaScript语法调用,方便到不行不行的。

为了支撑这些高层接口,底层是用C/C++编写的“Node下层接口”,如下图所示。

从Node.js架构图中可以看到,Node.js可清晰地分为三层:Node标准库、Node下层接口 和 更底层的支持。

更底层的支持中,V8我们前面提到过了,是解析JavaScript语法的引擎,那Libuv是什么呢?

这部分(Libuv、Libeio、Libev、IOCP)隐藏了Node.js最核心的一个秘密。

三、了不起的Node.js

当下流行的技术都是小巧而强大的,比如:nginx、redis、zookeeper等等,族繁不及备载。Node.js也是这样。

Node.js不仅仅在独立性和能力上超脱于浏览器中的同胞,这其中的差别好比当上总统的黑人相对于南方棉花园里的黑奴,甚至比这差别还大。

Node.js是为超大规模数据实时应用设计开发的,在性能上,它也把它的可怜同胞秒成渣。

看下面的对比数据:

四、Node.js的小秘密

为什么能取得这么好的成绩呢?现在给大家揭开这个秘密。

现在我们考虑一个问题,如何更充分地利用CPU资源。

有两个指标可以衡量,一个是CPU的空闲时间,一个是CPU线程的切换次数。

第一个指标:CPU空闲时间,空闲时间越少,效率越高。

第二个指标:我们都知道,CPU计算时间是分成时间片给线程使用的,操作系统负责调度,每次线程切换,需要保存当前现场到CPU外,把场子腾出来给别人用,恢复到时候反之,这是需要开销的,所以,切换次数越少,效率越高。

考虑到这些情况,Node.js采取“单线程+事件响应”作为基础的计算模型,这就是Node.js的核心秘密。

原理如下图所示,对比了完成同样的计算任务,多线程同步I/O和单线程异步I/O的区别。图中的“计算1”、“计算2”表示CPU在执行计算任务,“I/O”表示发生了I/O阻塞,CPU在空闲等待。

在单线程异步I/O(也就是Node.js采取的方式)中,CPU一直满负荷运转,没有等待的空闲时间。

同时,因为只有一个线程,无需进行进程切换。

回头看Node.js的架构图,Libuv的部分负责的就是事件驱动和异步I/O。

Libuv是Node.js为了统一不同实现做的一层接口抽象,Libeio、Libev、IOCP是具体实现。

至此,我们已经认识这位新朋友了。

是不是消除了好多误会呢?

Node.js这个名字着实起得不好。Node容易让人误会是Dom节点的意思。.js像极了 jQuery.js 中的.js。

真相大白了,Node.js着实和DOM和jQuery参商相隔,没有半毛钱关系,

五、Node.js的微内核

“异步事件模型”是Node.js的微内核,是Node.js的核心思想,是Node.js的主要方法论。

异步机制是Node.js的骨头,事件响应是Node.js的血。

1、基础编程模型

下面,看一段代码吧。

console.log('before db query');

db.query("select * from user",function(res){

    //res.output();

    console.log('finish db query');

})

console.log('after db query');

这段代码输出为:

before db query'

after db query

finish db query

解读一下,db.query的第二个函数是一个回调函数,也可以看作是事件响应函数。

执行完db.query,立即执行后面的console.log('after db query'),而不是等待数据库查询结果。

写过Java/PHP/C#数据库查询代码的童鞋马上脑补一下Java/PHP/C#代码是如何写的,如何执行的。等查询结果返回后才执行后面的语句,有木有?

这是Node.js的基本编程模型,读取文件的Api如下,伙伴们自行体会。

fs.read(filename,encoding,function(err,data){});

2、执行顺序

Node.js启动后,迅速把入口js文件中的语句逐条执行完,然后不断循环:

看一下是否有事件(如数据库查询完成)已经触发了,如果有,调用事件对应的回调函数,执行回调函数中的代码。

如果回调函数没有注册新的事件(如:发起数据库查询、发起 文件读写),则愉快地结束,继续下一次事件循环,等下一次事件触发。

如果回调函数中注册了新的事件,则放入到事件队列中。如下图所示。

六、Node标准库

Node标准库里都有啥呢?

可以到http://nodeapi.ucdok.com/api/查看Api文档。

console、util、fs、http等都是js最基本等模块。

本文只科普,代码层面的介绍另行叙述。

七、外围应用

Node.js的设计初衷是做一个碉堡天的Web应用,底层的API过于简单。

在Node标准库之上,又有应用层面的框架或工具供广大童鞋参考使用。

Express就是其中的一个,用于实现一个

另外还有大量基于Node.js的第三方工具,用于js合并发版的、用于单元测试的等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容