作者:厂长
链接:https://www.zhihu.com/question/33578075/answer/56951771
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

国外有一篇非常好的Node.js 介绍文章,从原理入手讲解,在这里给大家翻译一下(本人非翻译出身,一些地方结合了点个人理解,有错误欢迎指出)。

原文地址 Node.js is the New Black

译文如下:
如果你去年注意过技术方面的新闻,我敢说你至少看到node.js不下一两次。那么问题来了“node.js是什么?”。有些人没准会告诉你“这是一种通过JavaScript语言开发web服务端的东西”。如果这种晦涩解释还没把你搞晕,你没准会接着问:“为什么我们要用node.js?”,别人一般会告诉你:node.js有非阻塞,事件驱动I/O等特性,从而让高并发(high concurrency)在的轮询(Polling)和comet构建的应用中成为可能。

当你看完这些解释觉得跟看天书一样的时候,你估计也懒得继续问了。不过没事。我这篇文章就是在避开高端术语的同时,帮助你你理解node.js的。

浏览器给网站发请求的过程一直没怎么变过。当浏览器给网站发了请求。服务器收到了请求,然后开始搜寻被请求的资源。如果有需要,服务器还会查询一下数据库,最后把响应结果传回浏览器。不过,在传统的web服务器中(比如Apache),每一个请求都会让服务器创建一个新的进程来处理这个请求。

后来有了Ajax。有了Ajax,我们就不用每次都请求一个完整的新页面了,取而代之的是,每次只请求需要的部分页面信息就可以了。这显然是一个进步。但是比如你要建一个FriendFeed这样的社交网站(类似人人网那样的刷朋友新鲜事的网站),你的好友会随时的推送新的状态,然后你的新鲜事会实时自动刷新。要达成这个需求,我们需要让用户一直与服务器保持一个有效连接。目前最简单的实现方法,就是让用户和服务器之间保持长轮询(long polling)。

HTTP请求不是持续的连接,你请求一次,服务器响应一次,然后就完了。长轮训是一种利用HTTP模拟持续连接的技巧。具体来说,只要页面载入了,不管你需不需要服务器给你响应信息,你都会给服务器发一个Ajax请求。这个请求不同于一般的Ajax请求,服务器不会直接给你返回信息,而是它要等着,直到服务器觉得该给你发信息了,它才会响应。比如,你的好友发了一条新鲜事,服务器就会把这个新鲜事当做响应发给你的浏览器,然后你的浏览器就刷新页面了。浏览器收到响应刷新完之后,再发送一条新的请求给服务器,这个请求依然不会立即被响应。于是就开始重复以上步骤。利用这个方法,可以让浏览器始终保持等待响应的状态。虽然以上过程依然只有非持续的Http参与,但是我们模拟出了一个看似持续的连接状态

我们再看传统的服务器(比如Apache)。每次一个新用户连到你的网站上,你的服务器就得开一个连接。每个连接都需要占一个进程,这些进程大部分时间都是闲着的(比如等着你好友发新鲜事,等好友发完才给用户响应信息。或者等着数据库返回查询结果什么的)。虽然这些进程闲着,但是照样占用内存。这意味着,如果用户连接数的增长到一定规模,你服务器没准就要耗光内存直接瘫了。

这种情况怎么解决?解决方法就是刚才上边说的:非阻塞事件驱动。这些概念在我们谈的这个情景里面其实没那么难理解。你把非阻塞的服务器想象成一个loop循环,这个loop会一直跑下去。一个新请求来了,这个loop就接了这个请求,把这个请求传给其他的进程(比如传给一个搞数据库查询的进程),然后响应一个回调(callback)。完事了这loop就接着跑,接其他的请求。这样下来。服务器就不会像之前那样傻等着数据库返回结果了。

如果数据库把结果返回来了,loop就把结果传回用户的浏览器,接着继续跑。在这种方式下,你的服务器的进程就不会闲着等着。从而在理论上说,同一时刻的数据库查询数量,以及用户的请求数量就没有限制了。服务器只在用户那边有事件发生的时候才响应,这就是事件驱动。

FriendFeed是用基于Python的非阻塞框架Tornado (知乎也用了这个框架) 来实现上面说的新鲜事功能的。不过,Node.js就比前者更妙了。Node.js的应用是通过javascript开发的,然后直接在Google的变态V8引擎上跑。用了Node.js,你就不用担心用户端的请求会在服务器里跑了一段能够造成阻塞的代码了。因为javascript本身就是事件驱动的脚本语言。你回想一下,在给前端写javascript的时候,更多时候你都是在搞事件处理和回调函数。javascript本身就是给事件处理量身定制的语言。

