这是我参与「第四届青训营 」笔记创作活动的的第8天
应用场景
- 首先要提到的是前端工程化的场景。早期 ajax, jquery 比较流行的时候,我们直接在页面中引入需要的 lib 即可。后续随着模块化、transpile 逐渐成熟、需求逐渐增多,对后端能力的需求也逐渐强烈。反过来说,也正是 Node.js 赋予了 js 开发者在浏览器外运行代码的能力,加速催生了这些项目的出现。
- 第二个常见的场景是使用 Node.js 开发 Web 服务端应用,也就是后端服务。这里我们特别提一下 vercel 这家公司,
- 最后要再说下 Electron 应用,这里不只是指 electron,还包括 nw.js 等;这个场景在较大的企业里面非常常见。
优势
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富,工具链成熟(npm,V8 inspector)
- 与前端结合的场景会有优势(SSR)
前端工程化
- Bundle:webpack,vite,esbuild
- Uglify:uglifyjs
- Transpile:babeljs,typescript
其他主要应用场景(字节为例)
- BFF(前端的后端)应用、SSR(服务端渲染)应用:Modern.js
- 服务端应用:头条、懂车帝、西瓜视频
- 跨端桌面应用:Electron(飞书)
运行时结构
- V8:JavaScript Runtime,提供了诊断调试工具(Inspector)
- libuv:eventloop,syscall(封装操作系统api,提供跨平台的IO操作)
特点
-
异步I/O:Nodejs执行I/O操作时,不会阻塞线程,减少了内存占用
-
单线程:新版本nodejs提供多线程操作
- 实际:JS线程 + uv 线程池(*4,异步操作、计算密集任务) + V8任务线程池 + V8 Inspector 线程
- 优点:不用考虑多线程状态同步问题,也就不用考虑锁;比较高效地利用系统资源
- 缺点:阻塞会产生负面影响
-
跨平台:相同代码可以运行在不同操作系统中
- 大部分功能、api跨平台
- js无需编译环境 + Web 跨平台 + 诊断工具跨平台 = 开发成本低
实战:HTTP服务
server端
client端
静态文件服务器
优化方向:CDN加速 + 缓存;分布式存储;容灾处理……
SSR
服务器端渲染(Server-Side Rendering)是指由服务端完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程。
放在浏览器进行就是浏览器渲染,放在服务器进行就是服务器渲染。
- 服务端渲染(SSR)有利于 SEO 搜索引擎优化
- 服务端渲染(SSR)是可以被爬虫抓取到的,客户端异步渲染是很难被爬虫抓取到的
- 服务端渲染(SSR)直接将HTML字符串传递给浏览器。大大加快了首屏加载时间。
- 服务端渲染(SSR)占用更多的CPU和内存资源。
- 一些常用的浏览器API可能无法正常使用。
Debug
-
V8 inspector:开箱即用、特性丰富强大、与前端开发一致、跨平台
- node —inspector
- open http://localhost:9229/json
-
场景:
- 查看console.log
- breakpoint
- 高CPU、死循环:cpuprofile
- 高内存占用:headsnapshot
- 性能分析
部署
-
部署需要解决的问题:
- 守护进程:当进程退出时,重新拉起
- 多进程:cluster 便捷地利用多进程
- 记录进程状态,用于诊断
-
容器环境
- 通常有健康检查的手段,只需考虑多核CPU利用率即可