这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
一、Node.js的运行场景
1、前端工程化
Bundle(打包工具): webpack,vite,esbuild,parcel 等
Uglify:(JS压缩工具) uglifyjs
Transpile:(语法转换) bablejs,typescript
不过现在还有其他语言加入竞争:esbuild,parcel,prisma
Node.js的现状:仍然难以替代
2、Web服务端应用
Node.js在服务端上应用的优点:
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富,工具链成熟(npm,V8 inspector)
- 与前端结合的场景有优势(SSR)
- 现状:竞争激烈,Node.js有自己独特的优势
3、Electron跨端桌面应用
商业应用: vscode,slack,discord,zoom
大型公司内的效率工具
在跨端内有很大优势
现状:大部分场景在选型时,都值得考虑
4、Node.js在字节
- BFF应用、SSR应用:Modern.js
- 服务端应用:头条搜索、西瓜视频、懂车帝
- Electron应用:飞连、飞书
二、Node.js的运行时结构
1、特点:
- 异步I/O:在Node中,绝大多数的操作都以异步的方式进行调用。在Node.js执行I/O操作时,会在响应返回后恢复操作而非阻塞线程,这样子做可以极大的提升运行的效率,防止堵塞。
- 单线程:javascript语言的一大特点就是单线程。在Node中,js与其余线程是无法共享任何状态的。但是它也有好处,就是不用像多线程编程一样处处在意状态的同步问题,并不会出现思索,也没有线程上下文交换带来的性能开销。后面版本可以使用worker_thread建立独立线程。
- 跨平台: Node.js跨平台+JS无需编译环境=开发成本低,整体学习成本低
- 事件驱动模型:这是一种编程范式,程序的执行流由外部事件来决定。特点是包含一个是事件循环,当外部事件发生的时候会使用回调机制来触发相应的处理。
2、结构
上图是onode.js的组成结构。node.js中:
- v8 engine 即为v8引擎,主要以虚拟机般执行js代码并提供c++函数接口,为node.js提供v8初始化等功能。
- libuv:是基于事件驱动的异步IO模型库。
- builtin modules:是由C++代码编写的各类模块,包含了许多基础功能。
所以总的来看,Node.js其实是一个构建在V8引擎上的JavaScript运行环境,并将v8和libuv连接在了一起。