Node.js青训营课程笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1.首先要提到的是前端工程化的场景。的能力,加速催生了这些项目的出现,早期 ajax, jquery 比较流行的时候,我们直接在页面中引入需要的 lib 即可。后续随着模块化、transpile 逐渐成熟,需求逐渐增多,对后端能力的需求也逐渐强烈,反过来说,也正是 Nodejs 赋子了js 开发者在浏览器外运行代码的能力,
2.第二个常见的场景是使用 Nodejs 开发 Web 服务端应用,也就是后端服务。这里我们特别提一下 vercel 这家公司
3.第三个是Electron 应用,这里不只是指 electron,还包括 nw.js 这个场景在较大的企业里面非常常见。
前端工程化
- Bundle: webpack, vite, esbuild, parcel
- Uglify: uglifyjs
- Transpile: bablejs, typescript
- 其他语言加入竞争:esbuild, parcel, prisma
- Nodejs现状:难以替代 BFF逻辑:谁需要接口谁开发
Nodejs运行时结构如下
- V8: JavaScript Runtime,诊断调试工具 (inspector)
- libuv: eventloop(事件循环),syscall (系统调用) (封装操作系统上的api,实现跨平台的io操作)
- 举例:用 node-fetch 发起请求时..766
Nodejs运行时
- 异步io
- 单线程 3.跨平台
JS 单线程 (实际: JS 线程 + uv 线程池 + V8 任务线程池 + V8 Inspector 线程)
优点: 不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源
缺点: 阻塞会产生更多负面影响 解决办法:多进程或多线程
跨平台 (大部分功能、api)
Node.js 跨平台 +JS 无需编译环境 (+ Web 跨平台 + 诊断工具跨平叫开发成本低)
(大部分场景无需担心跨平台问题)整体学习成本低
编写httpserver 客户端传的数据在req
listen回调:当server监听到端口之后调用
json格式先从req拿data,储存到buffers里
用try..catch处理非json格式
用 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') })
与高性能、可靠的服务相比,还差什么?
- CDN: 缓存 + 加速
- 分布式储存,容灾
外部服务: cloudflare,七牛云,阿里云,火山云...
url.parse用于用户路径的解析
stream的api与一次性全读完内存的使用率和效率更好
创建一个静态文件服务器
React SSR(server side rendering)
- 相比传统 HTML 模版引擎: 避免重复编写代码
- 相比 SPA (single page application):首屏染更快, SEO 友好
- 缺点:通常 qps 较低,前端代码编写时需要考虑服务端渲染情况
SSR 难点:
- 需要处理打包代码
- 需要思考前端代码在服务端运行时的逻辑
- 移除对服务端无意义的副作用,或重置环境