初识Node.js | 青训营笔记

73 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

Node.js 应用场景

前端工程化

  • 框架选型

  • 前后端分离

  • 模块化

  • 组件化

  • 脚手架

  • 组件库

  • 本地开发服务器

  • Mock服务

  • 微前端

Web服务端应用

  • 学习曲线平缓,开发效率较高

  • 运行效率接近常见的编译语言

  • 社区生态丰富及工具链成熟

  • 与前端结合的场景会有优势

Electron跨端桌面应用

  • 有不少商业应用

  • 是大型公司内的效率工具

Node.js运行时结构

运行结构

image.png

v8 :实现虚拟机的功能,执行js代码(自己的代码 + 第三方的代码 + native modules的代码;提供C++函数接口,为node.js提供v8初始化。

libuv:基于事件驱动的异步IO模型库。由自己编写的js代码发出请求,最终在libuv完成,回调函数也是在libuv中触发。

举例:用node-fetch发起请求运行流程

通过npm安装node-fetch模块,在用户代码里调用node-fetch模块,在V8中执行。node-fetch执行时调用底层Node.js Core(Js)模块,再去调用更底层的Node.js Core(C++),其中可能会调用lihttp完成http的序列和反序列化。将得到的数据交给libuv,其中可能会调用TCP连接,把数据发给远端,由远端返回数据。在事件循环中的到数据后交给llhttp,得到的数据给Node.js Core(Js)模块,最后返回到用户代码中得到最终结果。

运行时的结构特点

  • 异步 I/O

当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程,并占用额外内存等待

  • 单线程

JS线程 + uv线程 + V8任务线程池 + V8 Inspector线程

不用考虑多线程状态同步问题,也就不需要锁,而且能比较高效地利用系统资源,但缺点是阻塞会产生更多负面影响

  • 跨平台

Node.js跨平台和JS无需编译的环境使得开发成本低,整体学习成本低

总结与感悟

看前端学习路线的时候node.js就是必学内容,以前我对它的认识是用前端管理后端的内容,是一门类似JS的语言,学习后我才明白它不是一门语言,而是一个平台,运行环境由浏览器转到了服务器,实现了更多的功能,提高了开发的效率。当然,这次课只是一个了解,但对我理解开发流程和前端工程化的认识又进了一步。