这是我参与「第四届青训营 」笔记创作活动的的第5天
Node.js简介
Node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。
Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。
Node.js优点
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成熟(npm, v8 inspector)
- 与前端结合的场景会有优势(SSR)
- 现状:竞争激烈,Node.js有自己独特的优势
Node.js特点
异步I/O
参见下面代码:先正常执行第二个log语句,当时间超时后,才会回调箭头函数,执行第一个log语句。
setTimeout(() => {
console.log('B')
})
console.log('A')
单线程
Node.js的JavaScript是单线程的。由于单线程的特性,Node.js不适合做CPU密集的操作。
Node.js 12 引入了worker_thread的概念。worker_thread可以起独立线程,但每个线程的模型没有太大变化。
function fibonacci (num: number): number {
if (num === 1 || num === 2) {
return 1
}
return fibonacci(num - 1) + fibonacci(num - 2)
}
fibonacci(42)
fibonacci(43)
跨平台
下面的代码若在Linux上运行,则调用UNIX Domain SOCKET;若在Windows上运行,则调用其他的socket。跨平台的特性屏蔽了一些底层实现的细节。
const net = require('net')
const socket = new net.Socket('/tmp/scoket.sock'
HTTP Server简单demo
第一版
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}`)
})
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: reqData.msg || "Hello",
}))
})
})
效果图如下:
改进
用Promise + async await重写这两个例子
技巧:将callback转换成promise
function wait (t) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, t)
})
}
wait(1000).then(() => { console.log('get called') })
部署问题
部署要解决的问题
- 守护进程:当进程退出时,重新拉起
- 多进程:cluster便捷地利用多进程
- 记录进程状态,用于诊断
容器环境
- 通常有健康检查的手段,只需考虑多核cpu利用率即可