[ Node.js | 青训营笔记]

61 阅读3分钟

Node.js青训营课程笔记

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

1.首先要提到的是前端工程化的场景。的能力,加速催生了这些项目的出现,早期 ajax, jquery 比较流行的时候,我们直接在页面中引入需要的 lib 即可。后续随着模块化、transpile 逐渐成熟,需求逐渐增多,对后端能力的需求也逐渐强烈,反过来说,也正是 Nodejs 赋子了js 开发者在浏览器外运行代码的能力,

2.第二个常见的场景是使用 Nodejs 开发 Web 服务端应用,也就是后端服务。这里我们特别提一下 vercel 这家公司

3.第三个是Electron 应用,这里不只是指 electron,还包括 nw.js 这个场景在较大的企业里面非常常见。

image.png

前端工程化

  • Bundle: webpack, vite, esbuild, parcel
  • Uglify: uglifyjs
  • Transpile: bablejs, typescript
  • 其他语言加入竞争:esbuild, parcel, prisma
  • Nodejs现状:难以替代 BFF逻辑:谁需要接口谁开发 image.png Nodejs运行时结构如下

image.png

  • V8: JavaScript Runtime,诊断调试工具 (inspector)
  • libuv: eventloop(事件循环),syscall (系统调用) (封装操作系统上的api,实现跨平台的io操作)
  • 举例:用 node-fetch 发起请求时..766

Nodejs运行时

  1. 异步io
  2. 单线程 3.跨平台

JS 单线程 (实际: JS 线程 + uv 线程池 + V8 任务线程池 + V8 Inspector 线程)

优点: 不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源

缺点: 阻塞会产生更多负面影响 解决办法:多进程或多线程

跨平台 (大部分功能、api)

Node.js 跨平台 +JS 无需编译环境 (+ Web 跨平台 + 诊断工具跨平叫开发成本低)

(大部分场景无需担心跨平台问题)整体学习成本低

编写httpserver 客户端传的数据在req

listen回调:当server监听到端口之后调用

json格式先从req拿data,储存到buffers里

用try..catch处理非json格式

image.png

image.png

用 Promise + async await 重写这两个例子 (why)

技巧: 将 callback 转成 promise

promise只适合回调一次的函数

function wait(t) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve()
        },t)
    })
}
wait(1000).then(() => { console.log( get called') })

与高性能、可靠的服务相比,还差什么?

  1. CDN: 缓存 + 加速
  2. 分布式储存,容灾

外部服务: cloudflare,七牛云,阿里云,火山云...

url.parse用于用户路径的解析

stream的api与一次性全读完内存的使用率和效率更好

创建一个静态文件服务器

image.png

React SSR(server side rendering)

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

SSR 难点:

  1. 需要处理打包代码
  2. 需要思考前端代码在服务端运行时的逻辑
  3. 移除对服务端无意义的副作用,或重置环境

image.png