Node.Js基础知识
创始人
2024-03-15 11:45:37

Node.Js架构Node.Js架构

Natives modules

  • 当前层内容由JS实现
  • 提供 应用程序可直接调用库,例如:fs、path、 http等
  • JS语言无法直接操作底层硬件设置(–》Builtin modules 胶水层)

Builtin modules 胶水层

  • 在V8引擎下,主要是帮助我们调用一些c/c++的功能,比如:socket\http 等

具体功能模块

V8

  • 提供初始化工作,创建执行上下文环境和作用域
  • 执行JS代码(自己的代码、内置代码、第三方代码),提供桥梁接口(我们调用的函数可能是c/c++实现,主要js与c/c++的转换功能)

libuv

  • 事件循环、事件队列、异步IO

第三方模块:c-ares(DNS)、http(parse)、zlib

数据流程

数据流程
主流后端语言处理多任务的时候,通常是开多线程。但是当任务量比较少时,线程就会浪费(服务员例子)。因此出现了 Reactor模式(应答者模式),单线程完成多线程工作。可以避免多个线程在上下文切换过程中考虑的状态保存、时间消耗、状态锁。
请添加图片描述
因此:NodeJS 更适合用于IO密集型高并发请求

NodeJS异步IO

同步时间:= 任务一 + 任务二
异步时间:< 任务一 + 任务二
请添加图片描述
异步IO内部会 轮询 IO 状态,重复调用IO操作,判断IO是否结束。
常见轮询技术:read、select、poll、kqueue、event ports

期望无需主动判断的被阻塞IO ->libuv
请添加图片描述
NodeJS异步操作过程
请添加图片描述
异步IO总结

  • IO是应用程序的瓶颈所在
  • 异步IO提高性能无需等待结果返回
  • IO操作属于操作系统级别,平台都有对应实现
  • NodeJs单线程配合事件驱动架构以及libuv实现异步IO

事件驱动架构

事件驱动架构是软件开发中的通用架构
主体发布消息,原来注册事件的其他实体接收到消息后就会处理响应事件

let eventEmitter = require("events");const myEvent = new eventEmitter();myEvent.on("事件1", function(){console.log("事件1被触发了");
})myEvent.emit("事件1");

NodeJs单线程

单线程如何实现高并发?
异步IO、事件循环加上事件驱动的架构配合事件回调通知

NodeJs主线程是单线程,但是在libuv 库中存在线程池

但是如果处理cpu密集型就不太行了:

const http = require("http");function sleep(time) {const end = Date.now() + time * 1000;while(Date.now() < end) {}return;
}// 睡4秒
sleep(4);const server = http.createServer((req, res) => {res.end("createServer start...");
})server.listen(8080, () => {console.log("服务器启动了");
})

NodeJs 应用场景

  • NodeJs作为中间层
    请添加图片描述
  • 操作数据库提供服务
  • 实时聊天业务程序
  • 前端工程化

NodeJs 适合IO密集型任务,不适合大量的业务逻辑

node api 牛刀小试

  1. 安装全局TS,ts-node
  2. 书写主逻辑
    import express from "express";
    import { DataStore } from './data';const app = express();
    app.get("/", (req, res) => {res.json(DataStore.list);
    });app.listen(8080, ()=>{console.log("服务开启");
    })
    
  3. 创建json 文件,并创建处理文件data.ts。在ts 导入json 文件时,会提示报错,我们要设置tsconfig.json 文件中的"resolveJsonModule": true
    // json 文件
    [{"name": "hyb","age": 18},{"name": "hsf","age": 19}
    ]// data.ts
    import list from "./list.json";
    export class DataStore {static list = list
    }
    

NodeJS全局对象

  • 与浏览器平台的window不完全相同
  • NodeJs全局对象上挂载许多属性
  • NodeJs全局对象是global,根本作用是全局变量的宿主

全局变量

  • __filename:返回正在执行脚本文件的绝对路径
  • __dirname:返回正在执行脚本所在目录
  • timer类函数:执行顺序与时间循环间的关系
  • process:提供与当前进程互动的接口
  • require:实现模块的加载
  • module、exports:处理模块的导出
// 全局对象
// console.log(global);// 文件和 文件夹路径
// console.log(__filename);
// console.log(__dirname);// 默认情况下 this 是空对象,和 global 是不一样的
console.log(this);
console.log(this == global);// 我们可以理解为,在我们执行js 文件时,内部会帮
// 我们封装成下面立即调用的情况,会将全局对象,全局变量作为
// 参数传进来,所以我们无需引用直接调用
(function(){console.log(this == global);
})()

全局变量process

  • 获取进程信息
  • 执行线程操作
// 1. 资源: 内存、cpu
// console.log(process.memoryUsage());
// console.log(process.cpuUsage());// 2. 运行环境:运行目录、node环境、cpu架构、用户环境、系统平台
// console.log(process.cwd());
// console.log(process.version);
// console.log(process.versions);
// console.log(process.arch);// console.log(process.env.NODE_ENV);
// console.log(process.env.PATH);
// console.log(process.env.HOME);  // USERPROFILE// console.log(process.platform);// 3. 运行状态:启动参数、PID、运行时间
// console.log(process.argv);
// console.log(process.argv0);// console.log(process.pid);
// console.log(process.uptime());// 4. 事件
// process.on("beforeExit", (code) => {
//     console.log("before exit " + code);
// })// process.on("exit", (code) => {
//     console.log("exit" + code);
// })// console.log("代码执行完毕");// 5. 标准输出 输入 错误
// console.log = function (data) {
//     process.stdout.write("---" + data + "\n");
// }// console.log(11);
// console.log(22);// 读取文件
// const fs = require('fs');
// fs.createReadStream('test.txt').pipe(process.stdout);// 读取 和写东西
// process.stdin.pipe(process.stdout);

相关内容

热门资讯

应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...