Node.js是用来做什么的?
Posted 前端设计联盟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js是用来做什么的?相关的知识,希望对你有一定的参考价值。
首先要了解Node.js,我们可以先要了解什么是v8引擎,可以说Node.js的诞生很大程度上归功于v8引擎的出现。我们都知道计算机处理器只能识别机器语言,而javascript是一门高级语言,计算机并不能直接读懂。所以我们需要所谓的引擎来将其转化成计算机所能理解的语言。
v8引擎是由Google推出的,为其浏览器Chrome所设计的开源JavaScript引擎。得益于JIT,编译模式的改变与编译阶段的优化,JavaScript的性能得到了一个飞跃。其源代码是用c++写的,感兴趣的可以点GitHub – v8/v8: The official mirror of the V8 git repository除了对JavaScript性能的大幅提升,v8引擎也提供了“嵌入”的功能,使得开发者也可以在自己的c++程序中使用“嵌入”的v8引擎,从而高效地编译JavaScript,并加入c++的feature。
要知道,作为一个底层得多的语言,c++可以实现的feature可要比JavaScript多得多。举例说明,JavaScript本身并没有read这么一个function。然而通过v8,我们可以将其绑定到一个用c++写的read callback上,从而通过JavaScript我们也可以直接加载文件了。于是,借助于v8种种便利的功能,Node.js诞生了。
Node.js是一项服务器技术。我们都知道客户端提出服务请求,而服务器端负责处理请求并提供服务。而对于互联网来说,在Node.js之前JavaScript是一项完全的客户端技术,被用于浏览器中实现各种动画,对DOM的操作等等。而后端,即服务端则是由php、Python、Ruby、Java等等语言来实现。
Node.js的出现,使得前后端使用同一种语言,统一模型的梦想得以实现。
所以Node.js到底解决了JavaScript的什么痛点和问题?更好的组织代码,提升复用性。当然在ES6中这一点也得到了很大的提升。处理文件与数据库。与互联网进行沟通,以标准化的格式处理请求并发送回答。快速地解决如上问题。
同时,Node.js还带来了许多别的后端技术所不具备,或是不完善的优点,如其他人回答中的事件驱动,异步编程,非阻塞式io等等。JavaScript本身语言的特性,以及其的流行程度与社区活跃度给Node.js带来了各种意义上的优势。
什么是Node.js
Q:Node.js?
A:这货不是Javascript。但它的的确确是Javascript!
Q:一个新的Javascript框架?
A:不是框架,哦,如果不严格地说,好像也算是框架,但是在浏览器中它不并怎么受支持。
Q:那有个屁用?
A:那就错了,它的作用会让你和你的小伙伴惊呆的。
Q:哦?我不相信!
A:额,如果有人告诉你,这货是做服务器端开发的,就像Java,PHP,.NET,GO,Python和Ruby等等做服务器端开发一样,你会相信吗?
Q:是吗?你这是在侮辱我的智商!
A:别着急,首先要申明,当初网景这个公司开发LiveScript的时候,本来就在同步制作服务端的开发,只是因为那个时代已经有很多有名的后台语言诞生,从而放弃这个梦想,所以你现在只看到浏览器中的Javascript,而且它被人长久误会为玩具。哦,对了,JavaScript和LiveScript是一个东西。
Q:好吧,这好像有点意思,那么它能做什么?
A:不要着急,这么伟大的一个创举,你为什么不多体会一下呢,其实一直有人在做这样的事情,只不过没有被得到广泛应用,或者只是自己用来玩玩,而不像V8团队这样聪明。
Q:V8?
A:没错,V8,这是一个在丹麦的Google团队,专门开发Javascript引擎,或许你已经无时无刻的都在使用它,也许你用过Chrome浏览器,或者基于Chromium的浏览器,那么你可以体会到页面的加载速度如此之快,这些一部分得利于V8引擎。
Q:那你的意思是,V8引擎可以将Javascript用于服务器功能开发?
A:正如你所说,谷歌开源了这个引擎,不仅仅开源这样简单,在Javascript的发展到路上具有划时代的意义。在前端,jQuery的出现加速了页面性能的优化,提高了Javascript的脚本功能,从而使得更多的前端框架出现,而现在Javascript的服务端功能得以东山再起,使得Javascript不在是单兵作战。
Q:我已经知道Javascript的服务端功能了,那么这个项目就叫做Node.js?
A:是的。
Q:那他能做什么呢?
A:服务端想要做到的事情基本都能做到。
Q:它由什么编写而成的呢?
A:C++
Q:那么它对底层的支持如何?
A:嗯,这样给你说吧,Node.js的实质就是用Javascript的代码规范通过C++进行了实现和封装,现在Node.js正在快速发展,对底层的支持也在逐步扩展,其中很多原生的Node都是使用底层的方式进行运作的。
Q:那这么说,我是否可以开发HTTP或者HTTPS协议这样的服务呢?
A:当然可以,而且还非常简单,甚至可以做TCP中socket开发,当然UDP一样支持。
Q:如果这样,我想我会考虑学习这个语言,可是,它有什么优点和缺点,现在的服务端语言这么多,我为什么要使用它呢?
A:当然,你没有必要必须要使用它,或许他也不是一门必修的语言课程,但是他的魅力足以让你学习。如果说优点,那么就是它是单线程多核多进程的语言,并且在他眼里所有的都是事件,而缺点也是因为如此,它无法满足实时密集型请求处理,而事件模型是很多人无法理解的。
Q:单线程?我的天,那效率怎么能提高呢?
A:不,其实多线程的语言处理是以消耗内存为代价,对于CPU的使用率一直不是很好,V8团队坚信,单线程已经够用了,使用非阻塞式IO和请求大大提高CPU的使用率,如果使CPU达到100%利用,那最好不过了,并且这对内存的释放也是有好处的。但也是因为如此对于密集方式请求,可能会出现阻塞,但好在当前密集方式请求并不是很多。
Q:好吧,那么什么是事件模型,我不太明白。
A:事件模型,从概念上来说就是通过一些列事件的绑定和触发进行交互的反馈,如果你使用过一些语言的监听器,或者理解什么是监听者模式,你会更好的理解这些,但是这里我不想太多讲解这些,你可以简单的理解为,所有的处理都像是在发命令,而对这个命令有兴趣的人会有反应,从而做一些事情。
Q:哦,那如果这样说,Node不是顺序执行了?
A:是的,这正是事件模型的核心,它不考虑顺序,而是以实际的事件响应顺序为主,所以这也给一些想学习这个语言的人带来了一些障碍,或许无法很好的理解这一点,但是我想应该先去学习一下什么是监听者模式就够了。
Q:很好,我现在知道一些大概了,那我们是不是忽略了什么?
A:你说的很对,我们忽略了很多,但是犹如之前的对话,其中的缺点也就是我们所忽略的,Node不是万能的,比如他无法实现客户端界面的开发,至少目前是这样,对数据库的链接有些官方没有发行和开发,你或许可以在社区中看到有类似mysql的处理库,但这不意味者这是官方发行版本,所以很多人不愿意通过Node与数据库进行链接,当然现在Node对NoSQL类型数据库链接支持的不错。
Q:社区?那么这个社区活跃吗?
A:非常活跃,也正式因为如此,Node的发展速度非常惊人,比如你可以自己构建一个LIB,通过npm进行发布的升级,就是这么简单。
Q:那他在什么系统下开发?
A:除了传统的linux和unix外,现在也支持windows,当然windows下毕竟不是主流,我想你不也不会考虑在windows下进行开发。
Q:是的。不过能否给我一个简单的例子,让我体会一下呢?
A:没有问题。
var http = require('http');
var util = require('util');
var querystring = require('querystring');
http.createServer(function(request,response){
var post = '';
request.on('data',function(chunk){
post += chunk;
console.log(chunk);
});
request.on('end',function(){
post = querystring.parse(post);
response.end(util.inspect(post));
});
}).listen(8080);
以上是关于Node.js是用来做什么的?的主要内容,如果未能解决你的问题,请参考以下文章