Node.Js基础知识

2023-11-19

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

path

const path = require("path");

/**
 * 返回路径的最后一部分,通常用于从路径中提取文件名
 * 传入后缀字符串参数时,若结果包含后缀字符串,则返回从结果中删除扩展后的字符串
 * 若最后结尾是路径分割符,则忽略
 */
console.log(__filename);
console.log(path.basename(__filename));
console.log(path.basename(__filename, 'h.js'));
console.log(path.basename(__filename, '.css'));
console.log(path.basename("a/b/c"));
console.log(path.basename("a/b/c/", "c"));


console.log("华丽分割线-------------------")
// 返回文件路径名
console.log(path.dirname(__filename));

console.log("华丽的分割线----------------------")
/**
 * 返回文件的扩展名
 * path 路径中存在多个点,匹配最后一个点到结尾
 */
console.log(path.extname(__filename));

console.log("华丽的分割线----------------------")
// 解构路径
console.log(path.parse(__filename));

console.log("华丽的分割线----------------------")
// 序列化路径
console.log(path.format(path.parse(__filename)));

console.log("华丽分割线------------------------")
// 是否为绝对路径
console.log(path.isAbsolute('./foo'));
console.log(path.isAbsolute('/foo'));

console.log("华丽分割线---------------------")
// 拼接路径
console.log(path.join("a/b", 'c', 'a.html'));
console.log(path.join("a/b", 'c', "../",'a.html'));

console.log("华丽分割线---------------------")
// 规范化路径
console.log(path.normalize("a//b/c"))

console.log("华丽分割线---------------------")
// 绝对路径
console.log(path.resolve("a.html"));
console.log(path.resolve("/a.html"));

