第2章 Node.js 介绍

    • 知道 Node.js 是什么
    • 理解 Node.js 的运行原理
    • 了解Node.js的运行机制

    以下引自 :

    • 不是编程语言
    • 也不是框架和库
    • 是一个 JavaScript 运行时(环境)
      • 能解析和执行 JavaScript 代码(严格来说应该是 ECMAScript 代码)
    • 构建于 Chrome V8 JavaScript 引擎之上
    • 为 JavaScript 提供了服务端编程的能力
      • 文件IO
      • 网络IO
    • 从技术角度它的能力和 Java、PHP、Python、Perl、Ruby 等服务端技术类似

    Node 的特点

    • 事件驱动
    • 非阻塞 IO(异步) 模型
    • 单线程
    • 跨平台

    Node 的运行机制

    多线程处理机制:

    传统的 Web 服务器(Apache、Tomcat、IIS):

    • 请求进来
    • Web 服务器开启一个线程来处理用户请求
    • 同一时间有 n 请求,服务器就需要开启 n 个线程
      • 一个线程最少得消耗 8MB 内存

    事件驱动处理模型:

    • Node 中低层封装了一堆的异步操作 API
      • 文件操作
      • 网络操作
    • JavaScript 语言本身是单线程的

    event-loop

    Node.js不是凭空出现的项目,也不是某个Web前端工程师为了完成将JavaScript应用到服务端的理想而在实验室里捣鼓出来的。它的出现主要归功于Ryan Dahl历时多年的研究,以及一个恰到好处的节点。2008年V8随着Chrome浏览器的出世,JavaScript 脚本语言的执行效率得到质的提升,这给Ryan Dahl带来新的启示,他原本的研究工作与V8之间碰撞出火花,于是带来了一个基于事件的高性能Web服务器。

    上图为Node.js创始人Ryan Dahl。

    Ryan Dahl的经历比较奇特,他并非科班出身的开发者,在2004年的时候他还在纽约的罗彻斯特大学数学系读博士,期间有研究一些分形、分类以及p-adic分析,这些都跟开源和编程没啥关系。2006年,也许是厌倦了读博的无聊,他产生了『世界那么大,我想去看看』的念头,做出了退学的决定,然后一个人来到智利的Valparaiso小镇。那时候他尚不知道找一个什么样的工作来糊口,期间他曾熬夜做了一些不切实际的研究,如如何通过云进行通信。下面是这个阶段他产出的中间产物,与后来苹果发布的iCloud似乎有那么点相似。

    从那起,Ryan Dahl不知道是否因为生活的关系,他开始学习网站开发了,走上了码农的道路。那时候Ruby on Rails很火,他也不例外的学习了它。从那时候开始,Ryan Dahl的生活方式就是接项目,然后去客户的地方工作,在他眼中,拿工资和上班其实就是去那里旅行。此后他去过很多地方,如阿根廷的布宜诺斯艾利斯、德国的科隆、奥地利的维也纳。

    Ryan Dahl经过两年的工作后,成为了高性能Web服务器的专家,从接开发应用到变成专门帮客户解决性能问题的专家。期间他开始写一些开源项目帮助客户解决Web服务器的高并发性能问题,尝试过的语言有Ruby、C、Lua。当然这些尝试都最终失败了,只有其中通过C写的HTTP服务库libebb项目略有起色,基本上算作libuv的前身。这些失败各有各的原因,Ruby因为虚拟机性能太烂而无法解决根本问题,C代码的性能高,但是让业务通过C进行开发显然是不太现实的事情,Lua则是已有的同步I/O导致无法发挥性能优势。虽然经历了失败,但Ryan Dahl大致的感觉到了解决问题的关键是要通过事件驱动异步I/O来达成目的。

    在他快绝望的时候,V8引擎来了。V8满足他关于高性能Web服务器的想象:

    2009年5月,Ryan Dahl正式向外界宣布他做的这个项目。2009年底,Ryan Dahl在柏林举行的JSConf EU会议上发表关于Node.js的演讲,之后Node.js逐渐流行于世。

    以上就是Node.js项目的由来,是一个专注于实现高性能Web服务器优化的专家,几经探索,几经挫折后,遇到V8而诞生的项目

    • 2009年5月,Ryan Dahl 在 github 上发布了最初的 Node 版本
    • 2010年底,Ryan Dahl 加入 Joyent 公司全职负责 Node 的发展
    • 2011年7月,Node 在微软的支持下发布了 Windows 版
    • 2012年1月底,Ryan Dahl 将掌门人身份转交给了 Isaac Z.Schlueter,自己转向一些研究项目
    • 2014年12月,多为重量级Node开发者不满 Joyent 对 Node 的管理,自立门户创建了 io.js
    • 2015年9月,Node 与 io.js 合并,Node 的版本从 0.12.7 直接升级到了 4.0.0
    • 合并后的 io.js 和 Node 在 Joyent 公司的维护下并行了两个版本:
      • 一个是4.x.x 还是原来的 Node,这个版本是稳定版
      • 一个是5.x.x,目前已经更新到了 6.8.1,其实就是 io.js,最新特性版,不建议生产环境使用
    • Node 计划在 2016 年 10月底正式发布 Node 7.0
      • 7.0 已经最大限度的支持了很多的 ES6 新语法
      • 而且提高了整体的执行性能,提供了一些别的API

    Node 各个重要版本发展阶段:

    1.0之前等了6年,而从1.0到8.0,只用了2年时间。

    • 从v0.1到0.12用了6年
    • 2015-01-14发布了v1.0.0版本(io.js)
    • 2.x(io.js)
    • 3.x(io.js)
    • 2015年09月Node.js基金会已发布Node.js V4.0版 与io.js合并后的第一个版本
    • 2015年10月Node.jsv4.2.0将是首个lts长期支持版本
    • 2016年底发布到4.2.4 && 5.4.0
    • 2016年3月20日v4.4.0 LTS(长期支持版本)和v5.9.0 Stable(稳定版本)
    • 2016 年底 v6.0 支持95%以上的es6特性 , v7.0通过flag支持async函数,99%的es6特性
    • 2017年2月发布v7.6版本,可以不通过flag使用async函数

    enter image description here

    为什么要学习 Node

    • 增加职业竞争力
    • 企业需求
    • 进一步理解 Web
    • 为了更好的学习前端框架

    Node 能做什么

    • Web 服务器
    • 命令行工具
    • 网络爬虫
    • 桌面应用程序开发(Electron)
    • ……
    • 更进一步的理解 B/S 编程模型
    • 模块化编程
    • Node常用API
    • JavaScript 异步编程
      • 回调函数
      • Promise
      • Generator
      • async/await 函数
    • Express Web 开发框架
    • Ecmascript 6

    结语

    JavaScript 长久以来一直被限制在浏览器的沙箱中运行, 它的能力取决于浏览器中间层提供的支持多少。 Node 将高性能的 V8 带到了服务器端,使 JavaScript 也可以开发出实时高性能的服务器。 在 Node 中,不再与CSS样式表,DOM树打交道, 可以随意的访问本地文件,搭建 WebSocket 服务器,连接数据库等系统级底层操作。 Node 不处理 UI,只关心数据,无论是本地数据还是网络数据。 前后端编程统一,大大降低了前后端编程切换的代码。

    相关链接