Node.js学习笔记 | 青训营笔记

40 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天,主要学习了Node.js的应用场景、运行结构、HTTP Server和相关内容。

Node.js应用场景

Node.js的应用场景有以下方面

  • 前端工程化:虽然说现在有很多的工具可以实现工程化,但是Node.js给前端的开发者更好的体验,学习成本更低。
  • Web服务端应用:一般来说服务端会是后端开发者实现,但是Node.js也为前端开发者提供了实现Web服务端的功能,与前端结合的场景会更具优势(如:SSR——服务器端渲染)
  • Electron跨端桌面应用:同时提供了跨端桌面的应用,像:vscoed,slack,discord,zoom

Node.js运行时结构

image.png

Node.js特点
  • 异步 I/O——异步I/O操作完后会响应返回后恢复的事件,不会阻塞线程和占用额外内存,相对来说提高了效率。
//结果打印是AB
let temp = () => {
    setTimeout(() => {
        console.log("B");
    })
}
temp()
console.log("A");
  • 单线程——JS单线程实际上是:JS线程+uv线程池+V8任务线程池+V8 Inspector线程
  1. 优点:不用考虑多线程状态同步问题,较高效的利用资源。
  2. 缺点:阻塞会产生更多影响
  3. 解决方法:多进程多线程
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

image.png

SSR难点

image.png

总结

Node.js目前地位是难以替代的,足以说明在开发中node.js有足够的优势,像文章中提到的异步I/O、Web服务应用和跨端桌面应用等。在后续的学习中还需要不断的实践提升自己。