这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天,本节课老师主要是Node.js的应用场景、运行时结构、编写nodejs应用的案例和扩展话题。对于Nodejs来说,如果未来有考虑走全栈的话,可以进行深入学习,因为Nodejs这个东西老师上课也只是讲了一部分,其中还有好多的内容。当然,不管怎么样,学一学还是不错的。
Nodejs的应用场景
- 前端工程化
- Bundle: webpack, vite, esbuild, parcel
- Uglify: uglifyjs
- Transpile: babeljs, typescript
- 其他语言加入竞争:esbuild, parcel, prisma
- 现状:难以替代
- Web服务端应用
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成款 (apm, V8 inspector)
- 与前端结合的场景会有优势 (SSR)
- 现状:竞争激烈,Nodejs 有自己独特的优势
- Electron跨端桌面应用
- 商业应用:vscode, slack, discord, zoom
- 大型公司内的效率工具
- 现:大部分场景在选型时,都值得考虑
Node.js运行时结构
特点
- 异步I/O
在执行I/O操作时,会在响应后恢复操作并不会阻塞线程和占用额外内存等待。
- 单线程
优点:不用考虑多线程状态同步问题,不需要线程锁;还可以高效利用系统资源
缺点:阻塞会产生很多负面影响
- 跨平台
- 开发成本低,学习成本低
编写Http Server
目标
- 安装nodejs
- 编写http server和client,get和post请求
- 编写静态文件
- 编写react ssr服务
- 适用inspector进行调试、诊断
- 部署
安装nodejs
编写http代码
一个简单的服务端代码
const http = require('http')
const port = 3002
const server = http.createServer((req, res) => {
res.end('Hello world')
})
server.listen(port, () => {
console.log(`server listens on: ${port}`)
})
返回json代码
const http = require('http')
const server = http.createServer((req, res) => {
const bufs = []
req.on('data', (buf) => {
bufs.push(buf)
})
req.on('end', () => {
const buf = Buffer.concat(bufs).toString('utf8')
let msg = 'hello'
try {
const res = JSON.parse(buf)
msg = ret.msg
} catch (err) {
// res.end('invalid json')
}
const responseJson = {
msg: `receive: ${msg}`
}
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify(responseJson))
})
})
const port = 3000
server.listen(port, () => {
console.log('listening on: ', port)
})
client实现:
const http = require('http')
const body = JSON.stringify({ msg: 'ready!' })
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)
执行结果:
当然,我们可以使用Promise和async/await优化以上代码(主要是为了实现异步请求,防止线程阻塞)
静态文件
主要是通过Nodejs的fs模块实现,fs的几个api:
fs.readFileSync()
fs.readFile()
fs.writeFileSync()
fs.writeSync()
#### react ssr服务
这个的话用nextjs应该比较好,因为其支持ssr;
ssr的优点包括:
* 可以避免重复代码
* 首屏渲染快
#### debug工具 Inspector
输入`node --inspect`即可使用,与chrome浏览器的调试差不多。