这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天。
Node.js的应用场景
- 前端工程化。
- web服务端应用,也就是后端服务
- Electron应用。还包括nw.js
Node.js运行时结构
V8,libuv
V8:JavaScript Runtime,诊断调试工具
libuv:eventloop(事件循环),syscall(系统调用)
例子:用node-fetch发起请求时
特点
异步IO
单线程
-
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:${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)
复制代码
静态文件
延伸话题
-
node.js贡献代码
-
好处:
- 从使用者角色逐步理解底层细节,可以解决更复杂的问题
- 自我证明
- 解决社区问题,促进社区发展
-
坏处:花时间
-
-
编译node.js
-
诊断/追踪
- 诊断是一个低频、重要同时也相当有挑战的方向。是企业衡量自己能否依赖一门语言的重要参考
-
WASM,NAPI
- Node.js(因为V8)是执行WASM代码的天然容器,和浏览器WASM是同一运行时,同时Node.js支持 WASI。
- NAPI执行C接口的代码(CIC++/Rust...),同时能保留原生代码的性能。
- 不同编程语言间通信的一种方案。