这是我参与「第四届青训营 」笔记创作活动的第3天。
写在前面
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
以一个用户视角来说,web从最早前的简单html,每一次点击按钮都会引来一次页面刷新,这些一般是早期的aspx, php, jsp,然后再到前后端泾渭分明的时代,点击按钮不一定需要刷新页面了,比如说使用ajax、jQ。到现在从node.js、npm流行后,前端工程化的时代来临。
下面将从几个方面,重温一下Node.js
从应用场景上看
Node.js及其npm生态给前端工程化增添了许多色彩,而可能很多人跟我一样,都不知道VS Code其实使用eletron写的。js写桌面跨端应用在现在随着eletron的流行,也成为了可能。就好像Android studio出现之前,使用java写安卓会搭配N多的环境变量一样。新的技术也是颠覆性的。
Web服务端应用
如果你是一名前端开发者,因为node.js的学习路线平稳,以及npm生态的丰富,Node.js的应用场景也会越来越多。
Electron 跨端桌面应用
对于跨端应用来说,可能之前写windows的应用需要用C#,而编写MacOS的应用可能有需要另外一套工具,但是eletron可以解决这个跨平台的问题。在笔者看来,web最大的魅力即是可以通过浏览器,实现多种系统平台的统一(所以不知道区块链NFT等衍生品提出web3是否与此有关)
从运行结构看Node.js
在Node.js官方发布的信息上看,Node.js的结构和支撑平台如下面所示图
结构与特点
异步、单线程或许是Node.js广为人知的特点,这使得Node.js不适合用作于做CPU密集型的工作,但是这样的特点也使得其语言的效率比其他脚本语言效率更高。
异步I/O
跟其他转换式的语言不同,Node.js的运行逻辑更像是声明式的,因此在异步读取文件,不需要等待文件读取完成,而是文件读取完成之后,触发事件生效后面的代码。
单线程
Node.js并非是完全的单线程,比如说在调试的时候,哪怕js写了一个死循环代码,依然不影响审查元素F12进行调试,单线程的设计仍然影响着比如说Promise等js能力。
跨平台
如果想把性能提升到极致,当然也需要去深究比较native的语言,去做性能优化。现在Rust标准发布之后,使得node.js的开发变得更加便利。
编写Http Server
下面将从几个方面来编写有关Http Server
- 编写 Http Server + Client, 收发 GET、POST请求。
- 编写静态文件服务器
- 编写React SSR 服务
- 适用inspector 进行调试诊断
- 部署简介
便携一个Http Server
没有使用到express等服务框架,下面使用原生Node.js的写法写一个Http Server。
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编写异步代码,当完成事件之后,即可以触发对应需要执行的代码。
便携静态文件服务器
编写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的基建工程。