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.node

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

  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 任务的分发与执行

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

  • 排队:在排队的时候,你除了等以外什么都干不了
  • 叫号机:你要作的是先取号码,等轮到你的时候,系统会通知你,这中间,你能够作任何你想作的事儿

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

相关文章
相关标签/搜索