Node.js | 青训营笔记

32 阅读11分钟

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

Node.js 与前端开发实战.pptx

Node.js应用场景

  • 首先要提到的是前端工程化的场景。早期 alax,jquery 比较流行的时候,我们直接在页面中引入需要的 lb即可。考虑浏览器兼容性。后续随着模块化、transpile 逐渐成熟、需求逐渐增多,对后端能力的需求也逐渐强烈。反过来说,也正是 Node js赋予了js开发者在浏览器外运行代码的能力,加速催生了这些项目的出现。
  • 第二个常见的场景是使用 Node.js 开发 Web服务端应用,也就是后端服务。
  • 最后要再说下 Electron 应用,这里不只是指 electron,还包括 nw.js.;这个场景在较大的企业里面非常常见。

bundle:Bundle 指的是将多个 JavaScript 或 CSS 文件打包成一个或多个文件的过程。这个过程可以通过 Webpack、Parcel 等工具来实现。打包的好处在于减少了 HTTP 请求的次数,提高了页面的加载速度,也可以利用浏览器的缓存机制来避免重复加载资源。

uglify:指通过压缩、混淆等手段,减少 JavaScript 或 CSS 文件的大小。这个过程可以通过 UglifyJS、Terser 等工具来实现。压缩可以通过删除注释、空格等无关紧要的内容来减小文件的体积,混淆则是将变量名、函数名等重命名为无意义的字符,使得代码难以被人理解和修改。通过 Uglify 可以进一步减少文件的大小,提高页面的加载速度。

transpire:语法转化

npm (Node Package Manager) 是一个 JavaScript 包管理器,用于管理 JavaScript 项目的依赖关系和发布包。它是随着 Node.js 被广泛推广而出现的。

npm 用于管理项目依赖关系,可以自动下载和安装依赖包,并管理依赖关系的版本。它还提供了一个发布和共享代码的平台,开发者可以发布自己的包,也可以从 npm 仓库中下载别人发布的包。

npm 现在是 JavaScript 社区中最流行的包管理工具,它有大量的包可供选择,涵盖了各种各样的功能,包括前端框架、工具库、任务管理工具等等。使用 npm 可以大大简化项目的开发和维护过程,提高生产力。

SSR :服务端渲染

"SSR" 是 Server Side Rendering 的缩写,是一种前端开发技术。它的基本思想是在服务器端渲染出页面的 HTML 结构,再通过客户端 JavaScript 动态更新内容。

传统的前端开发方式是在客户端渲染页面,而 SSR 技术则是在服务器端完成渲染,再将渲染后的 HTML 结构发送到客户端。

使用 SSR 的主要优点是:

  • 提高首屏加载速度:因为服务器端渲染出了 HTML 结构,所以客户端不需要等待 JavaScript 代码加载完成后再渲染页面,提高了首屏加载速度。
  • 更好的 SEO 效果:因为搜索引擎爬虫不能执行 JavaScript 代码,所以使用传统前端开发方式渲染的页面对搜索引擎不友好,使用 SSR 可以解决这个问题。

但是,使用 SSR 也存在一些问题:

  • 服务器资源占用增加:因为服务器需要计算渲染页面的 HTML 结构,所以需要更多的服务器资源。
  • 更多的开发复杂度:实现 SSR 需要对服务器端代码进行开发,并且需要考虑客户端和服务器端渲染的同步问题,

BFF:谁要接口,谁去开发

BFF 是 "Backend For Frontend" 的缩写,是一种软件架构模式。在微服务架构中,后端服务可以分为多个独立的服务,每个服务都有自己的数据和业务逻辑。BFF 是为了前端而设计的后端服务,它的目的是将后端服务的数据和业务逻辑组织成适合前端使用的格式。

BFF 的优点在于:

  • 减少前端与后端的耦合:BFF 提供了一个单独的接口,可以将前端与后端服务的耦合降到最低。
  • 提高前端开发效率:BFF 可以统一管理后端服务的数据和业务逻辑,使得前端开发人员不必再了解后端服务的具体实现。
  • 提高代码复用:BFF 可以对后端服务的数据和业务逻辑进行组织,提高代码复用率。

总之,BFF 是一种非常有用的软件架构模式,可以提高前后端协作的效率,并帮助开发人员更好地管理后端服务。

Node.js 运行时结构

libuv 是 Node.js 中用于实现异步 I/O 的库。它是一个跨平台的 C 语言库,提供了统一的 API 来实现异步 I/O 操作,包括文件 I/O、网络 I/O 和定时器。

在 Node.js 中,libuv 负责实现事件循环,将异步操作与回调函数关联起来。当异步操作完成时,libuv 将调用相应的回调函数。这使得开发人员不必处理复杂的线程同步问题,只需要关注如何处理每个异步事件的结果即可。

总的来说,libuv 是 Node.js 中异步 I/O 的关键组件,它使得 Node.js 拥有了高效和可靠的异步 I/O 支持,进而提高了 Node.js 的性能和扩展性。

用node-fetch发起请求

使用npm安装,之后到了用户代码模块,调用node-fetch,因为是JS代码,所以会到V8里去执行

调用Node.js Core里的JavaScript模块,再调用C++的API,再是llhttp,http协议的序列化,得到数据再调用libuv,创建TCP链接,传给远端

Node.js 只有一个 JavaScript 解释线程,所有的 JavaScript 代码都在这个线程上执行。

