Node.js与前端开发|青训营笔记

41 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天。

本文整理了Node.js应用场景,Node.js运行时结构部分的笔记。

Node.js应用场景

前端工程化

  • Bundle: webpack, vite, esbuild, parcel (用于打包的工具)
  • Uglify: uglifyjs (对代码进行转换,减少代码体积)
  • Transpile: bablejs, typesctipt (做语法转换)
  • 其他语言的竞争: esbuild(基于go实现), parcel(基于rust实现), prisma(数据库)

前端工程化发展阶段使用到的一些方法

Web服务端应用

  • 学习曲线平缓,开发效率高(Node.js可以提供很多API,可以通过这些API做一些后端的事情)
  • 运行效率高(是一门不需要编译环境的语言)
  • 社区生态丰富(npm上可以搜索类似需求)+工具链成熟(V8 inspector)
  • 与前端结合的场景会有优势(使用SSR进行服务端渲染以及一些只有Node.js可以做好的与前端相结合的工作。 )

Electron(或NW.js)跨端桌面应用

  • 商业应用: vscode, slack, discord, zoom
  • 大型公司内的效率工具

Node.js可以做一些传统后端能做的事情。

在跨端方面优势大(Mac、Windows之间无需开发两套应用)

Node.js in ByteDance

  • BFF应用、SSR应用,举例:Modern.js
  • 服务端应用,举例:头条搜索,西瓜视频
  • Electron应用:飞书

Node.js运行时结构

Node.js由什么组成?

acron, node-inspect, npm, Node.js Core, 内部有较多C++代码,N-API(需要Node.js更高效的满足一些性能需求时使用),v8, libuv, nghttp2, zlib ……

v8,libuv

  • v8: JavaScript Runtime,诊断调试工具(inspector)Node.js运行效率高的原因

  • libuv: eventloop(事件循环),syscall(系统调用) 实现跨平台操作

特点

  1. 异步 I/O

最后的结果会是先在控制台输出A,后输出B

  1. 单线程
  2. 跨平台(Node.js中已经实现了跨平台的操作,无需再考虑在不同平台上使用什么样的操作)

异步IO

当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待。(内存占用更少)

单线程

  • JS单线程
    • JS线程+uv线程池+v8任务线程池+v8 Ispector线程

优点:不用考虑多线程状态同步问题,也就不需要锁(看起来更简单);同时还能比较高效的利用系统资源

缺点:阻塞会产生更多负面影响 解决方案:多进程或多线程

跨平台

  1. 跨平台(大部分功能、API);
  2. Node.js跨平台、JS无需编译环境、Web跨平台、诊断工具跨平台=>开发成本低(大部分场景不用考虑跨平台问题)且学习成本低。