这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天。
本文整理了
Node.js应用场景
,Node.js运行时结构
部分的笔记。
Node.js应用场景
前端工程化
- Bundle: webpack, vite, esbuild, parcel (用于打包的工具)
- Uglify: uglifyjs (对代码进行转换,减少代码体积)
- Transpile: bablejs, typesctipt (做语法转换)
- 其他语言的竞争: esbuild(基于go实现), parcel(基于rust实现), prisma(数据库)
前端工程化发展阶段使用到的一些方法
Web服务端应用
- 学习曲线平缓,开发效率高(Node.js可以提供很多API,可以通过这些API做一些后端的事情)
- 运行效率高(是一门不需要编译环境的语言)
- 社区生态丰富(npm上可以搜索类似需求)+工具链成熟(V8 inspector)
- 与前端结合的场景会有优势(使用SSR进行服务端渲染以及一些只有Node.js可以做好的与前端相结合的工作。 )
Electron(或NW.js)跨端桌面应用
- 商业应用: vscode, slack, discord, zoom
- 大型公司内的效率工具
Node.js可以做一些传统后端能做的事情。
在跨端方面优势大(Mac、Windows之间无需开发两套应用)
Node.js in ByteDance
- BFF应用、SSR应用,举例:Modern.js
- 服务端应用,举例:头条搜索,西瓜视频
- Electron应用:飞书
Node.js运行时结构
Node.js由什么组成?
acron, node-inspect, npm, Node.js Core, 内部有较多C++代码,N-API(需要Node.js更高效的满足一些性能需求时使用),v8, libuv, nghttp2, zlib ……
v8,libuv
-
v8: JavaScript Runtime,诊断调试工具(inspector)Node.js运行效率高的原因
-
libuv: eventloop(事件循环),syscall(系统调用) 实现跨平台操作
特点
- 异步 I/O
最后的结果会是先在控制台输出A,后输出B
- 单线程
- 跨平台(Node.js中已经实现了跨平台的操作,无需再考虑在不同平台上使用什么样的操作)
异步IO
当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待。(内存占用更少)
单线程
- JS单线程
- JS线程+uv线程池+v8任务线程池+v8 Ispector线程
优点:不用考虑多线程状态同步问题,也就不需要锁(看起来更简单);同时还能比较高效的利用系统资源
缺点:阻塞会产生更多负面影响 解决方案:多进程或多线程
跨平台
- 跨平台(大部分功能、API);
- Node.js跨平台、JS无需编译环境、Web跨平台、诊断工具跨平台=>开发成本低(大部分场景不用考虑跨平台问题)且学习成本低。