用libuv进行异步I/O操作

  • 比如读文件就是用libuv去进行异步操作,因为一般读文件是同步操作。但是你读文件就占用这个文件,node就没什么事做
  • 所以给libuv去做的话,等libuv读完这个文件,再给node发一个事件,告诉node读完文件了,node在去操作,接替后面的事情。

    用eventloop管理实践处理顺序

    用C/C++库高效处理DNS/HTTP…

    用bindings让JS能和C/C++沟通

  • require

    用V8运行JS

    用Node.js标准库简化JS代码

    这就是Node.js

Nodejs的工作流程

image.png
从左到右:
application:就是我写的js。要放到V8引擎上面去运行
在运行的过程中,v8发现你用了settimeout(event)(比如),这个时候V8就会调用nodejs’的bindings或者nodejs的API(桥梁),去把这个settimeout放在EventLoop里面,告诉eventloop一段时间之后要执行这个函数
这个函数会被eventloop放到他的Event Queue里面,等到恰当的时机去执行事件队列里面的代码。

在这个过程中,eventloop一直在转圈圈,循环。它可能会在poll阶段等比较久。
比如说现在要读一个文件:

  • eventloop就会利用libuv去开一个线程去读这个文件(js是不参与整个读文件过程的)
  • 读完文件后,操作系统会返回一个事件给eventloop
  • eventloop知道文件读好了,就会传回给v8,然后传回给我的代码(application)

网络请求也是一样的:

  • libuv得到了用户传来的网络请求,把这个请求塞到eventloop里面(塞到poll阶段)
  • poll阶段得到这个请求之后就会调用js代码,把它执行

    V8和libuv是最重要的,而nodejs bindings,和nodejs API是中间的桥梁,我们的代码只是整个平台很小的一部分

工作流程 简单来说就是:
代码 -> V8 ->通过nodejs API使用libuv提供的功能,和C/C++提供的功能来完成用户所需要的功能

image.png
我们大部分时候,只需要学习nodejs标准库即可
对于其他模块,需要有一个大概的了解
因为如果你要了解标准库之外的东西,需要学好C/C++