Node.js 与前端开发实战
这是我参与「第四届青训营」笔记创作活动的第9天
Node.js 的应用场景
前端工程化
-
早期的jQuery等库都是直接在页面中引入,后来模块化逐渐成熟,Node.js赋予了开发者在浏览器外运行代码的能力,前端逐渐模块化
-
Bundle:webpack、Vite、esbuild、Parcel等
-
Uglify:UglifyJS
-
Transplie:babeljs、TypeScript
-
其他语言加入竞争
- esbuild、Parcel 、prisma等
-
现状
- Node.js难以替代
Web服务端应用
-
学习曲线平缓,开发效率较高
-
运行效率接近常见的编译语言
-
社区生态丰富及工具链成熟
- npm,V8 inspector
-
与前端结合的场景会有优势
- SSR,同构前端应用。 编写页面和后端数据的获取和填充都由 JavaScript 来完成
-
现状
- :竞争激烈,Node.js 有自己独特的优势
Electron跨端桌面应用
-
商业应用: vscode、slack、discord、zoom
-
大型公司内的效率工具
-
现状
- 大部分场景在选型时,都值得考虑
Node.js运行时结构
-
N-API:用户代码中利用npm安装的一些包
-
V8:JavaScript Runtime,诊断调试工具(inspector)
-
libuv:eventloop (事件循环),syscall (系统调用)
-
举例
- 用node-fetch发起请求时
- 整个过程中底层会调用非常多的c++代码
特点
-
异步I/O
- 读取文件时。当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待。
-
单线程
- worker_thread可以起一个独立线程,但每个线程的模型没有太大变化
-
JS单线程
- 实际:JS线程 + uv线程池(4个线程) + V8任务线程池 + V8 Inspector线程
- 优点:不用考虑多线程状态同步问题,也就不需要锁。同时还能比较高效地利用系统资源
- 缺点:阻塞会产生更多负面影响、异步问题、延时有要求的场景需要考虑
- 解决办法:多进程或多线程
-
跨平台(大部分功能、api)
- Node.js跨平台 + JS无需编译环境(+ Web跨平台 + 诊断工具跨平台)= 开发成本低(大部分场景无需担心跨平台问题),整体学习成本低
编写Http Server
Hello World
Json
Client
延伸话题
快速了解Node.js代码
-
好处
- 从使用者的角色逐步理解底层细节,可以解决更复杂的问题,
- 自我证明,有助于职业发展;
- 解决社区问题,促进社区发展
-
难点
- 花时间
编译Node.js
-
为什么要学习编译Node.js
- 认知:黑盒到白盒,发生问题时能有迹可循
- 贡献代码的第一步
-
如何编译
- ./configure &&make install
- 演示:给net模块添加自定义属性
诊断/追踪
-
诊断是一个低频、重要同时也相当有挑战的方向。是企业衡量自己能否依赖一个门语言的重要参考。
-
技术咨询行业中的热门角色
-
难点:
- 需要了解Node.js底层,需要了解操作系统以及各种工具
- 需要经验
WASM, NAPI
- Node.js(因为V8)是执行WASM代码的天然容器,和浏览器WASM是同一运行时,同时Node.js支持WASI。
- NAPI执行C接口的代码(C/C++/Rust…),同时能保留原生代码的性能。
- 不同编程语言间通信的一种方案。