这是我参与「第五届青训营 」笔记创作活动的第8天
Node.js的应用场景
- 前端工程化:早期ajax,jquery比较流行的时候,我们直接在页面中引入需要的ib即可。后续随着模块化、transpile逐渐成熟、需求逐渐增多,对后端能力的需求也逐渐强烈。反过来说,也正是Node,js赋予了js开发者在浏览器外运行代码的能力,加速催生了这些项目的出现。
- Web服务端应用:第二个常见的场景是使用Node.js开发Web服务端应用,也就是后端服务。
- Electron跨端桌面应用:这里不只是指electron,还包括nwjs;这个场景在较大的企业里面非常常见。
Node.js运行时结构
- V8.:JavaScript Runtime,诊断调试工具(inspector)
- libuv:eventloop(事件循环),syscall(系统调用)
- 举例:用node-fetch发起请求时
特点
- 异步I/O:当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞进程。
- 单线程:JS单线程
实际:JS线程+uv线程池+V8任务线程池+V8 Inspector线程
- 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源:
- 缺点:阻塞会产生更多负面影响 解决办法:多进程或多线程
- 跨平台:Node.js跨平台+JS无需编译环境(+Web跨平台+诊断工具跨平台)
- 开发成本低(大部分场景无需担心跨平台问题整体),学习成本低
拓展
Node.js贡献代码
- 好处:从使用者的角色逐步理解底层细节,可以解决更复杂的问题 自我证明,有助于职业发展 解决社区问题,促进社区发展
- 难点:花时间,底层内容较多
编译Node.js
为什么要学习编译Node.js
- 认知:黑盒到白盒,发生问题时能有迹可循
- 贡献代码的第一步
诊断/追踪
诊断是一个低频、重要同时也相当有挑战的方向。是企业衡量自己能否依赖一门语言的重要参考。
- 技术咨询行业中的热门角色。
难点:
- 需要了解Node.js底层,需要了解操作系统以及各种工具
- 需要经验
WASM,NAPI
- Node.js(因为V8,是执行WASM代码的天然容器,和浏览器WASM是同一运行时,同时Node.js支持WASl
- NAPI执行C接口的代码(C/C++/Rust),同时能保留原生代码的性能。
- 不同编程语言间通信的一种方案。
总结
学习了部分Node.js的内容后,深刻的了解到,前端工程化的强大以及Node.js的革新性,它给前端带来的不仅是强大的功能,还给前端的发展带来了无限的可能。