搞懂什么是Node.js原来这么简单

Node.js 的官方介绍

在 Node.js 的官方网站的首页中,有这样一句话来描述 Node.js:

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.

翻译过来的意思就是:

Node.js 是基于 Chrome 的 V8 JavaScript 引擎的 JavaScript 运行时。Node.js 采用事件驱动、非堵塞 I/O 模型,使其轻量化和高效。

上面这句话的第一句说明了什么是 Node.js,第二句说明了 Node.js 的特点。

想要搞懂官方这句话的具体含义,我们还要从 JavaScript 语言说起。

Node.js 的核心开发语言

这里假设你已经掌握了 JavaScript 语言的基础语法以及基本使用。如果还没有掌握 JavaScript 的话,还是先去入门一下 JavaScript 语言吧。

掌握了 JavaScript 语言的应该知道,JavaScript 语言是作为浏览器的脚本语言,可以实现网页与用户之间的交互。

什么是交互?比如用户在网页中输入用户名或密码,这种用户输入行为就可以叫做交互。或者用户点击网页中的按钮等等,都可以叫做交互。

JavaScript 语言之所以可以实现网页与用户之间的交互,主要是依靠事件来完成的。比如,用户的输入事件、点击按钮事件等等。

下面我们通过用户点击按钮的行为为例,来看看 JavaScript 语言是如何处理的。

通过上面的分析图,我们可以清晰的看到:

  1. 用户点击网页的按钮,执行 JavaScript 逻辑。
  2. JavaScript 逻辑经历三个阶段,分别是捕获事件、触发事件和事件冒泡。
  3. 当 JavaScript 逻辑执行完毕后,会将结果返回网页。
  4. 网页再根据结果显示给用户。

通过这样的一个小案例,我们可以知道 JavaScript 语言处理网页与用户之间的交互,主要是依靠事件驱动。

网页与 Node.js 中 JavaScript 的区别

目前几乎所有的浏览器都支持 JavaScript 语言,之所以支持的原因在于浏览器中都集成了 JavaScript 引擎。

在众多浏览器中,Chrome 浏览器的性能相对更好,而且 Chrome 浏览器集成的 V8 JavaScript 引擎还是开源的。

而 Node.js 就是利用了 Chrome 浏览器的开源 V8 JavaScript 引擎。那在网页中使用 JavaScript 语言和在 Node.js 中使用 JavaScript 语言有什么不同呢?我们可以通过下面这张图来了解一下。

通过上图可以清晰地看到,Node.js 相对于浏览器 Node.js 没有提供 WebKit 内核和 HTML 相关的 UI 技术。也就是说,Node.js 只提供了 JavaScript 语言。

为什么要这样呢?其实,Node.js 的作者最初的想法就是想设计一个轻量和高效的服务器。

什么是服务器

那服务器又是什么呢?如果把一个 WEB 应用比作是一个人的话,那服务器就是人的大脑。

通过上面的图我们可以知道,人与人交流时,基本上要通过以下几个步骤:

  1. 别人与我交流,我是通过人的感官进行接收。
  2. 感官将信息传递给大脑。
  3. 大脑接收到信息后,进行处理,将处理的结果返回。
  4. 再通过感官反馈给与我交流的人。

通过这个过程,我们可以发现,别人是直接通过感官与我交流的,并不知道大脑是如何工作的,也并不关心大脑是如何工作的。

而 WEB 应用与人类似,用户是与网页进行交互,网页将信息传递给服务器,服务器接收、处理并响应,最后网页将结果显示给用户。

作为用户来说,并不关心服务器是如何工作的,甚至用户都感觉不到服务器的存在。但是,作为开发人员,想要开发一个完整的 WEB 应用,服务器的逻辑核心。

从现在开始,我们要从用户思维转变成开发思维。通过开发思维重新审视我们曾经使用过的 WEB 应用,你会发现有所不同。

思维的转变是很重要的!很重要的!很重要的!重要的事儿说三遍。

Node.js 的简单理解

讲到这里,我们可以简单地来归纳一下 Node.js 到底是什么了。

Node.js 就是基于 Chrome 浏览器的 V8 JavaScript 引擎,以 JavaScript 语言为核心开发语言的服务器技术。

如果使用 Node.js 开发一个 WEB 应用应该是怎么样的呢?

由于 JavaScript 逻辑是依靠事件驱动的,所以就不难理解 Node.js 是事件驱动的了。

想要更好地理解和掌握 Node.js,还是先回去恶补一下 JavaScript 语言中的事件处理那些内容吧!

Node.js 除了是基于 Chrome 浏览器的 V8 引擎以外,还提供了一系列的模块,让我们可以方便地实现一些功能。比如,处理客户端的请求、文件的处理等操作。

我们学习 Node.js,主要就是学习 Node.js 所提供的模块内容。

