Node.Js基础知识

news2024/11/24 22:43:30

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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

geomtextpath | 成功让你的ggplot注释拥有傲人曲线!~

1写在前面 最近的世界杯结果的确是让人大跌眼镜&#x1f576;️, 日本队&#x1f1ef;&#x1f1f5;先后击败世界杯冠军, 德国队&#x1f1e9;&#x1f1ea;和西班牙队&#x1f1ea;&#x1f1f8;, 韩国队&#x1f1f0;&#x1f1f7;逆转葡萄牙&#x1f1f5;&#x1f1f9;, 踩着…

定时轮询-长轮询-websocket

一般网页 点击网页后&#xff0c;前端向后端 发送请求&#xff08;使用http协议&#xff09; 那么如何实现后端主动先前端发送数据&#xff0c;比如&#xff1a;网页游戏 聊天室 文件共享 扫码登入 http定时轮询 &#xff08;轮询&#xff09; 在前端代码中每隔一段时间向后…

宝塔面板Linux

目录 1.宝塔面板简介 2.安装与连接 3.安装软件 4.端口管理 5.宝塔面板设置 这里主要讲的是宝塔面板的主要操作&#xff0c;本节应与xshell与xftp共同使用 1.宝塔面板简介 宝塔面板是一款服务器管理软件&#xff0c;支持windows和linux系统&#xff0c;可以通过Web端轻松…

第六章- Verilog HDL 高级程序设计举例【Verilog】

第六章 Verilog HDL 高级程序设计举例【Verilog】前言推荐第六章 Verilog HDL 高级程序设计举例状态机用状态机设计1101序列检测器需要定义几个状态&#xff1f;代码设计——端口信号声明状态寄存器次态生成逻辑设计(C1模块)输出逻辑设计(C2模块)完整代码测试结果用状态机设计1…

vSphere-ESXi

VMware-vShpere 第一步&#xff1a; 在VMware虚拟机上安装一台ESXI 开启虚拟机 至此&#xff0c;虚拟机ESXI安装完毕 第二步&#xff1a;使用ESXI虚拟机IP上浏览器 登录后&#xff0c;上传一个映像文件至ISO文件 将VM虚拟机关机 手动添加一块硬盘 然后再使用虚拟机IP进入浏览器…

python入门——基础语法

python入门——基础语法 注释 单行注释&#xff1a;使用# 多行注释&#xff1a;使用 “”" “”" type()&#xff1a;查看数据的类型 int()&#xff1a;转化为整数 float()&#xff1a;转化为浮点数 str()&#xff1a;转化为字符串 标识符不可以使用这些 …

Spring WebFlux简单使用

官网&#xff1a;https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html 1.WebFlux介绍 Spring WebFlux 是 Spring Framework 5.0中引入的新的响应式web框架。与Spring MVC不同&#xff0c;它不需要Servlet API&#xff0c;是完全异步且非阻…

蓝桥杯嵌入式LCD屏幕

文章目录前言一、拷贝官方例程二、cubeMX配置三、LCD代码及函数分析使用四、sprintf函数总结前言 本篇文章将带大家学习LCD屏幕的操作&#xff0c;LCD的配置是非常复杂的&#xff0c;在比赛上去实现这些驱动程序基本上是不可能的&#xff0c;当然了比赛官方也是知道这一点的&a…

SpringMVC基础篇:MVC基础知识

第一章&#xff1a;SpringMVC引言 一&#xff1a;什么是SpringMVC 概念&#xff1a;SpringMVC是在Spring框架基础上衍生而来的一个MVC框架&#xff0c;主要解决了原有的MVC框架过程中控制器&#xff08;Controller&#xff09;的问题。 SpringMVC是Java开发当中最主流的web技…

了解软件测试

软件测试课程 1.1课程内容&#xff1a; 软件基础课程 ------设计测试用例方法 自动化课程&#xff08;web自动化&#xff09;------ 抢票功能 性能测试课程 ----项目性能测试 1.2 什么是测试 1.21 生活中测试的案例 坐地铁&#xff0c;做核酸&#xff0c;扫核酸码 比如当我…

[附源码]计算机毕业设计学生社团信息管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

零基础学习软件测试,掌握四点就够了

近年来越来越多的人转行到软件测试这一领域&#xff0c;对于很多外行的人来说&#xff0c;肯定对这一行业有很多不了解&#xff0c;对于这一职业的职责以及要求都会不清楚&#xff0c;那么我们今天就来梳理一下关于软件测试行业的信息。 一、软件测试的主要职责你知道吗&#x…

裸辞闭关60天,啃下这些软件测试笔记,有幸通过阿里测开岗P6面试

时代在发展&#xff0c;互联网之下&#xff0c;稍有一些落后可能就会被淘汰掉&#xff0c;因此我们需要不断去审视自己&#xff0c;通过学习来让自己得到相应的提升。 近段时间&#xff0c;我也了解到很多小伙伴不清楚作为测试工程师应该掌握什么样的核心知识&#xff1f;实际…

暴力算法 --- 莫队

文章目录莫队基础莫队带修改莫队树上莫队回滚莫队莫队 什么是莫队&#xff1f; 答&#xff1a;优雅的暴力&#xff01;&#xff01;&#xff01; 基础莫队 重复的数 题目描述&#xff1a;给出一个长度为NNN的序列&#xff0c;有若干查询&#xff0c;每次查询区间[li,ri][l_i,…

网页信息抓取-网页信息采集器

抓取整个网页&#xff0c;我们怎么抓取整个网页自己想要的文章内容&#xff0c;很多人一想到内容抓取。就想到要学习一门编程语言&#xff0c;最让大家熟知的就是python爬虫。如果完全靠自己自学&#xff0c;又是从零基础开始学习Python的情况下&#xff0c;我认为至少需要半年…

Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏

云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其实很多新技术是没有必要使用的,但做为学习案例来讲确实是一个绝佳的 Spring Boot 实践。 从开源到现在,写了一些教程给大家介绍如何部署云收藏,如何在IDE中运…

[附源码]计算机毕业设计ssm校园二手交易平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

解决JSP中Bean在页面显示不正确问题(scope关键字)

问题出现 有一天我在编写JSP的程序时&#xff0c;在Java后端写了跳转并且传输数据语句&#xff0c;但前端界面渲染出来的数据却是我在DAO中初始化的数据。 第一句语句将book对象注入request的Session中&#xff0c;第二句实现跳转到JSP页面&#xff0c;第三句将此时的request和…

Logistic回归——银行违约情况分析

文章目录一、Logistic回归原理1、Sigmoid函数作用2、用梯度下降法求解参数二、利用Logistic回归分类1、数据预处理2、利用梯度上升计算回归系数3、训练和验证总结一、Logistic回归原理 1、Sigmoid函数作用 Logistic回归的原理是用逻辑函数把线性回归的结果(-∞,∞)映射到(0,1…

【408篇】C语言笔记-第十章(线性表)

文章目录第一节&#xff1a;线性表的顺序表示线性表1. 定义2. 特点线性表的顺序表示1. 顺序表2. 优缺点比较3. 插入操作4. 删除操作5. 动态分配代码示例第二节&#xff1a;线性表的链式表示单链表优缺点对比插入操作删除操作代码示例第一节&#xff1a;线性表的顺序表示 线性表…