Node.js还是处于初期阶段。如果你想开发一个基于Node.js的应用,你应该会需要写一些很底层代码。但是下一代浏览器很快就要采用WebSocket技术了,从而长轮询也会消失。在Web开发里,Node.js这种类型的技术只会变得越来越重要。

以上。

转载于:https://www.cnblogs.com/FunkyEric/p/9186782.html

node.js是做什么的?相关推荐

  1. node.js是开源的吗_为开源做贡献并不难:我为Node.js项目做贡献的旅程

    node.js是开源的吗 As a developer, you should consider contributing to open source software. Many of your ...

  2. 为什么 Deno 没有众望所归?超越 Node.js 还要做些什么?

    作者 | 韩亦乐       责编 | 欧阳姝黎 译者序 正文开始 Deno 是一个旨在改进甚至替代 Node 的 JavaScript / TypeScript 运行时.它拥有众多的功能和广泛的关注 ...

  3. Node.js能做什么

    Node不是万能药!但的确能解决一些关键问题. 学习Node不是一件轻松事儿,但你所收到的回报是对得起你的付出的. 因为当下Web应用开发中的诸多难题唯有JavaScript才能解决. 目录 1. 专 ...

  4. Node.js 可以做什么

    摘自百度百科: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型. Node 是一个让 JavaS ...

  5. 五个最佳案例带你解读Node.js的前后之道

    2019独角兽企业重金招聘Python工程师标准>>> Node.js 是什么? Node.js采用C++语言编写而成,浏览器内核V8做为执行引擎:Node不是JS应用.而是一个Ja ...

  6. 图灵访谈系列之九:CNode社区谈Node.js技术及生态

    Node.js在各种技术会议上的分享越来越火热,为了让更多的人了解Node.js以及Node.js中文技术社区CNode,12月10日在易宝支付举行第三期Node.js北京分享会--NodeParty ...

  7. Node.js—简介

    一.Node.js是什么 1. 基本概述 Node.js是一个可以让JavaScript运行在服务器端的平台.它是一个为实时Web应用开发而诞生的平台,它从诞生之初就充分考虑了在实时响应.超大规模数据 ...

  8. 【Node】node.js实现服务器的反向代理,解决跨域问题

    跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...

  9. [知乎回答] 前端是否要学习 Node.js?

    大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12很多小伙伴都表示收获颇丰.一起学的大多数200行左右的Node.js源码.今天推荐这篇文章.(刚刚在写明天掘金要发的 ...

最新文章

  1. 夏天来了,你的数据中心应该跟着热起来
  2. SVN详解-linux+windows
  3. Android RecycleView ScrollBy不生效
  4. java 变量单例_Java静态变量的用法:伪单例
  5. 利用该0 day漏洞的攻击活动情况
  6. python如何导入turtle_centos7里python导入turtle的问题
  7. CSS中margin和padding的区别
  8. leetcode1046. 最后一块石头的重量(堆)
  9. x264_param_t结构体参数分析
  10. after you've written your business model
  11. 机器人炒饭小块头一一_一罐好饭,智能机器人炒饭出好味道,小块头坚守本心匠心制作!...
  12. kudu:插入报错:Row error for primary key=9, tablet=null, server=xx, status=Not found: key not found
  13. 超越存储,历久弥新!新华三发布入门级存储产品
  14. RTMP 封包详解
  15. MySQL 5.7 参考手册(官方中文版) | 2.2 安装和升级MySQL
  16. DXP PCB板的形状的改变
  17. 人类计划软件测试,人类分裂了16种人格,测测你是哪一种?
  18. 批量转换——颜色代码(16进制)与RGB
  19. sklearn 随机森林(Random Forest)多分类问题
  20. 基于matlab的纸币面额面向识别方法设计

热门文章

  1. SQL Server 对比数据库差异
  2. 安装QCreator2.5+Qt4.8.2+MinGW_gcc_4.4
  3. Linux中如何配置IP
  4. 坐班族如何摆脱粗壮大腿
  5. [rails] 我的订餐系统 -- 小试ruby on rails(转)
  6. arraylist 后往前遍历_面试官:谈谈常用的Arraylist和Linkedlist的区别
  7. javascript晚绑定_JavaScript的应用,调用和绑定通过托管野餐来解释
  8. Myeclipse在启动tomcat的时候的模式改变
  9. Java断点续传(基于socket与RandomAccessFile的实现)
  10. GDB 调试 Mysql 实战(二)GDB 调试打印