这种单线程模型有如下特点:

  • 单线程运行 JavaScript 代码:Node.js 中所有的 JavaScript 代码都在一个线程上执行,不存在多个线程同时运行 JavaScript 代码的情况。
  • 异步 I/O 操作:Node.js 通过异步 I/O 操作来避免阻塞 JavaScript 代码的执行,提高程序的效率。
  • 事件循环:Node.js 使用事件循环来处理异步 I/O 操作的结果,每个异步 I/O 操作完成后,都会触发一个事件,Node.js 会在事件循环中处理这些事件。

因为 Node.js 的 JavaScript 代码是单线程执行的,所以不存在线程同步问题,这大大简化了程序的开发和维护。但是,这也带来了一些问题,例如长时间运行的 JavaScript 代码可能会阻塞整个程序,因此需要注意代码的优化。

work_thread可以独立线程

实际上是JS单线程,还有其他线程,libuv是OI,加密解密啥的的操作

编写HTTP Server

回掉函数 每次有请求,就会被触发

  • 客户端数据都存在req上
  • res数据写回另一端

上面两个例子使用了回调函数

"promisify" 是一种在 Node.js 中将回调风格的 API 转换为 Promise 风格 API 的技术。

在 Node.js 中,许多核心 API 和第三方库都使用回调函数作为异步操作的处理方式。回调函数需要在异步操作完成后执行,并通过回调函数的参数接收异步操作的结果。

但是,使用回调函数的代码经常很难阅读和维护,因此引入了 Promise 概念。Promise 是一种对异步操作结果进行封装的对象,可以使用 then() 方法注册回调函数,并在异步操作完成后自动调用

"promisify" 函数可以将回调风格的 API 转换为 Promise 风格 API,使得代码更加简洁易读。通过使用 "promisify" 函数,可以将回调函数的代码转换为 Promise 的代码,从而获得更加优美的代码结构和更好的错误处理能力。

以下是一些不适合使用 "promisify" 转换的回调函数的情况:

  • 多次调用回调函数:如果回调函数会被多次调用,则不适合使用 "promisify" 转换。因为 Promise 只能在异步操作完成后调用一次 then() 方法。

  • 带有额外参数的回调函数:如果回调函数需要额外的参数,则不适合使用 "promisify" 转换。因为 Promise 的 then() 方法只能接收一个参数,无法接收额外的参数。

  • 使用进程级别的回调函数:如果回调函数是用于进程级别的,则不适合使用 "promisify" 转换。因为 Promise 只是 JavaScript 中的一种异步操作处理方式,不能跨越进程边界。

dirname就是当前文件在的位置

parse是解析,把一些不需要的去掉

stream风格的API 内存使用率更好

SPA 指的是单页面应用(Single-Page Application)。它是一种现代 Web 应用开发技术,其中整个应用都在一个 HTML 页面内运行,在用户导航到不同的页面时,通过 JavaScript 动态更新页面内容,而不是通过向服务器请求新的页面。

与传统的多页面 Web 应用相比,单页面应用具有较快的响应速度和更好的用户体验,因为它不需要在页面间进行频繁的重新加载。单页面应用通常使用 JavaScript 框架,如 React、Angular、Vue 等,以提高开发效率和组织代码。

单页面应用非常适合于涉及大量数据交互的应用,如购物车、用户管理系统、在线编辑器等。它可以通过使用 API 与服务器进行通信,来实现与服务器端的数据交互。

SEO是搜索引擎优化的缩写,是一种通过提高网站的内容和结构的可访问性,以及通过提高网站的排名和可见性,从而提高网站的流量和曝光率的技术。

SEO的目的是使网站在搜索引擎的结果页面(SERP)中的排名更靠前,以便更多的用户可以找到网站。它包括了一系列技术和策略,如关键字研究、内容优化、链接建设、网站结构优化等,旨在帮助网站在搜索引擎结果页面中获得更高的排名。

通过使用 SEO 技术和策略,网站可以获得更多的目标流量,从而提高网站的知名度和可见性,并且可以提高网站的业务收益。

QPS 是 Queries Per Second 的缩写,是指每秒执行的查询次数。它是一个度量 Web 应用程序、数据库、搜索引擎等系统性能的常用指标。

通过测量系统的 QPS,可以评估系统的处理能力,并且可以评估系统在高流量环境下的性能。如果系统的 QPS 达到了其处理能力的极限,那么可能需要对系统进行扩容或者优化,以保证系统的稳定性和可用性。

react的应用生成的代码,渲染成最原始的html标签

React 服务端渲染(SSR)需要考虑移除对服务端无意义的副作用,是因为服务端渲染和客户端渲染的环境有很大的差异。

服务端渲染的目的是在服务端生成 HTML 页面,然后直接发送给浏览器,以便快速显示页面内容。而客户端渲染则是通过浏览器端的 JavaScript 动态渲染页面。因此,在服务端渲染的过程中,需要考虑移除对服务端无意义的副作用,以避免不必要的性能开销和错误。

一些对服务端无意义的副作用可能包括:

  • 对浏览器的 DOM 操作,因为服务端不存在浏览器环境
  • 访问浏览器的 API,如 window、document 等
  • 对客户端状态的修改,如 localStorage、sessionStorage 等

通过移除对服务端无意义的副作用,可以提高服务端渲染的效率,并且可以避免因为副作用导致的错误。

拉数据的操作需要在react生命周期后,避免服务端渲染的时候操作到

断点就是正常的断点

scope是上下文

行数,点击右键:logpoint

相当于插入一个log,可以log一些东西

记录CPU运行情况

看死循环在执行什么代码

性能分析

延伸话题

github.com/joyeecheung…

暂时无法在飞书文档外展示此内容

github.com/nodejs/node…