从诞生时的饱受争议,到如今的如火如荼,NodeJS经过多年发展,现今前端开发早已离不开NodeJS。
方便管理的npm包,前端工程化的构建,大型公司前端+NodeJS+服务端的结构...
NodeJS让前端开发变得更高效的同时,也为前端带来了更多的职业晋升与发展空间。在前后端界限越来越模糊的大背景下,NodeJS是前端快速走向全栈发展的捷径。
NodeJS简介
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。
Node 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
NodeJS的特点
Node.js作为服务端的新生物,相比传统的webserver服务模式,最大的特点与优势有如下几种
单线程
在传统服务器端语言如Java、PHP或者.net等中,会为每一个客户端连接创建一个新的线程。 而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右。
NodeJS可以在不新增额外线程的情况下,依然可以对任务进行并发处理,它不会为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了, 就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。
非阻塞I/O
程序执行的过程中会有很多的I/O操作,如读写文件,请求响应等等,在阻塞性IO特性的语言中,当读取一个文件, 整个流程都暂停下来,需要等待文件读取成功后才能进行下一步操作,也就是I/O操作阻塞了代码的执行,这样会极大的降低程序的效率。
非阻塞I/O也就是指程序在执行的过程中,I/O操作不会阻塞程序的执行,NodeJS在读取文件程序的同时,也能继续执行其他的代码。
基于 Chrome V8 引擎
V8引擎是谷歌开源的JavaScript解释器,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。因此JavaScript程序在V8引擎下的运行速度媲美二进制程序。
从08年诞生的这10多年时间,V8引擎的性能至少提升了4倍,这些年谷歌的程序猿一直在压榨V8引擎的性能,如今也在继续,因此称V8是地表最强JS引擎也不为过。
事件循环与事件驱动
- 事件循环
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 几乎每一个 API 都是支持回调函数的。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
- 事件驱动
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
环境搭建
NodeJS的环境搭建很简单,在官网下载安装包后,一路下一步即可。
如果有不明白的地方,参考这里
不过个人建议不要直接安装NodeJS,而是使用nvm安装管理NodeJS。
使用nvm管理NodeJS版本
由于NodeJS更新很快,因此经常遇到不同项目必须依赖不同版的NodeJS运行环境。如果没有好的版本管理工具,你需要重复卸载安装,过程十分麻烦。好在有nvm这么一个工具,可以有效解决这一问题。
nvm的使用方式可以 参考这里
版权属于:Sanakey(特殊声明除外)
本文链接:https://keymoe.com/archives/96/
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。