Node.js 与前端开发实战 | 青训营笔记

37 阅读3分钟

image.png

这是我参与「第四届青训营 」笔记创作活动的第5天

Node.js

初始Node.js

js可以在浏览器中执行

image-20220510111958187.png js可以操作DOM和BOM

image-20220510112058200.png 浏览器中的JS运行环境

image-20220510112421778.png Node.js是一个基于Chrome V8 引擎的 JavaScript运行环境

  • Node.js中的JS的运行环境

  • 浏览器是JS的前端运行环境

  • Node.js是JS的后端运行环境

  • Node.js中无法调用DOM和BOM等浏览器内置AO

Node.js的应用场景

  • 前端工程化
    • Bundle: webpack, vite, esbuild, parcel
    • Uglify: uglifyjs
    • Transpile: bablejs,typescript
    • 其他语言加入竞争:esbuild, parcel, prisma
    • 现状:难以替代
  • Web服务端应用
    • 学习曲线平缓,开发效率较高
    • 运行效率接近常见的编译语言
    • 社区生态丰富及工具链成熟(npm, V8 inspector)
    • 与前端结合的场景会有优势(SSR)
    • 现状:竞争激烈,Node.js有自己独特的优势
  • Electron 跨端桌面应用
    • 商业应用:vscode, slack, discord, zoom
    • 大型公司内的效率工具
    • 现状:大部分场景在选型时,都值得考虑

Node.js的用途

  • 基于Express框架,可以快速构建Web应用
  • 基于Electron框架,可以构建跨平台的桌面应用
  • 基于restify框架,可以快速构建API接口项目
  • 读写和操作数据库,创建使用的命令行工具辅助前端开发,etc

Node.js运行时结构

image.png

  • V8: JavaScript Runtime,诊断调试工具(inspector)
  • libuv: eventloop (事件循环),syscall(系统调用)
  • 举例:用node-fetch 发起请求时…

特点

  1. 异步I/O
    • 当Node.js 执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待
  2. 单线程
    • JS单线程 实际:JS线程+uv线程池 +V8任务线程池 +V8 Inspector线程
    • 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源;
    • 缺点:阻塞会产生更多负面影响·解决办法:多进程或多线程
  3. 跨平台
    • 跨平台(大部分功能、api)
    • Node.js 跨平台+JS无需编译环境(+ Web跨平台+诊断工具跨平台)
      • 开发成本低(大部分场景无需担心跨平台问题),整体学习成本低

HTTP模块

在网络节点中,负责消费资源的电脑----客户端

负责对外提供网络资源的---服务器

http模块是node.js提供,用来创建web服务器的模块,通过http模块提供的http.createServer()方法,创建一台web服务器

通过IIS,Apache等Web服务器软件,可以使电脑变成服务器

在Node.js中通过http模块,手写服务器软件

创建

const http = require('http');
const server = http.createServer();
server.on('request',function (req,res) {
    console.log('Someone visit web server');
})

server.listen(88,function () {
    console.log('server running at http://127.0.0.1:88')
})

req

const http = require('http');
const server = http.createServer();
server.on('request',(req,res) => {
   //req.url是客户端请求的url地址
   const url = req.url;
   const method = req.method;

   const str = `Your request url is ${url},and request method is ${method}`
    console.log(str);
   res.end(str);    
})

server.listen(88,() => {
    console.log('server running at http:127.0.0.1:88')
})

url

const http = require('http');
const fs = require('fs');
const server = http.createServer();

server.on('request',(req, res) => {
    const url = req.url;
    
    let default1 = '404 not found!'

    if(url === '/' || url === '/index.html'){
        default1 = '<h1>首页</h1>'
    }else if(url === '/about.html'){
        default1 = '<h1>关于页面</h1>'
    }
    res.setHeader('Content-Type','text/html;charset=utf-8')
    res.end(default1)
})

server.listen(88,() => {
    console.log('server running at https://127.0.0.1:88');
})

总结

本文主要简述了nodejs的基本概念及应用场景和用途,同时简单的介绍了node中的http模块,并附上代码