1.什么是 Node.js
Node.js是一个JavaScript运行平台, 使用 Google V8引擎(基于es6). 特征是异步和事件驱动机制。Node.js是单线程编程模型,可以规避一些在线程编程中出现的问题,如资源死锁和竞态条件
2.非阻塞I/O
在执行磁盘或网络这样的慢I/O操作时,我们希望程序可以继续执行其他业务逻辑。Node用三种技术来实现: 事件、异步API、非阻塞I/O。
为了更好的解释非阻塞I/O, 引用一下Node.js实战(第二版)
在Node程序员看来,非阻塞I/O是个底层属于。它的意思是说,你的程序可以在做其他事情时,发起一个请求来获取网络资源,然后当网络操作完成时,将会运行一个回调函数来处理这个操作的结果。
看看这样的业务场景:需要从多个数据源拉取数据,然后进行处理。
①串行获取数据,这是我们一般的解决方案,一PHP为例的I/O阻塞-PHP为例,假如获取profile和timeline操作各需要1s,那么串行获取就需要2s。
②Node.js非阻塞I/O事件会创建一个线程去执行,然后主线程会继续往下执行,因此,拿profile的动作触发一个I/O事件,马上就会去执行拿timeline的动作,两个动作并行执行,加入各需要1s,那么总的时间就是1s。它们的I/O操作执行完成后,会发射一个事件,profile和timeline,事件代理接收后继续往下执行后面的逻辑,这就是Node.js非阻塞I/O的特点。
非阻塞I/O是程序执行过程中,I/O操作不会阻塞程序的执行,也就是在I/O操作的同时,继续执行其他代码(这得益于Node的事件循环机制)。在I/O设备效率还远远低于CPU效率的时代,这种I/O模型(非阻塞I/O)为程序带来的性能上的提高是非常可观的。
libuv是提供快速、跨平台、非阻塞I/O的本地库
3. 核心模块
Node的标注库核很精巧,是在JavaScript标准上加入了文件和TCP/IP网络功能,使其成为一个可以编写服务器端的编程语言。常用node库, 文件系统库(fs, path)、TCP客户端和服务端库(net)、HTTP库(http和https)、域名解析库(dns)、用于写测试的断言库(assert)、用于查询平台信息的操作系统库(os)、用于处理事件的事件模块。
4. Node自带工具
Node自带npm包管理器以及调试器
- npm要求node根目录下有一个package.json文件, 创建这个文件的命令
npm init -y
- node调试器支持单步执行和REPL(读取-计算-输出-循环)
启动调试的命令是
node debug xxx.js
5. v8引擎
v8引擎由Google的Chromium项目组开发,主要负责JavaScript代码的解释和执行。它的特性是将JavaScript直接编译为机器码并对代码进行优化,让Node运行的更快。