一、Node.js简介前端
Node.js 诞生于 2009 年,由 Joyent 的员工 Ryan Dahl 开发而成,以后 Joyent 公司一直扮演着 Node.js 孵化者的角色。Node.js基金会的创始成员包括 Google、Joyent、IBM、Paypal、微软、Fidelity 和 Linux基金会,创始成员将共同掌管过去由 Joyent 一家企业掌控的 Node.js 开源项目。此后,Node.js基金会发展很是好,稳定的发布五、六、七、8等版本,截止发稿最新版本已是8.6,长期支持版本是6.11。vue
Node.js 不是一门语言也不是框架,它只是基于 Google V8 引擎的 JavaScript 运行时环境,同时结合 Libuv 扩展了 JavaScript 功能,使之支持 io、fs 等只有语言才有的特性,使得 JavaScript 可以同时具备 DOM 操做(浏览器)和 I/O、文件读写、操做数据库(服务器端)等能力,是目前最简单的全栈式语言。react
目前 Node.js 在大部分领域都占有一席之地,尤为是 I/O 密集型的,好比 Web 开发,微服务,前端构建等。很多大型网站都是使用 Node.js 做为后台开发语言的,用的最多的就是使用Node.js作前端渲染和架构优化,好比 淘宝 双11、去哪儿网 的 PC 端核心业务等。另外,有很多知名的前端库也是使用 Node.js 开发的,好比,Webpack 是一个强大的打包器,React/Vue 是成熟的前端组件化框架。webpack
Node.js一般被用来开发低延迟的网络应用,也就是那些须要在服务器端环境和前端实时收集和交换数据的应用(API、即时聊天、微服务)。阿里巴巴、腾讯、Qunar、百度、PayPal、道琼斯、沃尔玛和 LinkedIn 都采用了 Node.js 框架搭建应用。git
Node.js 编写的包管理器 npm 已成为开源包管理了领域最好的生态,直接到2017年10月份,有模块超过47万,每周下载量超过32亿次,每月有超过700万开发者使用npm。github
Node.js 常常被人们吐槽的一点就是:回调太多难于控制(俗称回调地狱)和 CPU 密集任务处理的不是很好。可是,目前异步流程技术已经取得了很是不错的进步,从Callback、Promise 到 Async函数,能够轻松的知足全部开发需求。web
二、什么是Node.js数据库
Nodejs官方介绍是:npm
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.
npm
做为包管理器,目前 npm
是开源库里包管理最大的生态,功能强大,截止到2017年12月,模块数量超过 60 万+大多数人都认为 Node.js 只能写网站后台或者前端工具,这实际上是不全面的,Node.js的目标是让并发编程更简单,主要应用在以网络编程为主的 I/O 密集型应用。它是开源的,跨平台,而且高效(尤为是I/O处理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃尔玛及GoDaddy都是 Node.js 的用户。编程
三、基本原理
Node.js 早期的架构图,来自 Node.js 之父 Ryan Dahl 的演讲稿,在今天依然不过期,它简要的介绍了 Node.js 是基于 Chrome V8引擎构建的,由事件循环(Event Loop)分发 I/O 任务,最终工做线程(Work Thread)将任务丢到线程池(Thread Pool)里去执行,而事件循环只要等待执行结果就能够了。
核心概念
Chrome
浏览器中被使用。Chrome V8 引擎能够独立运行,也能够用来嵌入到 C/C++ 应用程序中执行。libuv
提供)libuv
提供)总结:
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,后面模块章节会有更详细的讨论。