Nodejs与前端开发实战 | 青训营笔记

63 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天,本节课老师主要是Node.js的应用场景、运行时结构、编写nodejs应用的案例和扩展话题。对于Nodejs来说,如果未来有考虑走全栈的话,可以进行深入学习,因为Nodejs这个东西老师上课也只是讲了一部分,其中还有好多的内容。当然,不管怎么样,学一学还是不错的。

Nodejs的应用场景

  1. 前端工程化
  • Bundle: webpack, vite, esbuild, parcel
  • Uglify: uglifyjs
  • Transpile: babeljs, typescript
  • 其他语言加入竞争:esbuild, parcel, prisma
  • 现状:难以替代
  1. Web服务端应用
  • 学习曲线平缓,开发效率较高
  • 运行效率接近常见的编译语言
  • 社区生态丰富及工具链成款 (apm, V8 inspector)
  • 与前端结合的场景会有优势 (SSR)
  • 现状:竞争激烈,Nodejs 有自己独特的优势
  1. Electron跨端桌面应用
  • 商业应用:vscode, slack, discord, zoom
  • 大型公司内的效率工具
  • 现:大部分场景在选型时,都值得考虑

Node.js运行时结构

nodejs.png

特点

  1. 异步I/O

​ 在执行I/O操作时,会在响应后恢复操作并不会阻塞线程和占用额外内存等待。

  1. 单线程

​ 优点:不用考虑多线程状态同步问题,不需要线程锁;还可以高效利用系统资源

​ 缺点:阻塞会产生很多负面影响

  1. 跨平台
  • 开发成本低,学习成本低

编写Http Server

目标

  1. 安装nodejs
  2. 编写http server和client,get和post请求
  3. 编写静态文件
  4. 编写react ssr服务
  5. 适用inspector进行调试、诊断
  6. 部署

安装nodejs

nvm

编写http代码

一个简单的服务端代码

const http  = require('http')
const port = 3002

const server = http.createServer((req, res) => {
  res.end('Hello world')
})

server.listen(port, () => {
  console.log(`server listens on: ${port}`)
})

返回json代码

const http = require('http')

const server = http.createServer((req, res) => {
  const bufs = []
  req.on('data', (buf) => {
    bufs.push(buf)
  })
  req.on('end', () => {
    const buf = Buffer.concat(bufs).toString('utf8')
    let msg = 'hello'
    try {
      const res = JSON.parse(buf)
      msg = ret.msg
    } catch (err) {
      // res.end('invalid json')
    }

    const responseJson = {
      msg: `receive: ${msg}`
    }
    res.setHeader('Content-Type', 'application/json')
    res.end(JSON.stringify(responseJson))
  })
})

const port = 3000

server.listen(port, () => {
  console.log('listening on: ', port)
})

client实现:

const http = require('http')

const body = JSON.stringify({ msg: 'ready!' })

const req = http.request('http://127.0.0.1:3000', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': body.length,
  },
}, res => {
  const bufs = []
  res.on('data', data => {
    bufs.push(data)
  })
  res.on('end', () => {
    const receive = JSON.parse(Buffer.concat(bufs).toString())
    console.log('receive:', receive)
  })
})

req.end(body)

执行结果:

iShot_2023-02-07_21.51.01.png

当然,我们可以使用Promise和async/await优化以上代码(主要是为了实现异步请求,防止线程阻塞)

静态文件

主要是通过Nodejs的fs模块实现,fs的几个api:

fs.readFileSync()
fs.readFile()
fs.writeFileSync()
fs.writeSync()

#### react ssr服务
这个的话用nextjs应该比较好,因为其支持ssr;
ssr的优点包括:
* 可以避免重复代码
* 首屏渲染快

#### debug工具 Inspector
输入`node --inspect`即可使用,与chrome浏览器的调试差不多。