Buffer

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.Js基础知识 的相关文章

  • 使用祖父母接口的默认方法

    我完全不明白为什么这行不通 interface Test default void doMagic System out println Abracadabra class TestImpl implements Test class Sp
  • 构建 jar 后无法运行 exe

    我制作了一个简单的实用应用程序 其中我有一个要运行的exe文件 我通过使用它来运行 Runtime getRuntime exec this getClass getResource filename exe getPath 当我从 ide
  • 用于将字符串与预定义字符混合/混淆的简单算法

    我有一个字符串如下 它的长度是10 它代表基数 36 因此包含数字和大写字母 字符串的来源是数据库生成的序列 即从 1 及以上 正在转换为基数 36 我的问题是转换为base 36转换的结果也是连续 顺序的 例如 ID 1402 gt 00
  • getAnnotations() 为空

    我想在我的应用程序中使用注释 因此 我为注释创建了 hello world 如下示例 public class HelloAnnotation Foo bar Hello World public String str public sta
  • 使用 Morphia 配置 Spring Boot?

    我不想利用 Spring DATA MongoDB 支持 我想利用名为 Morphia 的 MongoDB ORM https github com mongodb morphia https github com mongodb morp
  • Android - Firebase - 保存新数据而不覆盖旧数据

    创建此问题是因为我之前的问题包含 2 个问题 而不是将其缩小到 1 Aim 用户将能够存储新数据而不会覆盖之前提交的数据 描述 目前 当用户输入新报告时 事件报告节点中的用户事件报告数据将被覆盖 用户发送的旧事件报告中的数据应与新数据一起保
  • JAXB、Marshal 的问题 - 无法封送类型“java.lang.String”

    当我运行 marshal 操作时 出现以下错误 javax xml bind MarshalException with linked exception com sun istack internal SAXException2 unab
  • java IO将一个文件复制到另一个文件

    我有两个 Java io File 对象 file1 和 file2 我想将 file1 的内容复制到 file2 有没有一种标准方法可以做到这一点 而无需我创建一个读取 file1 并写入 file2 的方法 不 没有内置方法可以做到这一
  • Simplify-Ja​​va (by hgoebl) 减少点列表大小始终为 2 的问题

    我正在尝试实现减少算法https github com hgoebl simplify java https github com hgoebl simplify java 我查看了他的测试代码 并试图找出我认为正确的逻辑 我正在列出一份清
  • 运行Java程序时出错

    我正在尝试使用 netbeans 运行我的 java 程序 但收到此错误 有什么建议吗 Exception in thread AWT EventQueue 0 java lang NullPointerException at javax
  • 非法监控状态异常

    如何将轮询线程传递给另一个线程进行处理 程序执行在控制器类中 该类具有 main 方法和线程池 主类控制器 public static void main String args throws InterruptedException Ru
  • 与 Java 中的同步块相比,新的 Lock 接口有什么优势?

    与 Java 中的同步块相比 新的 Lock 接口有什么优势 您需要实现一个高性能缓存 允许多个读取器但单个写入器保持完整性 您将如何实现它 锁的优点是 让他们公平是可能的 可以使线程在等待 Lock 对象时响应中断 可以尝试获取锁 但如果
  • 如何告诉杰克逊在反序列化期间忽略空对象?

    在反序列化过程中 据我理解是将JSON数据转换为Java对象的过程 我如何告诉Jackson 当它读取不包含数据的对象时 应该忽略它 我正在使用 Jackson 2 6 6 和 Spring 4 2 6 我的控制器收到的JSON数据如下 i
  • 定时器启动/停止参数

    自从加入这个社区以来 我在技能和进步方面取得了突飞猛进的进步 你们都是一个巨大的帮助 我无法提供一个计时器 该计时器已在启动和停止时实现了某些参数 我要么收到错误消息 局部变量计时器可能尚未初始化 要么没有收到错误消息 但什么也没有发生 也
  • 如何将 JAVAX-WS 端点绑定更改为 SOAP 1.2?

    我正在使用发布测试 WS 实现Endpoint publish 用于在 Visual Studio 中使用 根据文档 http metro java net nonav 1 2 docs endpoint html默认的 SOAP 绑定是1
  • Java 统一编码

    A Java char is 2 bytes http java sun com docs books tutorial java nutsandbolts datatypes html 最大大小为 65 536 但有95 221 http
  • 将 AngularJS 应用程序部署到普通 Apache HTTP 服务器是一种常见的选择吗?

    我很好奇 AngularJS 应用程序通常部署到什么样的服务器上 Google 没有给出令人满意的答案 特别是 在我看来 AngularJS 应用程序只是静态文件的集合 因此在生产中将这样的应用程序部署到普通 Apache HTTP 服务器
  • ElectronJS 捕获屏幕质量低

    我正在使用 ElectronJS 测试屏幕捕获 我可以捕获屏幕 但捕获的视频质量低于原始视频 操作系统 Linux Mint 20 电子版本 11 1 0 这是我的代码 我选择我的屏幕 然后使用以下命令在电子应用程序中显示捕获的屏幕vide
  • 我可以在方法体内使用注释吗?

    允许 Java 注释的语义将它们放置在某处在函数体内 例如注释特定的函数调用 语句或表达式 例如 class MyClass void theFunc Thing thing String s null Catching NullPoint
  • 使用node.js/Express从HTTP重定向到HTTPS

    有什么方法可以更改我的 Web 应用程序以侦听 HTTPS 而不是 HTTP 我正在使用node js express 我需要它来侦听 HTTPS 因为我正在使用地理定位 而 Chrome 不再支持地理定位 除非从 HTTPS 等安全上下文

