node必知必会之node简介

1.什么是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' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

从这段介绍来看,解读要点如下

  1. Node.js 不是 JavaScript 应用,不是语言(JavaScript 是语言),不是像 Rails(Ruby)、 Laravel(PHP) 或 Django(Python) 一样的框架,也不是像 Nginx 一样的 Web 服务器。Node.js 是 JavaScript 运行时环境
  2. 构建在 Chrome’s V8 这个著名的 JavaScript 引擎之上,Chrome V8 引擎以 C/C++ 为主,相当于使用JavaScript 写法,转成 C/C++ 调用,大大的降低了学习成本
  3. 事件驱动(event-driven),非阻塞 I/O 模型(non-blocking I/O model),简单点讲就是每个函数都是异步的,最后由 Libuv 这个 C/C++ 编写的事件循环处理库来处理这些 I/O 操作,隐藏了非阻塞 I/O 的具体细节,简化并发编程模型,让你可以轻松的编写高性能的Web应用,所以它是轻量(lightweight)且高效(efficient)的
  4. 使用 npm 作为包管理器,目前 npm 是开源库里包管理最大的生态,功能强大,截止到2017年12月,模块数量超过 60 万+

大多数人都认为 Node.js 只能写网站后台或者前端工具,这其实是不全面的,Node.js的目标是让并发编程更简单,主要应用在以网络编程为主的 I/O 密集型应用。它是开源的,跨平台,并且高效(尤其是I/O处理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃尔玛及GoDaddy都是 Node.js 的用户。

2.基本原理

下面是一张 Node.js 早期的架构图,来自 Node.js 之父 Ryan Dahl 的演讲稿,在今天依然不过时,它简要的介绍了 Node.js 是基于 Chrome V8引擎构建的,由事件循环(Event Loop)分发 I/O 任务,最终工作线程(Work Thread)将任务丢到线程池(Thread Pool)里去执行,而事件循环只要等待执行结果就可以了。

image

核心概念

Chrome V8 是 Google 发布的开源 JavaScript 引擎,采用 C/C++ 编写,在 Google 的 Chrome 浏览器中被使用。

  • Chrome V8 引擎可以独立运行,也可以用来嵌入到 C/C++ 应用程序中执行。
  • Event Loop 事件循环(由 libuv 提供)
  • Thread Pool 线程池(由 libuv 提供)

梳理一下

  • Chrome V8 是 JavaScript 引擎
  • Node.js 内置 Chrome V8 引擎,所以它使用的 JavaScript 语法
  • JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事
  • 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。
  • 如果排队是因为计算量大,CPU 忙不过来,倒也算了,但是很多时候 CPU 是闲着的,因为 I/O 很慢,不得不等着结果出来,再往下执行
  • CPU 完全可以不管 I/O 设备,挂起处于等待中的任务,先运行排在后面的任务
  • 将等待中的 I/O 任务放到 Event Loop 里
  • 由 Event Loop 将 I/O 任务放到线程池里
  • 只要有资源,就尽力执行
  • 我们再换一个维度看一下
    image

核心

  1. Chrome V8 解释并执行 JavaScript 代码(这就是为什么浏览器能执行 JavaScript 原因)
  2. libuv 由事件循环和线程池组成,负责所有 I/O 任务的分发与执行

在解决并发问题上,异步是最好的解决方案,可以拿排队和叫号机来理解

扫描二维码关注公众号,回复: 1468832 查看本文章
  • 排队:在排队的时候,你除了等之外什么都干不了
  • 叫号机:你要做的是先取号码,等轮到你的时候,系统会通知你,这中间,你可以做任何你想做的事儿

Node.js 其实就是帮我们构建类似的机制。我们在写代码的时候,实际上就是取号的过程,由 Event Loop 来接受处理,而真正执行操作的是具体的线程池里的 I/O 任务。

之所以说 Node.js 是单线程,就是因为在接受任务的时候是单线程的,它无需进程/线程切换上下文的成本,非常高效,但它在执行具体任务的时候是多线程的。

Node.js 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”,毫无疑问,它确实做到了。这种做法将并发编程模型简化了,Event Loop和具体线程池等细节被 Node.js 封装了,继而将异步调用 Api 写法暴露给开发者。真是福祸相依,一方面简化了并发编程,另一方面在写法上埋下了祸根,这种做法的好处是能让更多人轻而易举的写出高性能的程序!

在Node.js Bindings层做的事儿就是将 Chrome V8 等暴露的 C/C++ 接口转成JavaScript Api,并且结合这些 Api 编写了 Node.js 标准库,所有这些 Api 统称为 Node.js SDK,后面模块章节会有更详细的讨论。

微软在2016年宣布在MIT许可协议下开放 Chakra 引擎,并以 ChakraCore 为名在 Github 上开放了源代码,ChakraCore 是一个完整的 JavaScript 虚拟机,它拥有着和 Chakra 几乎相同的功能与特性。微软向 Node.js 主分支提交代码合并请求,让 Node.js 用上 ChakraCore引擎,即 nodejs/node-chakracore 项目。实际上微软是通过创建名为 V8 shim 的库的赋予了 ChakraCore 处理谷歌 Chrome V8 引擎指令的能力,其原理示意图如下

image

目前,Node.js 同时支持这2种 JavaScript 引擎,二者性能和特性上各有千秋,ChakraCore 在特性上感觉更潮一些,曾经是第一个支持 Async函数 的引擎,但目前 Node.js 还是以 Chrome V8 引擎为主, ChakraCore 版本需要单独安装,大家了解一下就好。

此为学习node的学习笔记,为了自己学习查阅,转自狼叔的教程,如果侵权请联系我删除
阅读原文
原文连接:https://cnodejs.org/topic/5ab3166be7b166bb7b9eccf7

猜你喜欢

转载自www.cnblogs.com/chenshufang/p/9138740.html