Node.js开发实战| 青训营笔记

67 阅读3分钟

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

前言

这门课程讲述了Node.js的应用场景、运行时的结构和编写Http Server,对于我来说也是一次很好的学习拓展。


Node.js的应用场景

前端工程化

  • Bundle:webpack,vite,esbuild,parcel
  • 0
  • Uglify:uglifyjs
  • Transpile:bablejs,typescript
  • 其他语言加入竞争:esbuild,.parcel,prisma
  • 现状:难以替代

Web服务端应用

  • 学习曲线平缓,开发效率较高
  • 运行效率接近常见的编译语言
  • 社区生态丰富及工具链成熟(npm,V8 inspector))
  • 与前端结合的场景会有优势(SS)
  • 现状:竞争激烈,Node.js有自己独特的优势

Electron跨增某面应用

  • 商业应用:vscode,slack,discord,zoom
  • 大型公司内的效率工具
  • 现状:大部分场景在选型时,都值得考虑

运行时的结构

异步

当Node.js执行VO操作时,会在响应返回后恢复操作,而不是阻塞线程 并占用额外内存等待

单线程

  • JS单线程
  • 实际:JS线程+uV线程池+V8任务线程池+V8 Inspector线程
  • 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比
  • 较高效地利用系统资源;
  • 缺点:阻塞会产生更多负面影响
  • 解决办法:多进程或多线程

跨平台

  • 跨平台(大部分功能、api)
  • Node.js跨平台+JS无需编译环境(+Web跨平台+诊断工具跨平台)
  • =开发成本低(大部分场景无需担心跨平台问题),整体学习成本低

编写Http Server

Hello world

const http require('http')
const port 3000
const server http.createserver((req,res)={
res.end('hello')
})
server.listen(port,()=
console.Log('server listens on:s{port)')
)

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

技巧:将callback转换成promise

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

编写一个简单的静态文件服务:

const http require('http')
const fs require('fs')
const path require('path')
const url=require('url')
const port 3000
const server http.createserver((req,res)={
const info url.parse(req.url)
const file fs.createReadstream(path.resolve(_dirname,'.'+info.pathname))
file.pipe(res)
server.Listen(port,()=>
console.log('server listens on:s(port)')
  • 与高性能、可靠的服务相比,还差什么?
  • 外部服务:coud州are,七牛云,阿里云,火山云....
  1. CDN:缓存+加速
  2. 分布式储存,容灾

React SSR

SSR(server side rendering)有什么特点?

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

替换成React:

SSR难点

  1. 需要处理打包代码
1   require('./static/style.css')
  1. 需要思考前端代码在服务端运行时的逻辑
2    async componentDidMount(){
3    const res await fetch('http://my.server.domain')
  1. 移除对服务端无意义的副作用,或重置环境

Debug

V8 Inspector::开箱即用、特性丰富强大、与前端开发一致、跨平 台

场景:

  • 查看console.log内容
  • breakpoint
  • 高CPU、死循环:cpuprofile
  • 高内存占用:heapsnapshot
  • 性能分析

部署

部署要解决的问题

  • 守护进程:当进程退出时,重新拉起
  • 多进程:cluster便捷地利用多进程
  • 记录进程状态,用于诊断

容器环境

  • 通常有健康检查的手段,只需考虑多核cpu利用率即可

总结

node.js发展至今已经很完善,也有很大的优势,现在我们在学习前端的同时,也要接触服务端的知识,在对于前端优化性能有很大的帮助,这节课学到了很多,如果有问题请多多指教。