这是我参与「第五届青训营」伴学笔记创作活动的第 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运行时的结构
特点:
- 非阻塞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相对于其他后端语言学习成本更低,能够快速上手开发。