一、前言
经过这几年的发展,前端普遍进入了技术深水区,只会Web页面开发已经难以满足企业的需求,Node逐渐成为了刚性技能。为了回馈粉丝的支持,前端微服务特开启Node.js专题,系统学习Node.js知识,为还在迷茫路上的你,提供系统化的学习。
二、Node.js发展史
Ryan Dahl,一名资深的C/C++程序员,他的主要工作是用C/C++写高性能Web服务。在经历过一些尝试֖和失败ܾ᠋之后,他找到了设计高性能,Web服务器的几个要点:事件驱动、非阻塞I/O。
Ryan Dahl最初的目标是写一个基于事件驱动、非阻塞I/O的Web服务器,以达到更高的性能,提供Apache等服务器之外的选择。但是用C/C++写就太痛苦了。于是这位兄弟开始设想用高级语言开发Web服务。
他评估了很多种高级语言,发现JavaScript比C的开发门槛要低,比Lua的历史包袱要少。尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,并且空白,可以说历史包袱为零,JavaScript是单线程执行,根本不能进行同步IO操作,为其导入非阻塞I/O库没有额外阻力。所以选定JavaScript成为了Node.js的实现语言。
当时,第二次浏览器大战也渐渐分出高下,Chrome浏览器的JavaScript引擎V8摘得性能第一的宝座。又因为V8就是开源的JavaScript引擎,有着Google这一个大团队投资和持续支持,于是选择V8作为运行时引擎为不二之选。
于是在2009年,Ryan正式推出了基于JavaScript语言和V8引擎的开源Web服务器项目,命名为Node.js。虽然名字很土,但是,Node第一次把JavaScript带入到后端服务器开发,加上世界上已经有无数的JavaScript开发人员,所以Node.js一下子就火了起来。
起初,Ryan Dahl称他的项目为web.js,就是一个Web服务器,但是项目的发展超过了他最初单纯开发一个Web服务器的想法,变成了构建网络应用的一个基础框架,这样可以在它的基础上构建更多的东西,诸如服务器、客户端、命令行工具等。
三、Node.js是什么
读完Node.js,读完了它的发展由来。Node.js 不是一门新的语言,也不是一个JavaScript的框架,它是一个JavaScript运行在浏览器之外的平台,是运行在服务端的 JavaScript或者Node.js 是一个服务器端 JavaScript 解释器,是一个Javascript运行环境(runtime)。它采用事件驱动、异步编程、为网络服务而设计,实现了诸如文件系统、模块、包、操作系统 API、网络通信等 Core JavaScript 没有或者不完善的功能。实际上它是对Google V8引擎进行了封装。V8引擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。说白了,就是一个能编译你写的js代码并让计算机识别并执行的编译环境,一般我们会用的到浏览器的内核来编译解析我们的JS代码,而Node.js是另一种运行环境(所以Node.js是一个平台,不是一种语言,更不是什么后端语言,也不是什么前端框架,它是由C++编写的JavaScript的运行环境—— 虚拟机)。
四、Node.js应用场景
Node.js可以是前端全栈的基石,可以与前端衔接,用来做后端应用。它的应用场景已经从前端工具的脚手架、辅助工具类,发展到api中间层、代理层,以及专业的后端开发。
这其中最有价值的就是api中间层。前后端协作的时候,因为进度不同有时前端需要等后端的接口。为了保证进度,前端可以用node做api中间层,通过nodeJs可以自己约定数据的格式,根据前端的需求定制自己的接口,自己封装对数据库的增删改查操作,创建自己的代理和网关服务器等。
这些事情在以往只能是等着后端做,但现在通过nodeJs,前端人员都可以自己搞定后端服务这个事情,这就使得工作的过程更加可控。
有时候,仅仅使用Node.js可以作为一个中间层来来分发调用数据接口,比如有一个网站数据是有java提供的,我们可以让Node.js作为一个中间层,来接受用户的请求,然后通过Node.js来调用java数据接口,获取到数据后直接在Node.js层面做html组合,然后将渲染好的页面直接给用户。为什么要这样做,直接请求java接口不行吗,这是因为Node.js被称之为高性能的web服务器,在并发和抗压方面都比传统的平台要好很多,因此这样一包装可以极大的减轻服务器的开发。
五、Node.js的优点
Node.js最大的特点是采用异步式I\O与事件驱动
- 单线程
- 异步的非阻塞I/O
- 事件驱动
- 解析JS代码
- 没有浏览器安全级的限制;
- 提供系统级别的API;
- a. 文件的读写
- b. 进程的管理
- c. 网络通信
- Node.js库异步和事件驱动
- Node.js 使用的是单线程模型,对于所有I/O都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。所有API异步是非阻塞。 这意味着一个基于Node.js的服务器不会等待API返回数据。 服务器移动到下一个API后调用它,Node.js事件的一个通知机制有助于服务器,以获得从以API调用的响应。Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。这样做的好处是,CPU和内存在同一时间集中处理一件事,同时尽可能让耗时的I/O操作并行执行。对于低速连接攻击,Node.js只是在事件队列中增加请求,等待操作系统的回应,因而不会有任何多线程开销,很大程度上可以提高 Web 应用的健壮性,防止恶意攻击。
- 非常快
- 正在构建在谷歌Chrome的V8 JavaScript引擎,Node.js库代码执行是非常快的。
- 单线程但高度可扩展
- Node.js使用事件循环单线程模型。事件机制有助于服务器在非阻塞的方式作出反应,并使得服务器的高可扩展性,而不是它创建线程限制来处理请求的传统服务器。 Node.js使用单线程的程序和同样的程序处理比传统的服务器要大的多,比如:比Apache HTTP服务器请求服务的数量大得多。
- 无缓冲
- Node.js的应用从来没有缓冲任何数据。这些应用程序只需输出块中的数据。(即流应用)
- 许可证
- Node.js是在MIT许可下发布的。
六、Node能做什么
- 具有复杂逻辑的网站
- 基于社交网络的大规模web应用
- web Socket网站
- TCP\UDP套接字应用程序
- 命令行工具
- 交互式终端程序
- 带有图形用户界面的本地应用程序
- 单元测试工具
- 客户端Javascript编译器
……
七、相关概念
- npm
- package.json
- express
- koa
- egg