学习新知识新事物,我以为得知道她的一些属性,好比是什么,能解决什么问题,来自哪里等等。没有最好的,只有最合适的。接下来的日子或者说岁月里,就来浅谈 Nodejs。前端
正如 Node.js 官方所说 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. 即 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。能够看出 Node.js 不是一门新的编程语言,而是 JavaScript 的运行环境(服务端的运行环境,之如客户端的浏览器环境),而 Nodejs 的编程语言指的是 JavaScript(这之间的关系仍是要梳理清楚)。node
2009 年以前,当时的 JavaScript 仍是一个在浏览器环境里的一门脚本语言,实现前端页面交互和一些动态特效。时间的分水岭就在这里,Javascript 就不仅运行于浏览器,还能够运行于服务端,仿佛打通了先后端的任督二脉,这要归功于 Node.js 之父 Ryan Dahl。数据库
JavaScript 是一个单线程的语言,单线程的优势是不会像 Java 这些多线程语言在编程时出现线程同步、线程锁问题,同时也避免了上下文切换带来的性能开销问题。想象一下多线程对同一个 DOM 进行操做会怎样?不是乱套了吗?可能你会想一个问题:单线程是否是前面一个执行不完,后面就被卡住了?编程
JavaScript 是一种采用了事件驱动、异步回调的模式(主线程是单线程)。JavaScript 在虚拟机上因为有了 Chrome V8 的支持,使得 JavaScript 成为了 Node.js 的首选语言。因此,Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。后端
首先,Node.js 由 Libuv、Chrome V八、一些核心 API 构成,如图所示:浏览器
http、buffer、fs、stream
等;最初 Node.js 只运行于 Linux 平台,V0.6.0 版本后在 Libuv 的加持下可运行在 Windows 平台服务器
使用单线程运行,不像 Apache HTTP 之类的服务器,每发生一个请求就产生一个线程。这种方法避免了 CPU 上下文切换和内存中的大量执行堆栈,解决了 Nginx 和其它服务器的 “上一个 10 年,著名的 C10K 并发链接问题”。多线程
避免了等待输入或输出(文件系统、Web服务器、数据库等)响应形成的 CPU 时间损失,得益于 Libuv 的异步 I/O。架构
事件与回调在 JavaScript 中家常便饭,是一种高性能的服务模型,对于习惯同步思路编程的同窗一时很难理解。Node.js 与 Nginx 均是基于这种方式,只是 Nginx 采用 C 编写,适用于 Web 服务器,Node.js 是可扩展、高性能的平台。并发
Node.js 的特色就是事件驱动,非阻塞异步 I/O,只开一个主线程,不会每一个请求都去建立一个线程,从而节省资源开销。
使用 Node.js 来作为中间层,整合数据并提供 API 接口,这些数据源通常来自第三方接口或者数据库,后端就能够更专一于业务开发。推荐一个去哪儿开源的 API 管理工具 YAPI,就是使用的 Node.js 进行开发的。
Backend For Frontend(服务于前端的后端),逻辑上的分层并非新技术。可作一些资源的整合。场景是:原先须要从多个地方获取数据,有了这一层(作个聚合),统一处理以后返回一个数据源,同时后期也不会由于后端数据迁移而重构。
Remote Procedure Call(远程过程调用)。当今微服务模式下,主要是针对功能或业务进行服务化,服务间的通讯常见的模式都是经过 HTTP 实现,HTTP 属于应用层协议,若是经过 TCP 的方式(传输层),那岂不是更高效。RPC 服务就是采用的 TCP,好比 Google 的 gRPC、阿里的 Dubble。
好比编译器、构建工具、搭建脚手架等,咱们知道的 Gulp、Webpack 就是成功案例。
Nodeclub 是使用 Node.js 和 MongoDB 开发的社区系统,界面优雅,功能丰富,小巧迅速,已在Node.js 中文技术社区 CNode 获得应用,但你彻底能够用它搭建本身的社区。
无服务器架构,开发者只需关注于业务自己,不须要去关心运维、流量处理这些工做。咱们知道 JavaScript 中函数是一等一的公民,写个函数就实现一个 API 接口给到前端,对开发工做减轻不少(函数即服务)。
微服务,小型服务、以独立进程运行、可以使用不一样语言。根据业务形态来选择不一样的语言实现,Node.js 自己也是很轻量级的,实现起来也很快。最好的打不过合适的!