以上就是搞懂什么是Node.js原来这么简单的详细内容,更多关于Node.js的资料请关注我们其它相关文章!

(0)

相关推荐

  • nodejs中使用worker_threads来创建新的线程的方法

    简介 之前的文章中提到了,nodejs中有两种线程,一种是event loop用来相应用户的请求和处理各种callback.另一种就是worker pool用来处理各种耗时操作. nodejs的官网提到了一个能够使用nodejs本地woker pool的lib叫做webworker-threads. 可惜的是webworker-threads的最后一次更新还是在2年前,而在最新的nodejs 12中,根本无法使用. 而webworker-threads的作者则推荐了一个新的lib叫做web-wo

  • 如何利用nodejs实现命令行游戏

    目录 实现原理 源码解析 监听按键事件 绘制帧画面 蛇吃鸟蛋逻辑 总结 本文以贪吃蛇为例, 一步一步地分析如何实现一个命令行游戏. 实现原理 命令行输入 通过 process.stdin 监听命令行输入的按键, 改变小蛇的前进的方向 画面渲染 通过 ANSI 转义序列 擦除之前的输出 通过 process.stdout 每隔一段时间将画面帧输出到命令行 源码解析 监听按键事件 使用过 yarn upgrade-interactive 命令更新 npm 依赖, 或者使用过 vue-cli 等脚手架

  • Nodejs实现微信分账的示例代码

    公司的业务的场景需要用到微信分账的功能.对着官网文档调试了一下午才调通.记录下使用Nodejs微信分账的流程. 前提条件 在微信商户平台 产品中心->我的产品,支付扩展工具中 开通分账的功能 添加分账接收方. 这一步不设置的话回报一个*分账接收方关系不存在,请检查参数中每个接收方的关系.*错误 在商户平台获取商户id和secrect 需要将apiclient_cert.pem. apiclient_key传到服务器某个目录下面 具体实现 // @router post -> share -&g

  • 如何利用nodejs自动定时发送邮件提醒(超实用)

    需要先安装插件 npm install Nodemailer --save index.js global.SG = { nodemailer: require("nodemailer")//发送邮件需要的服务 }; sg.js //发送邮件参数:收件人(支持群发).主题.正文(支持html格式)---------------------------------------- sendMail(to, subject, html) { //下面这几个改成你自己的邮箱.昵称和授权码 co

  • Nodejs 数组的队列以及forEach的应用详解

    本文主要记录了在Nodejs开发过程中遇到过的由数组特性引起的问题及解决方式,以及对数组的灵活应用. 本文代码测试结果均基于node v6.9.5 数组与队列 利用数组对象方法push/shift可实现队列先进先出特性,例如: >a=[] [] >a.push(2.3.4) 3 >a.push(2) 3 >a [2.3.4.2] >a.shift() 2 >a >[3.4.2] 数组与forEach 对数组的删除操作有两种常见方式:delete和使用splice方

  • 一文秒懂nodejs中的异步编程

    文章目录 简介同步异步和阻塞非阻塞javascript中的回调回调函数的错误处理回调地狱 ES6中的Promise什么是PromisePromise的特点Promise的优点Promise的缺点Promise的用法Promise的执行顺序 async和awaitasync的执行顺序async的特点 总结 简介 因为javascript默认情况下是单线程的,这意味着代码不能创建新的线程来并行执行.但是对于最开始在浏览器中运行的javascript来说,单线程的同步执行环境显然无法满足页面点击,鼠标

  • nodeJs项目在阿里云的简单部署

    nodeJS在阿里云的简单部署,供大家参考,具体内容如下 日志样例 近期将毕设的基本接口写完,全部采用nodeJS+express完成,前些天初步部署了一下,发现node真的是个好东西,记录一下自己部署上阿里云服务器的简单经验,本人的服务器是学生版的阿里云服务器ECS的Ubuntu版本,安装了mysql数据库.nodeJS 10.15.0.Nginx静态资源服务器,这是前提. 安装node 首先得先在服务器上安装好node,可以自行百度如何在ubuntu上命令行下载安装node 确定自己服务需要

  • windows如何把已安装的nodejs高版本降级为低版本(图文教程)

    第一步:先清空本地安装的node.js版本 1.按健win+R弹出窗口,键盘输入cmd,然后敲回车(或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出,输入cmd再点击回车键) 然后进入命令控制行窗口,并输入where node查看之前本地安装的node的路径 2.找到上面找到的路径,将node.exe所在的父目录里面的所有东西都删除 3.为了彻底删除之前安装的node.js,鼠标点击电脑左面最左下角的win窗口图标弹出,输入"控制面板"再点击回车键进入,进入控制面板后,找到所安装的

  • nodejs中的异步编程知识点详解

    简介 因为javascript默认情况下是单线程的,这意味着代码不能创建新的线程来并行执行.但是对于最开始在浏览器中运行的javascript来说,单线程的同步执行环境显然无法满足页面点击,鼠标移动这些响应用户的功能.于是浏览器实现了一组API,可以让javascript以回调的方式来异步响应页面的请求事件. 更进一步,nodejs引入了非阻塞的 I/O ,从而将异步的概念扩展到了文件访问.网络调用等. 今天,我们将会深入的探讨一下各种异步编程的优缺点和发展趋势. 同步异步和阻塞非阻塞 在讨论n

  • nodejs处理tcp连接的核心流程

    前几天和一个小伙伴交流了一下nodejs中epoll和处理请求的一些知识,今天简单来聊一下nodejs处理请求的逻辑.我们从listen函数开始. int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) { // 设置处理的请求的策略,见下面的分析 if (single_accept == -1) { const char* val = getenv("UV_TCP_SINGLE_ACCEPT"); sing

  • NodeJS和浏览器中this关键字的不同之处

    前言 学习过JavaScript的人肯定清楚 处在不同环境下this的指向问题.那么看下面的代码 var type = 1 function toWhere(){ this.type = 2; } toWhere(); console.log(type) 你们肯定会这样想: 这里声明了一个全局变量type,当执行type=1的时候,赋值为1.之后toWhere函数调用,看到函数中有this 就去判断this的指向,这里很清楚,this指向了window,this.type=2执行后,全局变量ty

  • Nodejs实现定时爬虫的完整实例

    事件起因 前两天要帮朋友B站舰长群审核,一个个去舰长列表查找,自然不是一个程序猿的首选,把任务交给计算机让他自己做,摸鱼才是正道.理论成立开始Coding . 由于已知舰长列表的 API 爬虫使用 Axios 直接访问接口 于是花了亿点点时间写完了这段爬虫我称之为bilibili-live-captain-tools 1.0 const axios = require('axios') const roomid = "146088" const ruid = "642922&

  • nodejs环境快速操作mysql数据库的方法详解

    github地址https://github.com/dmhsq/dmhsq-mysql-db 可用于腾讯云SCF以及云开发环境 错误处理尚未完善 错误参考mysql错误 引入依赖包 npm install dmhsq-mysql-db 效果如下 简化了mysql的使用 安装依赖 npm install dmhsq-mysql-db 使用示例 快速操作mysql 错误处理尚未完善 部分错误参考mysql错误 引入资源 const database = require("dmhsq-mysql-d

  • 在nodejs中创建child process的方法

    简介 nodejs的main event loop是单线程的,nodejs本身也维护着Worker Pool用来处理一些耗时的操作,我们还可以通过使用nodejs提供的worker_threads来手动创建新的线程来执行自己的任务. 本文将会介绍一种新的执行nodejs任务的方式,child process. child process lib/child_process.js提供了child_process模块,通过child_process我们可以创建子进程. 注意,worker_threa

  • NodeJS配置CORS实现过程详解

    跨域问题主要在header上下功夫 首先提供一个w3c的header定义 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 再提供一个网友提供的header详解 http://kb.cnblogs.com/page/92320/ 这两个有助于帮助大家理解header的类型和作用, 但是遗憾的是跨域相关的两个header属性我都没有找到相关的定义, 下面直接告诉大家 1是Access-Control-Allow-Origin 允许的域 2

  • Nodejs 微信小程序消息推送的实现

    选择或创建订阅消息模板 登录到微信小程序里面找到功能->订阅消息.可以在公共模板库里选择需要的模板,如果没有找到自己需要的也可以自己创建然后等待审核. 选择完模板查看详情会得到模板ID,以及发送推送时需要的字段. 小程序发送订阅的请求 需要用到上一步获取的模板Id // 小程序 <Text className='rights-buy' onClick={this.messageSubmit}> 入驻申请 </Text> // 入驻申请消息订阅 messageSubmit =

  • nodejs的错误处理过程记录

    本文以连接错误ECONNREFUSED为例,看看nodejs对错误处理的过程. 假设我们有以下代码 1. const net = require('net'); 2. net.connect({port: 9999}) 如果本机上没有监听9999端口,那么我们会得到以下输出. 1. events.js:170 2. throw er; // Unhandled 'error' event 3. ^ 4. 5. Error: connect ECONNREFUSED 127.0.0.1:9999

  • nodejs+express最简易的连接数据库的方法

    环境搭建 1.首先需要自行安装node环境 2.然后全局安装 express npm install -g express 3.创建express项目文件夹 express创建项目默认为jade模板引擎,若使用其他引擎,使用命令切换 express node_demo -e (选择ejs模板) // 在项目名称的后面添加 -e 那么创建出来的模板文件就是.ejs类型,语法是与html相同的 在vscode中打开我们建好的项目,目录如下: 对于ejs看着不习惯的同学可以将其改为html,如下: 然

随机推荐