node | 青训营笔记

117 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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

延申话题