这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天,主要学习了Node.js的应用场景、运行结构、HTTP Server和相关内容。
Node.js应用场景
Node.js的应用场景有以下方面
- 前端工程化:虽然说现在有很多的工具可以实现工程化,但是Node.js给前端的开发者更好的体验,学习成本更低。
- Web服务端应用:一般来说服务端会是后端开发者实现,但是Node.js也为前端开发者提供了实现Web服务端的功能,与前端结合的场景会更具优势(如:SSR——服务器端渲染)
- Electron跨端桌面应用:同时提供了跨端桌面的应用,像:vscoed,slack,discord,zoom
Node.js运行时结构
Node.js特点
- 异步 I/O——异步I/O操作完后会响应返回后恢复的事件,不会阻塞线程和占用额外内存,相对来说提高了效率。
//结果打印是AB
let temp = () => {
setTimeout(() => {
console.log("B");
})
}
temp()
console.log("A");
- 单线程——JS单线程实际上是:JS线程+uv线程池+V8任务线程池+V8 Inspector线程
- 优点:不用考虑多线程状态同步问题,较高效的利用资源。
- 缺点:阻塞会产生更多影响
- 解决方法:多进程和多线程
function fibonacci(num: number): number {
if (num === 1 || num === 2) {
return 1
}
return fibonacci(num - 1) + fibonacci(num - 2)
}
fibonacci(12)
fibonacci(13)
//结果:144 233
- 跨平台——Node.js跨平台+JS无需编译环境(+Web跨平台+诊断工具跨平台)
优势:①整体学习成本低;②开发成本低。
编写HTTP Server
Node.js可以让前端开发者也能搭建Web服务。Node.js有很多自带的模块,像:http模块、fs模块等,也有其他的需要安装的模块,像:mysql、express等。需要安装的模块需要使用到npm命令去下载,提供了比较好的开发体验。
HTTP Server
const http = require('http');
http.createServer((req, res) => {
const { headers = {} } = req
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' })
if (headers.token) {
res.end(JSON.stringify({ code: 0, message: "成功", data: [] }))
} else {
res.end(JSON.stringify({ code: -1, message: "没有权限" }))
}
}).listen('8080', () => {
console.log('服务器监听8080端口');
})
HTTP Client
const http = require('http');
const options = {
host: 'localhost',
port: '3030',
path: '/'
}
const callback = (res) => {
let str = '';
res.on('data', (chunk) => {
str += chunk
})
res.on('end', () => {
console.log(str);
})
}
//发送请求
http.request(options, callback).end()
托管静态资源
const http = require('http')
const fs=require('fs')
const url=require('url')
const path=require('path')
const port=3030
server=http.createServer((req,res)=>{
const info =url.parse(req.url)
const file=fs.createReadStream(path.resolve(__dirname,'.'+info.pathname))
file.pipe(res)
}).listen(port,()=>{
console.log
HTTP SSR
SSR难点
总结
Node.js目前地位是难以替代的,足以说明在开发中node.js有足够的优势,像文章中提到的异步I/O、Web服务应用和跨端桌面应用等。在后续的学习中还需要不断的实践提升自己。