链接:https://www.zhihu.com/question/33578075/answer/56951771
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
当你看完这些解释觉得跟看天书一样的时候,你估计也懒得继续问了。不过没事。我这篇文章就是在避开高端术语的同时,帮助你你理解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这种类型的技术只会变得越来越重要。
相关推荐
node.js能干什么.既然NodeJS什么都能做,那为什么还要用JAVA.zip
什么是REST_如何用NodeJS开发REST_API_【JavaScript全栈入门教程7】
资源名称:Nodejs给前端带来了什么变化 中文WORD版内容简介:本文档主要讲述的是Nodejs给前端带来了什么变化;在软件开发领域,前端工程师曾经是一个比较纠结的职业。在Web技术真正发展起来之前的相当长一段时间里,...
NodeJS 的使用非常广泛,例如可以用来编写服务器端代码、构建 Web 应用程序、开发桌面应用程序等。 模块化是 NodeJS 的一个重要特点。模块化可以将大文件(大功能)拆分成多个独立并且又互相依赖的小模块。每个小...
#### 1.1 什么是NodeJS? NodeJS是一种基于Chrome V8引擎的JavaScript运行环境。它允许开发者使用JavaScript编写服务器端应用程序。与传统的客户端JavaScript不同,NodeJS可以在服务器端执行JavaScript代码,这使得...
一个用NodeJS实现的Ftp Servce
4. 将解压后的文件夹重命名为`nodejs`,例如`mv node-vX.Y.Z-linux-x64 nodejs`。 5. 配置环境变量,建立软链接。通过以下命令将Node.js、npm和npx设置为全局可访问: ``` sudo ln -snf /path/to/nodejs/bin/node ...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者可以用 JavaScript 语言编写服务器端程序。由于其轻量级、高效的特点,Node.js 成为了搭建本地 Web 服务器的首选工具之一。在本文中,我们将...
在Nodejs中,文件和模块是一一对应的,而模块有不同的类型,大概可分为核心模块----文件模块----第三方模块,引用模块的几种方式,可以通过文件路径来引用模块,也可以通过模块名来引用如果用模块来引用非核心模块的...
这得益于它的轻量级和高效的特性,NodeJS非常适合用来构建高并发、低延迟的应用程序,如实时聊天系统、游戏服务器等。 - **脚本语言与解析器**:所有脚本语言(如JavaScript)都需要一个解析器来运行。对于网页中的...
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型的实时...
Node.js提供了一个名为`N-API`(Node.js API)的接口,它是跨平台的,可以用来创建原生模块,这些模块可以包含C++代码,从而在Node.js环境中执行。 描述中的"部分代码可写成C++的模块,然后由nodejs调用"揭示了这种...
10. **中间件(Middleware)**:在Express框架中,中间件是一种处理请求和响应的函数,它们按照定义的顺序执行,可以用来实现路由、日志、认证等功能。 这个"nodejs高级编程源码"很可能包含了上述知识点的实际应用,...
标题 "Nodejs简易心跳包" 指的是在Node.js环境中实现的一种简单的心跳机制。心跳包在分布式系统、网络通信或实时应用中扮演着重要角色,它用于检测客户端和服务端之间的连接是否仍然活跃,确保数据传输的稳定性和...
这个“用nodejs语言mqtt协议写的客户端”项目,显然旨在利用Node.js的强大功能来实现MQTT协议的客户端应用,以便于设备间的通信。 首先,我们需要理解Node.js中的客户端编程。在Node.js中,你可以使用各种模块来...
网络文摘:JacksonTian - 用NodeJS打造你的静态文件服务器
nodejs实现websocket服务与html+js聊天通信示例 1.先装一个nodeJs的模块,叫nodejs-websocket . 2.直接在nodeJs命令行中敲入:npm...3.开始建立服务器了,因为有了nodejs-websocket模块,所以很多工作都不用我们自己做.
标题提到的 "nodejs最新windows安装包" 指的是 Node.js 针对 Windows 操作系统的最新版本安装程序。Windows 用户可以通过这些安装包轻松地在他们的计算机上安装和运行 Node.js。提供的压缩包文件中,有以下几种形式...
NODEJS WEB API 后台 可用于移动端后台服务用,是我为VC公司开发的,可以用戶登錄驗證及移動端,PC端調用,非常簡單實用
这个"nodeJs练习项目 结构简洁 注释全面"是一个专门为初学者或希望提升Node.js技能的人设计的实践项目。它涵盖了Node.js的基础知识,包括创建服务器、处理HTTP请求以及静态文件服务等核心概念。 项目的目标是实现一...