这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
Node.js学习记录
Node.js的应用场景
- Web服务端应用
- Electron跨端桌面应用
- 前端工程化的工具的使用
node.js在Web服务器应用开发的优点
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成熟 (npm, V8 inspector)
- 与前端结合的场景会有优势 (SSR服务端渲染)
- 现状: 竞争激烈,Node.is 有自己独特的优势
Electron 跨端桌面应用
- 商业应用: vscode, slack, discord, zoom
- 大型公司内的效率工具
- 现状:大部分场景在选型时,:都值得考虑
Node.js运行时的结构
- 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)
})
运行结果
返回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)
})
运行结果