重新认识Node.js| 青训营笔记

92 阅读4分钟

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

写在前面

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。

以一个用户视角来说,web从最早前的简单html,每一次点击按钮都会引来一次页面刷新,这些一般是早期的aspx, php, jsp,然后再到前后端泾渭分明的时代,点击按钮不一定需要刷新页面了,比如说使用ajaxjQ。到现在从node.js、npm流行后,前端工程化的时代来临。

下面将从几个方面,重温一下Node.js

从应用场景上看

Node.js及其npm生态给前端工程化增添了许多色彩,而可能很多人跟我一样,都不知道VS Code其实使用eletron写的。js写桌面跨端应用在现在随着eletron的流行,也成为了可能。就好像Android studio出现之前,使用java写安卓会搭配N多的环境变量一样。新的技术也是颠覆性的。

Screen Shot 2022-08-08 at 9.31.22 PM.png

Web服务端应用

Screen Shot 2022-08-08 at 9.38.09 PM.png 如果你是一名前端开发者,因为node.js的学习路线平稳,以及npm生态的丰富,Node.js的应用场景也会越来越多。

Electron 跨端桌面应用

对于跨端应用来说,可能之前写windows的应用需要用C#,而编写MacOS的应用可能有需要另外一套工具,但是eletron可以解决这个跨平台的问题。在笔者看来,web最大的魅力即是可以通过浏览器,实现多种系统平台的统一(所以不知道区块链NFT等衍生品提出web3是否与此有关)

Screen Shot 2022-08-08 at 9.40.11 PM.png

从运行结构看Node.js

在Node.js官方发布的信息上看,Node.js的结构和支撑平台如下面所示图

Screen Shot 2022-08-08 at 9.43.22 PM.png

结构与特点

异步单线程或许是Node.js广为人知的特点,这使得Node.js不适合用作于做CPU密集型的工作,但是这样的特点也使得其语言的效率比其他脚本语言效率更高。

Screen Shot 2022-08-08 at 9.47.27 PM.png

异步I/O

跟其他转换式的语言不同,Node.js的运行逻辑更像是声明式的,因此在异步读取文件,不需要等待文件读取完成,而是文件读取完成之后,触发事件生效后面的代码。

Screen Shot 2022-08-08 at 9.50.19 PM.png

单线程

Node.js并非是完全的单线程,比如说在调试的时候,哪怕js写了一个死循环代码,依然不影响审查元素F12进行调试,单线程的设计仍然影响着比如说Promise等js能力。

Screen Shot 2022-08-08 at 9.53.27 PM.png

跨平台

如果想把性能提升到极致,当然也需要去深究比较native的语言,去做性能优化。现在Rust标准发布之后,使得node.js的开发变得更加便利。

Screen Shot 2022-08-08 at 9.55.17 PM.png

编写Http Server

下面将从几个方面来编写有关Http Server

  1. 编写 Http Server + Client, 收发 GET、POST请求。
  2. 编写静态文件服务器
  3. 编写React SSR 服务
  4. 适用inspector 进行调试诊断
  5. 部署简介

便携一个Http Server

没有使用到express等服务框架,下面使用原生Node.js的写法写一个Http Server。

Screen Shot 2022-08-08 at 10.15.13 PM.png

Promisify

来看一个比较简单的DEMO,

async function Promisify()
{
    return await new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve("test")
        }, 1000)
    })
}



const foo = Promisify()
foo.then((res)=>{
    console.log(res)
})

这里就是将一个简单的function,Promise化,即配合await编写异步代码,当完成事件之后,即可以触发对应需要执行的代码。

便携静态文件服务器

Screen Shot 2022-08-08 at 10.35.14 PM.png

编写SSR(server side rendering)

SSR有什么特点呢?

  • 相比于传统HTML的模版引擎,避免重复编写代码
  • 相比于SPA,首屏渲染更快,SEO友好
  • 缺点:
    • 通常qps(query per second)较低,前端代码编写时需要考虑服务器渲染情况

Node.js延伸

WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.

在Node.js的后面,如果想自己动手去做出解决社区的问题,解决应用底层问题,则需要去了解WASM和Rust等Node.js的基建工程。

Screen Shot 2022-08-08 at 10.55.43 PM.png