Node.js到底是⽤来做什么的
第⼀次更新 查漏补缺昨晚零时写的 辣鸡输⼊法导致错别字太多。
Node.js的到底是⽤来做什么的
Node.js的简介
根据对于Node.js的介绍,我们可以知道⼀些基本关于Node.js的情况。Node.js是瑞安·达尔(Ryan Dahl)在2009年发明出来的⼀种⼀个能够在服务器端运⾏JavaScript,并且可以开放源代码,以及跨平台运⾏JavaScript的⼀种运⾏环境。
Node.js采⽤了Google公司的V8引擎。Node.js允许通过JavaScript和⼀系列模块来编写服务器端应⽤和⽹络相关的应⽤。核⼼模块包括⽂件系统I/O、⽹络(HTTP、TCP、UDP、DNS、TLS/SSL等)、⼆进制数据流、加密算法、数据流等等。Node模块的API形式简单,降低了编程的复杂度。
Node.js主要⽤于编写像Web服务器⼀样的⽹络应⽤,这和PHP和Python是类似的。但是Node.js与其他语⾔最⼤的不同之处在于,PHP等语⾔是阻塞的(只有前⼀条命令执⾏完毕才会执⾏后⾯的命令),⽽Node.js是⾮阻塞的(多条命令可以同时被运⾏,通过回调函数得知命令已结束运⾏)。
Node.js是事件驱动的。开发者可以在不使⽤线程的情况下开发出⼀个能够承载⾼并发的服务器。其他服务器端语⾔难以开发⾼并发应⽤,⽽且即使开发出来,性能也不尽⼈意。Node.js正是在这个前提下被创造出来。Node.js把JavaScript的易学易⽤和Unix⽹络编程的强⼤结合到了⼀起。Node.js使⽤Google V8 JavaScript 引擎,因为
V8是基于BSD许可证的开源软件
V8速度⾮常快
V8专注于⽹络功能,在HTTP、DNS、TCP等⽅⾯更加成熟
杂叙
在学习Web前端的朋友看来,Node.js是⼀个经常会听到⽽且⽆法回避的问题,然⽽国内的资料相对较少,国外的资料⼤多数是以英⽂为主要蓝本阐述的,所以友好度并不⾼,我结合最近查询到的资料,结合⾃⼰浅薄的见解,做出⼀点点介绍和综述,希望可以帮到⼤家。如有不正,多请斧正!
1. N o de.js到底是什么
Node.js在中就已经很明确的说明了,它是⼀个运⾏环境,并不是其他的什么⽐如软件库,简⽽⾔之,和C#所需要的编译环境⼀
样,Node.js就是JavaScript的编译环境,它存在的⽬的就是为了让JavaScript可以和其他的后端语⾔⼀样能够在浏览器上运⾏,换种说法就是,可以让前端语⾔JavaScript在写完之后交给Node.js进⾏编译和解释,它的存在对于JavaScript有了质的飞跃,对于⼀个前端来说利⽤JavaScript就可以编译后台代码是⼀件多么爽飞天的事情。
简单的Node.js命令就是
#node hello.js
2. V8引擎
我们都知道计算机处理器智能识别机器语⾔,⽽JavaScript是⼀门⾼级语⾔,计算机并不能直接读懂。所以我们需要所谓的引擎来将其转化成计算机所能理解的语⾔。v8引擎是由Google推出的,为其浏览器Chrome所设计的开源JavaScript引擎。得益于JIT,编译模式的改变与编译阶段的优化,JavaScript的性能得到了⼀个飞跃。其源代码是⽤c++写的,感除了对JavaScript性能的⼤幅提升,v8引擎也提供了“嵌⼊”的功能,使得开发者也可以在⾃⼰的c++程序中使⽤“嵌⼊”的v8引擎,从⽽⾼效地编译JavaScript,并加⼊c++的feature。要知道,作为⼀个底层得多的语⾔,c++可以实现的feature可要⽐JavaScript多得多。举例说明,JavaScript本⾝并没有read这么⼀个function。然⽽通过v8,我们可以将其绑定到⼀个⽤c++写的read callback上,从⽽通过JavaScript我们也可以直接加载⽂件了。
于是,借助于v8种种便利的功能,Node.js诞⽣了。
3. 数据的请求和处理(表述的不太准确望海涵)
⾸先我们要注意的是浏览器给⽹站发请求的过程⼀直没怎么变过。当浏览器给⽹站发了请求。服务器收到了请求,然后开始搜寻被请求的资源。如果有需要,服务器还会查询⼀下数据库,最后把响应结果传回浏览器。不过,在传统的web服务器中,每⼀个请求都会让服务器创建⼀个新的进程来处理这个请求。后来有了Ajax,我们就不⽤每次都请求⼀个完整的新页⾯了,取⽽代之的是,每次只请求需要的部分页⾯信息就可以了。这显然是⼀个进步。但是⽐如你要建⼀个类似微博的社交⽹站,导致的结果是你的好友会随时的推送新的状态,然后你的新鲜事会实时⾃动刷新。要达成这个需求,我们需要让⽤户⼀直与服务器保持⼀个有效连接。⽬前最简单的实现⽅法,就是让⽤户和服务器之间保持长轮训(long polling)。HTTP请求不是持续的连接,你请求⼀次,服务器响应⼀次,然后就完了。长轮训是⼀种利⽤HTTP模拟持续连接的技巧。具体来说,只要页⾯载⼊了,不管你需不需要服务器给你响应信息,你都会给服务器发⼀个Ajax请求。这个请求不同于⼀般的Ajax请求,服务器不会直接给你返回信息,⽽是它要等着,直到服务器觉得该给你发信息了,它才会响应。⽐如,你的好友发了⼀条新鲜事,服务器就会把这个新鲜事当做响应发给你的浏览器,然后你的浏览器就刷新页⾯了。浏览器收到响应刷新完之后,再发送⼀条新的请求给服务器,这个请求依然不会⽴即被响应。于是就开始重复以上步骤。利⽤这个⽅法,可以让浏览器始终保持等待响应的状态。虽然以上过程依然只有⾮持续的
HTTP参与,但是我们模拟出了⼀个看似持续的连接状态我们再看传统的服务器。每次⼀个新⽤户连到你的⽹站上,你的服务器就得开⼀个连接。每个连接都需要占⼀个进程,这些进程⼤部分时间都是闲着的(⽐如等着你好友发新鲜事,等好友发完才给⽤户响应信息。或者等着数据库返回查询结果什么的)。虽然这些进程闲着,但是照样占⽤内存。这意味着,如果⽤户连接数的增长到⼀定规模,你服务器没准就要耗光内存直接瘫了。这种情况怎么解决?解决⽅法就是刚才上边说的:⾮阻塞和事件驱动。这些概念在我们谈的这个情景⾥⾯其实没那么难理解。你把⾮阻塞的服务器想象成⼀个loop循环,这个loop会⼀直跑下去。⼀个新请求来了,这个loop就接了这个请求,把这个请求传给其他的进程(⽐如传给⼀个搞数据库查询的进程),然后响应⼀个回调(callback)。完事了这loop就接着跑,接其他的请求。这样下来。服务器就不会像之前那样傻等着数据库返回结果了。如果数据库把结果返回来了,loop就把结果传回⽤户的浏览器,接着继续跑。在这种⽅式下,你的服务器的进程就不会闲着等着。从⽽在理论上说,同⼀时刻的数据库查询数量,以及⽤户的请求数量就没有限制了。服务器只在⽤户那边有事件发⽣的时候才响应,这就是事件驱动。FriendFeed是⽤基于Python的⾮阻塞框架Tornado (知乎也⽤了这个框架) 来实现上⾯说的新鲜事功能的。不过,Node.js就⽐前者更妙了。Node.js的应⽤是通过javascript开发的,然后直接在Google的变态V8引擎上跑。
⽤了Node.js,你就不⽤担⼼⽤户端的请求会在服务器⾥跑了⼀段能够造成阻塞的代码了。因为javascript本⾝就是事件驱动的脚本语⾔。你回想⼀下,在给前端写javascript的时候,更多时候你都是在搞事件处理和回调函数。所以javascript本⾝就是给事件处理量⾝定制的语⾔。
javascript的特性4. 使⽤N o de.js的优劣(很重要)
在使⽤Node.js的时候我们可以知道,Node.js解决了很多JavaScript的痛点。当然Node.js作为⼀个语⾔也有很多都缺陷。
优势
采⽤事件驱动、异步编程,为⽹络服务⽽设计。其实Javascript的匿名函数和闭包特性⾮常适合事件驱动、异步编程。⽽且JavaScript也简单易学,很多前端设计⼈员可以很快上⼿做后端设计。
Node.js⾮阻塞模式的IO处理给Node.js带来在相对低系统资源耗⽤下的⾼性能与出众的负载能⼒,⾮常适合⽤作依赖其它IO资源的中间层服务。
Node.js轻量⾼效,可以认为是数据密集型分布式部署环境下的实时应⽤系统的完美解决⽅案。Node⾮常适合如下情况:在响应客户端之前,您预计可能有很⾼的流量,但所需的服务器端逻辑和处理不⼀定很多。
缺点
可靠性低。
单进程,单线程,只⽀持单核CPU,不能充分的利⽤多核CPU服务器。⼀旦这个进程崩掉,那么整个web服务就崩掉了。
当然对于这些缺点也哟普很多解决办法:
开启多个进程,每个进程绑定不同的端⼝,⽤反向代理服务器如 Nginx 做负载均衡,好处是我们可以借助强⼤的 Nginx 做⼀些过滤检查之类的操作,同时能够实现⽐较好的均衡策略,但坏处也是显⽽易见——我们引⼊了⼀个间接层。
多进程绑定在同⼀个端⼝侦听。在Node.js中,提供了进程间发送“⽂件句柄” 的功能。
⼀个进程负责监听、接收连接,然后把接收到的连接平均发送到⼦进程中去处理。
5. 适⽤场景
SON APIs——构建⼀个Rest/JSON API服务,Node.js可以充分发挥其⾮阻塞IO模型以及JavaScript对JSON的功能⽀持(如JSON.stringfy函数)单页⾯、多Ajax请求应⽤——如Gmail,前端有⼤量的异步请求,需要服务后端有极⾼的响应速度基于Node.js开发Unix命令⾏⼯具——Node.js可以⼤量⽣产⼦进程,并以流的⽅式输出,这使得它⾮常适合做Unix命令⾏⼯具流式数据——传统的Web应⽤,通常会将HTTP请求和响应看成是原⼦事件。⽽Node.js会充分利⽤流式数据这个特点,构建⾮常酷的应⽤。
如实时⽂件上传系统transloadit准实时应⽤系统——如聊天系统、微博系统,但Javascript是有垃圾回收机制的,这就意味着,系统的响应时间是不平滑的(GC垃圾回收会导致系统这⼀时刻停⽌⼯作)。如果想要构建硬实时应⽤系统,Erlang是个不错的选择。
结语
Node.js是⼀个对于前端⼯作者不可或缺的⼯具。尤其是对于JavaScript有着巨⼤的提升,现阶段Node.js的应⽤已经有了⾮常蓬勃的发展。对于Node.js的学习和熟练运⽤,必不可少!以上。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。