这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
nodejs是一种环境,还是经常使用到。js的一种运行是在浏览器中,另一种就是node环境,所以还是很重要
应用场景
前端工程化
前期都是在浏览器上运行,主要考虑兼容性就行
随着前端工具化发展,很多工具进行打包等等。需要在浏览器以外跑这些工具
举例
bundle打包——webpack vite esbuild parcel
uglify压缩——uglifyjs
transpile转换——bablejs typescript
其它语言加入竞争nodejs。但nodejs现状:难以替代
Web服务端应用
学习曲线平缓,开发效率较高——js已经很熟悉了,主要是node给了更多api解决后端的事
nodejs不需要编译环境,效率很高
社区丰富、工具链成熟(npm v8inspector)
与前端结合的场景有优势(SSR)
electron等跨端桌面应用
商业应用:vscode slack discord zoom
大型公司内的效率工具(跨端、运行效率高)
现状:大部分场景在选型时,都值得考虑
运行时结构
组成
acron node-inspect npm 用户代码
nodejs-core(js) n-api
nodejs-core(cpp)
v8 libuv nghttp2 zlib c-ares openssl llhttp...
v8——js runtime inspector
libuv——事件循环 系统调用
特点
异步IO
单线程(实际:一个JS线程 + nv线程池 + v8任务线程池 + v8inspector线程)
- 优点:不用锁,同时可以比较高效利用系统资源
- 缺点:阻塞会产生更多负面影响(解决:多进程或多线程)
跨平台(大部分功能、api)
实战
要注意版本,推荐使用nvm
HTTP server
readstream的api好处:做了处理,占据的内存空间更少
SSR
特点:避免重复编写http代码。相比spa,首屏渲染更快,seo友好
缺点:qps较低,前端代码编写时要考虑服务端渲染效果
难点:
- 需要处理打包代码
- 需要思考前端代码在服务端运行的逻辑
- 移除对服务端无意义的副作用或环境
Debug
devtools