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

170 阅读2分钟

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

本堂课重点内容

本堂课重点讲述了Node.js的应用场景、Node.js运行时的结构以及如何编写Http Server。

Node.js的应用场景

“Node.js® 是一个开源、跨平台的 JavaScript 运行时环境。”它拥有全世界最大的开源库生态系统npm。

  • 前端工程化

    打包工具(webpack、vite、esbuild等);压缩工具Uglifyjs;转换器bablejs, typescript。

  • Web服务端应用

    使用nodejs可以使学习曲线更平缓,开发效率较高;具有成熟的工具链,在前端场景有自己独特的优势。

  • Electron跨端桌面应用

    如VsCode、Slack等商业应用,适合大部分场景的选型。

  • Node.js在字节内部

    Modern.js、飞书...

Node.js运行时的结构

image.png

特点:

  • 非阻塞I/O操作模型
    • 底层c/c++是多线程,为上层JS提供异步编程接口,实现CPU多核处理的优势
  • 单线程=>JS线程+uv线程池+V8任务线程池+V8Inspector线程
    • 优点:无需考虑多线程状态同步问题,能够高效地利用系统资源
    • 缺点:阻塞会产生更多负面影响;解决办法:多进程或多线程
  • 跨平台

编写Http Server

服务端渲染(SSR)的特点:

  • 避免重复编写代码
  • 相较于SPA,SSR首屏渲染更快、SEO友好
  • 缺点:通常qps较低,前端代码编写时需要考虑服务端渲染情况

案例1:写一个HelloWorld:

const http = require('http')
const port = 3000
const server = http.createServer((req, res) => {
    res.end('hello')
})
server. listen(port, () => {
    console. log('server listens on: ${port}')
})

案例2:返回一个JSON数据

const server = http.createServer(req, res) => {
const bufs = []
req.on('data', data => {
    bufs.push(data)
})
req.on('end', () => {
    let reqData = {}
    try{
        reqData = JSON.parse(Buffer.concat(bufs).toString())
    } catch (err) {
        reqData = "Error!"
    }
    res.setHeader('Content-Type', 'application/json' )
    res.end(JSON.stringify({
        echo: reqData.msg || 'Hello',
    }))
})

使用node时可以用V8 Inspector进行调试:

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

个人总结

学习nodejs有助于我们解决更复杂的功能需求,并且nodejs相对于其他后端语言学习成本更低,能够快速上手开发。