首先,咱们看一下官网对于Node.js的介绍:css
Node.js is a JavaScript runtime built on Chrome's V8前端
Node.js是一个构建在ChromeV8引擎上的Javascript的运行时,nodejs并非一门语言,JavaScript才是一门语言,而nodejs是让JavaScript在服务器端跑起来的一个runtime,nodejs并不能使用JavaScript的全集(BOM和DOM)java
Node.js uses an event-driven,non-blocking I/O modelnode
I/O: 就是 input/output 的缩写,也就是 输入/输出 的意思webpack
对于计算机来讲读写磁盘一次I/O操做,想要理解非阻塞I/O,咱们先来了解一下什么是阻塞I/Oweb
阻塞: I/O时进程休眠等待I/O完成后进行下一步,数据库
简单来讲,咱们计算机的程序是逐条顺序执行的,第一句执行完以后才会执行第二句直到程序结束,那么当某条指令是要求计算机进行I/O操做的时候,程序会调用操做系统更底层的命令来进行I/O操做,期间程序就会等待底层命令返回结果,拿到结果以后才能执行下一条指令。咱们就把等待底层命令的这种行为成为阻塞gulp
非阻塞: I/O时函数当即返回,进程不等待I/O完成浏览器
当咱们理解了阻塞和I/O以后,那么顾名思义,非阻塞I/O就是当程序执行到I/O指令时(调用操做系统底层的I/O),主程序不须要等待I/O返回的结果,直接执行下一条指令,这种行为称为非阻塞。sass
I/O结束后通知主程序,也就是咱们接下来要说的事件驱动
事件驱动很常见,好比咱们常常在页面上放一个按钮,而后给他绑定click事件,这个事件处理程序就是事件驱动的,JavaScript的进程并不知道何时调用,当用户点击按钮的时候触发了click事件,这时候主程序获得通知,去调用相应的事件处理程序
I/O等异步操做结束后的通知
观察者模式
前端职责范围变大,统一开发体验
在处理高并发、I/O密集场景性能优点明显
什么是I/O密集场景呢?咱们来对比一下CPU密集场景
什么是高并发呢?在单位时间内访问量特别大就是高并发。
咱们举一个生活中常见的例子,好比说老王开了一个饭店,雇了个厨师小A,来了客人以后小A就去接待,选好菜以后小A去后厨作,作完以后交给客户享用,可是客人一多,就会有客人等待,这样客人就很不爽,
老王一分析,这个简单,再雇两个厨师小B和小C,这样三个厨师,客人能够排三条队,这样问题就初步解决了。
接着饭店名气愈来愈大,客人愈来愈多,这时老王就想了,再多雇几个厨师?可是好像不太划算,老王想到一个好办法,他炒掉了以前的厨师,雇了几个作饭快的厨师,每一个厨师作饭快了4倍,可是只须要支付1.5倍的工资就能够了。
对应到咱们web开发场景,大厨就是物理服务器,开始应对高并发你们想到的最直接的方法就是增长机器数,机器多了,流量仍是同样的大,咱们就能够经过负载均衡让他到不一样的机器上去处理,这样同时响应的web请求的数量就变多了,可是加到必定地步,咱们会发现这并不划算,因而咱们开始使用更好的机器(多核)
总结一下如何应对高并发就是
上面这些是简单粗暴的方法,使用java、node并无什么区别,不能体现出nodejs的优点,而nodejs性能好,主要是在单个的cpu,也就是单台机器的时候,在处理web请求的方式和java是迥异的。为了方便理解后面的内容,咱们先来了解几个概念
进程: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
这个定义很难理解,可是不要慌,咱们仍是举个栗子
咱们能够用电脑来听音乐、上网,那么对应的音乐播放器和浏览器就是一个程序,当咱们双击桌面图标让它运行的时候,实际上就是把这个程序加载到了内存中执行,这个执行中(进行中)的程序叫作进程。
那么咱们知道,单核cpu也是能够一边听音乐一边上网的,这是为何呢?按照上面所说,程序在内存中是一句句执行的,这是两个程序啊,它俩是不可能同时进行的呀。
实际上,它俩也不是同时进行的,计算机用了一个很巧妙的作法,跟咱们拍动画片很是像,在一秒播24帧,虽然是一帧一帧的,但在人的肉眼看就是动画了,cpu也是这么作的,两个程序,在很是短的时间切换,0.1纳秒执行音乐播放器,0.1纳秒执行浏览器,对于人来讲就识别不出来,认为听得音乐都是连续的,这个就叫作多进程
多进程: 启动多个进程,多个进程能够一块执行多个任务(不是同时执行)
线程: 进程内一个相对独立、可调度的执行单元,与同属一个进程的线程共享进程的资源
多线程:启动一个进程,在一个进程内启动多个线程,这样多个线程也能够一块执行多个任务
随着JSX、ES6还有前端各类各样的模块化,sass、less、postcss等的出现,前端代码变得异常复杂,咱们前端直接书写的代码在浏览器上是无法直接工做的,须要进行一些本地的转化工做咱们管这个转化工做叫作编译构建。相关的工具webpack、gulp、babel等工具也应运而生,这些都是nodejs写的。
因此咱们讲NodeJs高性能是有很是多前提的,最大的前提就是web场景,高并发和I/O密集。