Node.js的学习|青训营笔记

57 阅读2分钟

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

Node.js学习记录

Node.js的应用场景

  1. Web服务端应用
  2. Electron跨端桌面应用
  3. 前端工程化的工具的使用

node.js在Web服务器应用开发的优点

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

Electron 跨端桌面应用

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

Node.js运行时的结构

image.png

  • V8:JavaScript Runtime,诊断调试工具(inspector)
  • libuv: eventloop(事件循环),syscall(系统调用)

运行时的特点

1. 异步I/O

setTimeout(() =>{
    console.log('8')
})
console.log('A')

通常代码都是这样写是想着先输出B,在输出A,但异步是指setTimeout还没有运行的情况下,可以直接输出A。
当 Node.js 执行 /O 操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待。

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

3. 跨平台
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:' , port)
})

运行结果

image.png

返回JSON

const http=require('http')
const port=3000
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){
            //receive invalid json data
        }
        res.setHeader('Content-Type', 'application/json')
        res.end(JSON.stringify({
            echo:reData.msg||'Hello',
        }))
    })
})
server.listen(port, ()=>{
    console.log('server listens on:' , port)
})

运行结果

image.png

总结

引用