这是我参与「第四届青训营 」笔记创作活动的第5天
Node.js 应用场景
前端工程化
-
框架选型
-
前后端分离
-
模块化
-
组件化
-
脚手架
-
组件库
-
本地开发服务器
-
Mock服务
-
微前端
Web服务端应用
-
学习曲线平缓,开发效率较高
-
运行效率接近常见的编译语言
-
社区生态丰富及工具链成熟
-
与前端结合的场景会有优势
Electron跨端桌面应用
-
有不少商业应用
-
是大型公司内的效率工具
Node.js运行时结构
运行结构
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的语言,学习后我才明白它不是一门语言,而是一个平台,运行环境由浏览器转到了服务器,实现了更多的功能,提高了开发的效率。当然,这次课只是一个了解,但对我理解开发流程和前端工程化的认识又进了一步。