初始Node.js | 青训营笔记

63 阅读2分钟

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

Node.js的应用场景

  • 前端工程化。
  • web服务端应用,也就是后端服务
  • Electron应用。还包括nw.js

Node.js运行时结构

V8,libuv

V8:JavaScript Runtime,诊断调试工具

libuv:eventloop(事件循环),syscall(系统调用)

例子:用node-fetch发起请求时

特点

image-20230202212250251

异步IO

image-20230202212334825

单线程

  • JS单线程

    • 实际:JS线程+uv线程池+V8任务线程池+V8 inspector线程
  • 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源

  • 缺点:阻塞会产生更多负面影响

    解决方法:多进程或多线程

跨平台

  • 跨平台(大部分功能、api)

  • Node.js跨平台+JS无需编译环境(+web跨平台+诊断工具跨平台)

    • 开发和整体学习成本低

编写HTTP Server

hello world

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

JSON

const server = http.createServer((req,res)=>{
    const bufs=[]
    req.on('data',data=>{
        bufs.push(data)
    })
    req.on('end',()=>{
        let reqData = JSON.parse(Buffer.concat(bufs).toString())catch(err){
//receive invalid json data
}
     res.setHeader('Content-Type','application/json')
     res.end(JSON.stringify({
         echo:reqData.msg || 'hello',
     }))
    })
})
复制代码

Client

const http=require('http')
const body = JSON.stringify({ msg: 'hello from my client' })
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)
复制代码

静态文件

image-20230202215730279

延伸话题

  • node.js贡献代码

    • 好处:

      1. 从使用者角色逐步理解底层细节,可以解决更复杂的问题
      2. 自我证明
      3. 解决社区问题,促进社区发展
    • 坏处:花时间

  • 编译node.js

  • 诊断/追踪

    • 诊断是一个低频、重要同时也相当有挑战的方向。是企业衡量自己能否依赖一门语言的重要参考
  • WASM,NAPI

    • Node.js(因为V8)是执行WASM代码的天然容器,和浏览器WASM是同一运行时,同时Node.js支持 WASI。
    • NAPI执行C接口的代码(CIC++/Rust...),同时能保留原生代码的性能。
    • 不同编程语言间通信的一种方案。