这是我参与「第五届青训营 」笔记创作活动的第 7 天
Node.js与前端开发实战
Node.js 的应用场景
- 前端工程化
- Web 服务端应用
- Electron 跨端桌面应用
前端工程化
- Bundle (打包工具):
- Webpack
- Vite
- Esbuild
- Parcel
- Uglify (代码压缩):
- Uglifyjs
- Transpile (转译):
- Bablejs
- Typescript
Web 服务端应用
Node.js 的特点
- 学习曲线平缓, 开发效率高
- JS本身熟悉, 主要了解运行环境的不同, Node.js 的API
- 运行效率接近常见编译语言
- 社区生态丰富以及工具链成熟 (npm, V8 inspector)
- 虽然社区生态丰富, 但是相关包的成熟度可能不如其他语言
- 与前端结合的场景会有优势 (SSR)
现状: 竞争激烈, Node.js 有自己独特的优势
基于Web技术的跨端应用
- 商业应用:
- vscode
- slack
- discord
- zoom
- 大型公司内部的效率工具
Node.js 运行时结构
libuv: 负责事件循环 (eventloop), 封装各种操作系统API (syscall)
结构带来的特点
- 异步IO
- 单线程
- 跨平台
异步I/O
当Node.js执行I/O时, 不需要去阻塞线程, 以及不需要占用额外内存等待
单线程
JS单线程实际上只有JS主线程是单线程
实际上的结构:
- JS 线程
- uv 线程池
- V8 任务线程池
- V8 Inspector 线程
优点: 不需要考虑多线程状态同步问题, 也不需要锁, 但是需要考虑异步问题, 比较高效利用系统资源
缺点: 主线程阻塞会产生更多负面影响 (解决方法: 多进程/多线程)
跨平台
- 大部分功能 / API支持跨平台
- Node.js 跨平台 + JS 无需编译 = 开发成本低与整体学习成本低
延伸话题
Node.js 代码贡献
好处:
- 从使用者的角色逐步理解底层细节, 可以解决更复杂的问题
- 自我证明, 有助于职业发展
- 解决社区问题, 促进社区发展
难点:
- 花时间
追踪与诊断
需要了解 Node.js 的底层, 需要了解操作系统及各种工具
需要经验
WASM, NAP
Node.js 支持 WASM与WASI
NAPI 执行 C 接口的代码, 同时能保留原生代码的性能
不同编程语言间通信的解决方案