Node学习笔记 | 青训营

82 阅读4分钟

Node学习笔记 | 青训营


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


记录本节课所学内容以及一些个人思考

Node.js应用场景

  • 前端工程化
  • Web服务端应用
  • Electron 跨端桌面应用

前端工程化

打包: webpack,vite,esbuild,parcel
压缩:uglifyjs
语法转化:bablejs,typescript
其他语言加入竞争:esbuild(Go实现),parcel,prisma 即使有其他语言加入但是node.js仍旧难以替代

Web服务端应用

  • 学习曲线平缓,开发效率较高 ------------------------------>通过api进行后端开发
  • 运行效率接近常见的编译语言 ------------------------------>不需要编译环境
  • 社区生态丰富及工具链成熟 (npm, v8 inspector)----------->npm富含大量的包,F12控制台。
  • 与前端结合的场景会有优势(SSR)--------------------------->服务端渲染
  • 现状: 竞争激烈,Node.js 有自己独特的优势

Electron 跨端桌面应用

商业应用:vscode,slack(办公软件),disord,zoom
大型公司内的效率工具
现状:大部扽场景在选型的时候,都值得考虑

Node.js运行时结构

image.png

  • N-API用于性能优化,有时候JS效率不高时,可能会使用N-API。
  • libuv封装操作系统API
  • nghttp2包含http2模块
  • zlib常见的压缩和解压缩算法
  • c-ares dns查询库
  • llhttp http解析
  • OpenSSL 网络层面的加密与解密工具

V8引擎:JavaScript Runtime,诊断调试工具(inspector)
node.js基于V8引擎,当node出问题时,一般需要V8团队去解决。

libuv:eventloop(事件循环),syscall(系统和调用)
封装操作系统的API,提供跨平台的操作。

ex:当用node-fetch发起请求的时候,
使用npm安装了node-fetch模块,模块安装到了用户代码中。
调用模块,模块在V8中执行,底层在Node.js Core(JavaScript)调用http模块,
http模块调用底层的C++的API,
接着调用llhttp,对HTTP协议进行序列化和反序列化。
得到的数据通过libuv创建一个TCP连接,将数据发到远端。

当拿到数据的时候就是顺序反过来。

结构运行时的特点

  • 异步IO ex:使用setTimeout设定logB后logA,实际是先logA在logB。
setTimeout(() => {
  console.log('B')
})
console.log('A')

又或者是,node.js在执行IO操作时,异步调用node进行读文件,此时还可以去做别的任务,最后接收返回的数据后在进行执行回调。

换句话说,就像小学学的最省时间分配,在煮水的过程中可以进行煎饼活动。

  • 单线程 JS线程是单线程,不适合做CPU密集的操作。node.js 12开始就支持使用worker_thread开独立线程,每个线程的模型变化不大。

JS单线程:JS线程 + uv线程池 + V8任务线程池 + V8 Inspector线程

只有主线程是单线程的。一般复杂的活动都放在uv线程池中。
优点:不用考虑多线程状态同步问题,不需要锁,同时还能比较高效的利用系统资源。
缺点:阻塞产生更多负面影响。
解决方法,多进程或者多线程。

  • 跨平台 使用node.js时,自动帮你适配如socket的服务。不需要自己去改写代码。

SSR

SSR(server side rendering)

相比传统的HTML模板引擎,能够避免重复编写代码
相比于SPA(single page application): 首屏渲染更快,SEO友好。
缺点:前端代码编写的时候要考虑服务端渲染的情况

SSR难点:

  • 需要处理打包的代码,比如一些CSS文件require('./template/xxx.css')
    打包的过程中需要跳过这部分代码,有时候甚至需要去改变打包的代码。

  • 思考前端代码在服务端运行时的逻辑 如:react中

async componentDidMount() {
  const res = await fetch('http://xxx.xxxx.xxxx')
}
  • 移除对服务端无意义的副作用,或者重置环境。

结语:

今日学习了node的直播录播,对node有了不一样的认识,特别是node运行时结构模块。在后面的编写http server模块中,由于对JS仍不太熟悉,所以其中讲述promise和其他编写的代码本文未做记录。通过这次录播,意识到了自己的短板与不足。接下来青训营结束,会好好的继续学习JS。

引用参考:
「Node.js 与前端开发实战」第五届字节跳动青训营 - 前端专场 (juejin.cn)