`

在知乎上发现了一篇对Nodejs的使用很通俗的解释,分享给大家

 
阅读更多

在知乎上发现了一篇对Nodejs的使用很通俗的解释,分享给大家

 

作者:贾厂长
链接: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这种类型的技术只会变得越来越重要。


以上。

分享到:
评论

相关推荐

    一个仿知乎论坛博客系统 nodejs-express

    【标题】"一个仿知乎论坛博客系统 nodejs-express" 是一个基于 Node.js 和 Express 框架构建的在线问答及博客平台,旨在模仿知乎的功能和用户体验。Node.js 是一个高性能、轻量级的JavaScript运行环境,常用于构建...

    Makedown在知乎上使用Markdown进行创作

    以下是在知乎上使用Markdown的一些特别提示: 1. **表格**:使用"|"分隔列,"---"分隔表头和数据,如: ``` | 列1 | 列2 | | --- | --- | | 数据1 | 数据2 | ``` 2. **投票**:知乎支持Markdown的投票功能,...

    知乎爬虫(知乎网站爬取工具,爬取知乎网页内容)

    总结来说,知乎爬虫是一个使用Java语言开发的工具,用于抓取和处理知乎网站上的数据。它可能涉及网络请求、HTML解析、动态内容加载、反反爬策略等多个方面,并且提供了一种自动化获取和分析知乎信息的方法。用户在...

    知乎(一款模拟知乎的软件)

    综合来看,这款模拟知乎的软件通过融合多种先进技术,不仅复刻了知乎的核心体验,还在此基础上增加了更多的交互性和便利性,为用户打造了一个全方位的知识分享与交流平台。然而,需要注意的是,虽然它提供了类似知乎...

    python对知乎上的问题回答的爬取(可用)

    本项目专注于使用Python爬取知乎网站上的问题及其答案,为用户提供了一个实用的工具。以下将详细介绍如何实现这一功能,并涉及相关的Python知识和技术点。 1. **Python基础知识**:Python是一种高级编程语言,以其...

    仿知乎的微信小程序源代码分享

    仿知乎的微信小程序源代码分享仿知乎的微信小程序源代码分享仿知乎的微信小程序源代码分享仿知乎的微信小程序源代码分享仿知乎的微信小程序源代码分享仿知乎的微信小程序源代码分享仿知乎的微信小程序源代码分享仿...

    保姆级教程:VsCode调试docker中的NodeJS程序.doc

    在 Docker 中运行 NodeJS 程序时,如何使用 VsCode 进行调试是一个非常重要的问题,本文将介绍如何使用 VsCode 调试 Docker 中的 NodeJS 程序。 第一步:配置 VsCode 设置 在 VsCode 中,单击首选项 -> 设置,打开...

    3-1+Query+理解和语义召回在知乎搜索中的应用.pdf

    Query 理解和语义召回在知乎搜索中的应用 Query 理解和语义召回是自然语言处理和信息检索领域的重要研究方向。在知乎搜索中,Query 理解和语义召回技术被广泛应用于搜索引擎的优化,以提高搜索结果的相关性和准确性...

    一个开源的看知乎的客户端

    一个发现每天知乎头条的应用,每天三次推送当日最热的知乎答案。 从该项目中可以学到: Android Studio开发Android的基本配置 对MD风格的Theme兼容 Application、Activity和Fragment基类的基本设计 WebView与...

    知乎首页登录背景图

    知乎作为一个广受欢迎的知识分享平台,其界面设计自然备受关注。本话题聚焦于"知乎首页登录背景图",这是一个直接影响用户第一印象的关键元素。 首先,我们需要理解背景图在网页设计中的作用。背景图不仅能为页面...

    知乎助手 Setup 2.3.0.rar

    知乎助手 Setup 2.3.0 是一个专为知乎用户设计的软件工具,旨在提供一系列实用功能,帮助用户更高效、便捷地使用知乎平台。这个版本2.3.0的更新可能包含了性能优化、新功能添加以及对原有功能的改进,以满足用户日益...

    知乎爬虫最新版java

    标题中的“知乎爬虫最新版java”指的是一个使用Java编程语言编写的爬虫程序,专门用于抓取知乎网站上的用户详细信息。这个爬虫可能是为了数据挖掘、数据分析或研究目的而设计的,它能帮助用户高效地获取大量知乎用户...

    Android仿知乎分享

    使用 BottomSheetDialog 实现仿知乎分享控件,实现符合要求的自定义控件,详细讲解请看文章讲解:https://blog.csdn.net/lou_liang/article/details/82870831

    仿知乎前端页面

    【标题】"仿知乎前端页面"的实现是一个前端开发项目,旨在模仿知名问答社区知乎的用户界面和交互体验。这个项目涵盖了多个关键的技术领域,包括前端框架和后端服务的集成,以及网页的布局和功能设计。 【描述】中...

    使用vue全家桶做的高仿知乎日报

    在“使用vue全家桶做的高仿知乎日报”项目中,我们将深入探讨这些技术在实际应用中的运用。 1. **Vue.js核心**:Vue.js的核心特性包括声明式渲染、响应式数据绑定、组件系统和指令系统等。在高仿知乎日报项目中,...

    知乎APP产品需求文档.docx

    4. 文艺群体:除了科技感十足的回答之外,文艺方面的内容在知乎上也是占有很大的比重。 5. 如何看待以及什么体验群体:网上有不少人谈到知乎会评价说知乎是一个分享中产阶级体验的平台。 6. 内容创造者:他们是...

    模仿知乎的一款微信小程序的demo,可直接运行

    界面及交互设计来自知乎 Android 版本 工具: 微信 web 开发者工具 数据: 没有开放 API, 所以使用伪造本地数据 功能及使用的组件等 列表式渲染数据 自定义顶部 tabbar 下拉刷新 上拉加载更多 轮播图 等

    基于nodejs的知乎爬虫,x-zse-96,支持文章,评论,图片下载到本地.zip

    爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...

    android 模仿知乎下拉刷新和上拉加载

    在Android开发中,模仿知乎的下拉刷新和上拉加载功能是常见的用户界面交互设计,旨在提供更好的用户体验。这一功能通常结合使用`SwipeRefreshLayout`和`RecyclerView`两个核心组件来实现。下面将详细介绍这两个组件...

    使用nodejs puppeteer库实现知乎和quora爬虫.zip

    爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...

Global site tag (gtag.js) - Google Analytics