Node.js基础介绍 | 青训营笔记

151 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第8天

应用场景

image.png

  • 首先要提到的是前端工程化的场景。早期 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(飞书)

运行时结构

image.png

  • V8:JavaScript Runtime,提供了诊断调试工具(Inspector)
  • libuv:eventloop,syscall(封装操作系统api,提供跨平台的IO操作)

特点

  1. 异步I/O:Nodejs执行I/O操作时,不会阻塞线程,减少了内存占用

    image.png

  2. 单线程:新版本nodejs提供多线程操作

    1. 实际:JS线程 + uv 线程池(*4,异步操作、计算密集任务) + V8任务线程池 + V8 Inspector 线程
    2. 优点:不用考虑多线程状态同步问题,也就不用考虑锁;比较高效地利用系统资源
    3. 缺点:阻塞会产生负面影响
  3. 跨平台:相同代码可以运行在不同操作系统中

    1. 大部分功能、api跨平台
    2. js无需编译环境 + Web 跨平台 + 诊断工具跨平台 = 开发成本低

实战:HTTP服务

server端

image (1).png

client端

image (2).png

静态文件服务器

image (3).png

优化方向:CDN加速 + 缓存;分布式存储;容灾处理……

SSR

服务器端渲染(Server-Side Rendering)是指由服务端完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程。

放在浏览器进行就是浏览器渲染,放在服务器进行就是服务器渲染。

  • 服务端渲染(SSR)有利于 SEO 搜索引擎优化
  • 服务端渲染(SSR)是可以被爬虫抓取到的,客户端异步渲染是很难被爬虫抓取到的
  • 服务端渲染(SSR)直接将HTML字符串传递给浏览器。大大加快了首屏加载时间。
  • 服务端渲染(SSR)占用更多的CPU和内存资源。
  • 一些常用的浏览器API可能无法正常使用。

Debug

  • V8 inspector:开箱即用、特性丰富强大、与前端开发一致、跨平台

  • 场景:

    • 查看console.log
    • breakpoint
    • 高CPU、死循环:cpuprofile
    • 高内存占用:headsnapshot
    • 性能分析

部署

  • 部署需要解决的问题:

    • 守护进程:当进程退出时,重新拉起
    • 多进程:cluster 便捷地利用多进程
    • 记录进程状态,用于诊断
  • 容器环境

    • 通常有健康检查的手段,只需考虑多核CPU利用率即可