【转】Node.js究竟是用来作什么的

Node.js的究竟是用来作什么的

在阐述以前我想放一个连接,这是国外的一个大神,对于node.js很是好的一篇介绍的文章,英文比较好的朋友能够直接去阅读,本文也很大程度上参考了这篇文章,也同时感谢知乎用户厂长对于本文的翻译!原文题目为Node.js is the New Blackjavascript

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等方面更加成熟

Node.js已经有数十万模块,它们能够经过一个名为npm的管理器免费下载。Node.js开发社区主要有两个邮件列表、一个在freenode的名为#node.js的IRC频道。社区集中在NodeConfjava

杂叙

在学习Web前端的朋友看来,Node.js是一个常常会听到并且没法回避的问题,然而国内的资料相对较少,国外的资料大多数是以英文为主要蓝本阐述的,因此友好度并不高,我结合最近查询到的资料,结合本身浅薄的看法,作出一点点介绍和综述,但愿能够帮到你们。若有不正,多请斧正!node

1. Node.js究竟是什么

Node.js在维基百科中就已经很明确的说明了,它是一个运行环境,并非其余的什么好比软件库,简而言之,和C#所须要的编译环境同样,Node.js就是JavaScript的编译环境,它存在的目的就是为了让JavaScript能够和其余的后端语言同样可以在浏览器上运行,换种说法就是,可让前端语言JavaScript在写完以后交给Node.js进行编译和解释,它的存在对于JavaScript有了质的飞跃,对于一个前端来讲利用JavaScript就能够编译后台代码是一件多么爽飞天的事情。
简单的Node.js命令就是c++

#node hello.jsweb

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自己就是给事件处理量身定制的语言。数据库

4. 使用Node.js的优劣(很重要)

在使用Node.js的时候咱们能够知道,Node.js解决了不少JavaScript的痛点。固然Node.js做为一个语言也有不少都缺陷。
优点npm

  • 采用事件驱动、异步编程,为网络服务而设计。其实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的学习和熟练运用,必不可少!以上。

【转自】https://www.jianshu.com/p/fac1fa66a00a
相关文章
相关标签/搜索