随机推荐

  • gym 101512 BAPC 2014 I Interesting Integers

    Problem codeforces com gym 101512 attachments vjudge net contest 186506 problem I Meaning 给出一个 正整数 n 要找尽量小的 a 和 b a lt b
  • 面向对象三大特性之一——多态详解

    目录 前言 一 多态的概念 二 多态的定义及实现 1 虚函数的概念 2 虚函数的重写 2 1概念 2 2虚函数重写的两个例外 3 多态的构成条件 4 c 11 override和final 4 1 final 4 2 override 5
  • Java(五)-Java集合(comparable,map,list

    集合 Collection集合 集合的概念 ArrayList就是一个集合 集合是Java提供的一种容器 可以用来存储多个数据 集合与数组的区别 1 数组的长度是固定的 集合的长度是可变的 2 数组中存储的是同一类型的元素 可以存储基本数据
  • C++ 和 C 使用的不同点(待定)

    1 结构体 C 中定义的结构体 不起别名的情况下使用时要添加 struct C 可以不用添加 struct 直接使用定义的结构体名称 struct Student int age char name C 不报错 C报错 Student Ge
  • JDK的监听 Spring的事件监听机制

    一 概述 使用场景 用户注册完成时 需要给该用户发送邮件 发送优惠劵等等操作 实现业务的解耦 MQ的异步 销峰 解耦 大体步骤 1 UserService 在完成自身的用户注册逻辑之后 仅仅只需要发布一个 UserRegisterEvent
  • 归一化与反归一化在Bi-LSTM多特征时序预测中应用(附实操代码)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 Bi LSTM 是什么 二 为什么要归一化和反归一化 1 归一化的好处 2 反归一化的好处 三 归一化和反归一化使用的公式 1 归一化 2 反归一化 四 实操
  • 使用Pandas处理Excel文件

    Excel工作表是非常本能和用户友好的 这使得它们非常适合操作大型数据集 即使是技术人员也不例外 如果您正在寻找学习使用Python在Excel文件中操作和自动化内容的地方 请不要再找了 你来对地方了 在本文中 您将学习如何使用Pandas
  • forkjoin及其性能分析,是否比for循环快?

    最近看了网上的某公开课 其中有讲到forkjoin框架 在这之前 我丝毫没听说过这个东西 很好奇是什么东东 于是 就顺道研究了一番 总感觉这个东西 用的地方很少 也有可能是我才疏学浅 好吧 反正问了身边一堆猿 没有一个知道的 因此 我也没有
  • 怎么把树莓派连接到电脑上(基于window10)

    我相信对于刚玩树莓派的新手来说 尤其是没有带显示屏的同学来说 四处碰壁 可能出现的原因有很多种 ssh登录不上 wifi连接不上 内存不足 很多问题 而对于更多新手来说 如何给树莓派连接网络更是关键 今天我给大家讲一下如何用树莓派连接电脑
  • Real-time Linux

    所谓实时操作系统 Real time Opearting System 是指当外接世界或数据产生时 能够接受并以足够快的速度予以处理 其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应 调度一切可利用的资源完成实时任务
  • 数据链路层:Ethernet以太网协议

    首先Ethernet IEEE802 3 PPP和HDLC都是数据链路层的协议 只不过后面三个不常用而已 Ethernet和IEEE802 3属于以太链路层协议 数据链路层最常用的协议是Etnernet以太网协议 定义 Ethernet以太
  • 常用的加密算法

    整理一下常用的加密算法 加密算法我们整体可以分为 可逆加密和不可逆加密 可逆加密又可以分为 对称加密和非对称加密 一 不可逆加密 常见的不可逆加密算法有MD5 HMAC SHA1 SHA 224 SHA 256 SHA 384 和SHA 5
  • Flask(一)

    Flask 0 Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架 对于Werkzeug本质是Socket服务端 其用于接收http请求并对请求进行预处理 然后触发Fl
  • 设计模式——导论

    作为软件开发人员 我们在平时工作的过程中 往往需要编写很多的代码来实现我们的需求 很多的时候会造成代码臃肿和代码冗余的情况 这个时候我们需要引入一个理念 设计模式 设计模式存在的意义在于 1 使得我们的代码更加精炼 2 使我们代码的可读性更
  • 面试求职经历及遇到的部分问题

    转眼间已经工作一年多了 最近想换个工作环境 就选择了跳槽 跳槽对我们程序猿来说并没什么稀奇 但这是我第一次跳槽 也颇感激动 哈哈 总的来说 这次找工作还是相对去年来说比较容易的 毕竟已经工作一年了嘛 记得去年的时候投20份简历也不一定会有面
  • 开发者本地搭建性能监测工具(Windows)

    ElasticSearch 8 9 0 开发模式安装 JDK安装 官方提供版本与JDK支持关系 https www elastic co cn support matrix matrix jvm 我们安装Elasticsearch 8 9
  • ATT&CK实战系列——红队实战(一)红日靶场1

    目录 靶场搭建 拓扑图 配置网络 外网打点web服务器 信息搜集 nmap扫端口服务 dirsearch目录扫描 phpmyadmin日志getshell yxcms 后台getshell xss 关闭win7防火墙 上线msf cs 上线
  • 基于加密流量组建跨机房(混合云)k8s集群

    业务场景 解决服务同城 异地多活灾备 环境 a机房 私网 192 168 1 0 24 公网ip 111 111 111 111 b机房 私网 192 168 2 0 24 公网ip 222 222 222 222 c机房 私网 192 1
  • 传统目标检测算法综述

    传统目标检测算法综述
  • Node.Js基础知识

    Node Js架构 Natives modules 当前层内容由JS实现 提供 应用程序可直接调用库 例如 fs path http等 JS语言无法直接操作底层硬件设置 Builtin modules 胶水层 Builtin modules