NodeJs模块化之下半部分

news2024/11/25 4:59:24

Node.js 中的模块化

更多精彩内容,请微信搜索“前端爱好者戳我 查看

官网地址:https://nodejs.cn/api/

fs 文件系统

地址:https://nodejs.cn/api/fs.html#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F

node:fs 模块能够以标准 POSIX 函数为模型的方式与文件系统进行交互。

要使用基于 promise 的 API:

import * as fs from 'node:fs/promises';

要使用回调和同步的 API:

import * as fs from 'node:fs';

所有文件系统操作都具有同步、回调和基于 promise 的形式,并且可以使用 CommonJS 语法和 ES6 模块进行访问。

Promise 示例

基于 promise 的操作会返回一个当异步操作完成时被履行的 promise。

import { unlink } from 'node:fs/promises';

try {
  await unlink('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (error) {
  console.error('there was an error:', error.message);
}

同步示例

同步的 API 会阻塞 Node.js 事件循环和下一步的 JavaScript 执行,直到操作完成。 异常会被立即地抛出,可以使用 try…catch 来处理,也可以允许冒泡。

import { unlinkSync } from 'node:fs';

try {
  unlinkSync('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (err) {
  // handle the error
}

具体案例

读取文件

var fs = require('fs')

//异步读取
fs.readFile('./abc.txt', (err,data)=>{
    if(err){
        return console.error(err)
    }

    console.log('异步读取', data.toString())
})

//同步读取
var data = fs.readFileSync('./abc.txt')
console.log('同步读取',data.toString());

写入文件

var fs = require('fs')
// 同步写入
// fs.writeFileSync('./abc.txt','这是使用writeFileSync写入的内容')

console.log('start')

// 异步写入
fs.writeFile('./abc.txt','这是使用writeFile写入的内容', (err)=>{
    if(err){
        return console.error(err)
    }

    console.log('写入完毕')
})

console.log('end')

// 输出内容
start
end
写入完毕

buffer 缓冲区

地址:https://nodejs.cn/api/buffer.html

buffer模块的特点

  • buffer用来处理二进制数据流
  • buffer实例类似数组,大小是固定的
  • buffer是使用C++代码在V8堆外分配的物理内存
  • Buffer是一个全局变量

Buffer 对象用于表示固定长度的字节序列。 许多 Node.js API 都支持 Buffer。

Buffer 类是 JavaScript Uint8Array 类的子类,并使用涵盖额外用例的方法对其进行扩展。 Node.js API 在支持 Buffer 的地方也接受纯 Uint8Array。

虽然 Buffer 类在全局作用域内可用,但仍然建议通过 import 或 require 语句显式地引用它。

const { Buffer } = require('node:buffer');

// Creates a zero-filled Buffer of length 10.
const buf1 = Buffer.alloc(10);

// Creates a Buffer of length 10,
// filled with bytes which all have the value `1`.
const buf2 = Buffer.alloc(10, 1);

// Creates an uninitialized buffer of length 10.
// This is faster than calling Buffer.alloc() but the returned
// Buffer instance might contain old data that needs to be
// overwritten using fill(), write(), or other functions that fill the Buffer's
// contents.
const buf3 = Buffer.allocUnsafe(10);

// Creates a Buffer containing the bytes [1, 2, 3].
const buf4 = Buffer.from([1, 2, 3]);

// Creates a Buffer containing the bytes [1, 1, 1, 1] – the entries
// are all truncated using `(value & 255)` to fit into the range 0–255.
const buf5 = Buffer.from([257, 257.5, -255, '1']);

// Creates a Buffer containing the UTF-8-encoded bytes for the string 'tést':
// [0x74, 0xc3, 0xa9, 0x73, 0x74] (in hexadecimal notation)
// [116, 195, 169, 115, 116] (in decimal notation)
const buf6 = Buffer.from('tést');

// Creates a Buffer containing the Latin-1 bytes [0x74, 0xe9, 0x73, 0x74].
const buf7 = Buffer.from('tést', 'latin1');

缓冲区和字符编码

在 Buffer 和字符串之间转换时,可以指定字符编码。 如果未指定字符编码,则默认使用 UTF-8。

let buf1 = Buffer.alloc(10)
console.log(buf1)

let buf2 = Buffer.alloc(5,1)
console.log(buf2)

let buf3 = Buffer.allocUnsafe(5)
console.log(buf3)

let buf4 = Buffer.from([1,2,3])
console.log(buf4)

let buf5 = Buffer.from('hello')
console.log(buf5)

let buf6 = Buffer.from('hello','base64')
console.log(buf6)

输出:

<Buffer 00 00 00 00 00 00 00 00 00 00>
<Buffer 01 01 01 01 01>
<Buffer 00 00 00 00 00>
<Buffer 01 02 03>
<Buffer 68 65 6c 6c 6f>
<Buffer 85 e9 65>

静态方法:Buffer.byteLength(string[, encoding])

地址:https://nodejs.cn/api/buffer.html#%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95bufferbytelengthstring-encoding

使用 encoding 编码时返回字符串的字节长度。 这与 String.prototype.length 不同,String.prototype.length 不考虑用于将字符串转换为字节的编码。

  • string <string> | <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <SharedArrayBuffer> 用于计算长度的值。
  • encoding <string> 如果 string 是字符串,则这就是它的编码。 默认值: ‘utf8’。
  • 返回: <integer> string 中包含的字节数。

静态方法:Buffer.isBuffer(obj)

如果 obj 是 Buffer,则返回 true,否则返回 false。

  • obj <Object>
  • 返回: <boolean>
const { Buffer } = require('node:buffer');

Buffer.isBuffer(Buffer.alloc(10)); // true
Buffer.isBuffer(Buffer.from('foo')); // true
Buffer.isBuffer('a string'); // false
Buffer.isBuffer([]); // false
Buffer.isBuffer(new Uint8Array(1024)); // false

静态方法:Buffer.concat(list[, totalLength])

地址:https://nodejs.cn/api/buffer.html#%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95bufferconcatlist-totallength

返回新的 Buffer,它是将 list 中的所有 Buffer 实例连接在一起的结果。

如果列表没有条目,或者 totalLength 为 0,则返回新的零长度 Buffer。

如果未提供 totalLength,则从 list 中的 Buffer 实例通过相加其长度来计算。

如果提供了 totalLength,则将其强制为无符号整数。 如果 list 中的 Buffer 的组合长度超过 totalLength,则结果将被截断为 totalLength。

  • list <Buffer[]> | <Uint8Array[]> 要连接的 Buffer 或 Uint8Array 实例的列表。
  • totalLength <integer> 连接时 list 中 Buffer 实例的总长度。
  • 返回: <Buffer>
let length = Buffer.byteLength('hello')
console.log(length)

// isBuffer
let a = {}
let buf = Buffer.from('hello')

console.log(Buffer.isBuffer(a))
console.log(Buffer.isBuffer(buf))

//concat()
let buf1 = Buffer.from('This')
let buf2 = Buffer.from('is')
let buf3 = Buffer.from('a')
let buf4 = Buffer.from('buffer')
let buf5 = Buffer.from('demo!')

let BufObj = Buffer.concat([buf1,buf2,buf3,buf4,buf5])
console.log(BufObj.toString('base64'))

// 输出

5
false
true
VGhpc2lzYWJ1ZmZlcmRlbW8h

事件

地址:https://nodejs.cn/api/events.html

许多 Node.js 核心 API 都是围绕惯用的异步事件驱动架构构建的,在该架构中,某些类型的对象(称为 “触发器”)触发命名事件,导致调用 Function 对象(“监听器”)。

例如: 每当对等点连接到 net.Server 对象时,它都会触发一个事件; 当文件被打开时,fs.ReadStream 触发一个事件; 只要数据可供读取,流 就会触发一个事件。

所有触发事件的对象都是 EventEmitter 类的实例。 这些对象暴露了 eventEmitter.on() 函数,允许将一个或多个函数绑定到对象触发的命名事件。 通常,事件名称是驼峰式字符串,但也可以使用任何有效的 JavaScript 属性键。

当 EventEmitter 对象触发事件时,将同步调用附加到该特定事件的所有函数。 调用的监听器返回的任何值都将被忽略和丢弃。

以下示例展示了使用单个监听器的简单的 EventEmitter 实例。 eventEmitter.on() 方法用于注册监听器,eventEmitter.emit() 方法用于触发事件。

import { EventEmitter } from 'node:events';

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

案例

const EventEmitter = require('events')

class CustomEvent extends EventEmitter {}

const ce = new CustomEvent()

ce.on('test', () => {
    console.log('this is a test!')
})

setInterval(()=>{
    ce.emit('test')
},1000)
const EventEmitter = require('events')

class CustomEvent extends EventEmitter {}

const ce = new CustomEvent()

ce.on('error', (err,date) => {
    console.log(err)
    console.log(date)
})

ce.emit('error', new Error('this is a error!'), Date.now())
const EventEmitter = require('events')

class CustomEvent extends EventEmitter {}

const ce = new CustomEvent()

ce.once('test', () => {
    console.log('test event!')
})

setInterval(()=>{
    ce.emit('test')
},1000)
const EventEmitter = require('events')

class CustomEvent extends EventEmitter {}

const ce = new CustomEvent()

function fn1(){
    console.log('fn1')
}

function fn2(){
    console.log('fn2')
}

ce.on('test',fn1)
ce.on('test',fn2)

setInterval(() => {
    ce.emit('test')
}, 500);

setTimeout(() => {
    // ce.removeListener('test',fn1)
    // ce.removeListener('test',fn2)
    ce.removeAllListeners('test')
}, 1500);

参考文档

  • https://nodejs.cn/api/documentation.html

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

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

相关文章

GPT-3 面试题

简介 1、GPT-3 是什么&#xff1f;它是基于什么模型的&#xff1f; GPT-3是一种基于深度学习原理的语言预测模型。它是由OpenAI开发的&#xff0c;可以从互联网数据中生成任何类型的文本。它只需要一小段文本作为输入&#xff0c;就可以生成大量的准确和复杂的机器生成文本⁴…

Akura Medica:新型静脉血栓切除系统,完成首次人体试验

Akura Medical公司宣布&#xff0c;其机械血栓切除平台在人体首次使用成功&#xff0c;这是一项具有突破性的技术&#xff0c;可以有效地治疗肺栓塞、深静脉血栓等血栓栓塞疾病。该平台使用了一种与众不同的方法&#xff0c;可以高效地清除血管内的血栓&#xff0c;同时保护血管…

测试分词工具Lucene.Net.Analysis.PanGu(盘古分词)

从微信公众号及百度文章来看&#xff0c;全文检索的前置工作是分词&#xff0c;首先将要做全文检索的内容分词&#xff0c;然后采用全文检索模块或工具进行全文检索。参考文献4介绍了基于Lucene.net实现全文检索的大致思路&#xff0c;其采用的是Lucene.net盘古分词的方式实现。…

蓝桥:前端开发笔面必刷题——Day1 数组(一)

文章目录 &#x1f4cb;前言&#x1f3af;数组中重复的数字&#x1f4da;题目内容✅解答 &#x1f3af;两数之和&#x1f4da;题目内容✅解答 &#x1f3af;替换空格&#x1f4da;题目内容✅解答 &#x1f3af;二维数组中的查找&#x1f4da;题目内容✅解答 &#x1f4dd;最后 …

C语言-程序环境与预处理

程序环境与预处理 程序环境翻译环境&#xff08;编译链接&#xff09;预编译编译汇编链接 执行环境 预处理预定义符#define定义的标识符 宏#define定义宏#define替换规则宏的命名约定带副作用的宏参数宏和函数的比较 其它#和##的使用字符串常量化运算符#标记粘贴运算符## 命令行…

fastled教程

文章目录 EVERY_N_MILLISECONDS(10)EVERY_N_SECONDS(5)fill_solid(leds, NUM_LEDS, CRGB::Red);fill_gradient_RGBfill_rainbow(leds, NUM_LEDS, i, 255 / NUM_LEDS);效果1fadeToBlackBy(leds, NUM_LEDS, 1); 效果2FastLED.setBrightness(2*i);// 效果3leds[i] CHSV(hue (i *…

scanf和scanf_s的区别、解决VS返回值被忽略的报错问题

一、scanf和scanf_s是什么&#xff1f; scanf()不会检查输入边界&#xff0c;可能造成数据溢出。 scanf_s()会进行边界检查。 二、分别分析 1.scanf scanf表示从键盘输入指定格式的数据。如&#xff1a;scanf("%d",x);指从键盘给x输入一个int型&#xff08;整型&…

【计网】【TCP】浅析TCP三次握手

前言 之前学习计网时不认真&#xff0c;TCP三次握手稀里糊涂就过去了&#xff0c;最近在重新查漏补缺计网这方面的知识&#xff0c;饭要一口一口吃&#xff0c;我就没有把其中涉及到的大量知识点写在此博客中&#xff0c;此文仅管中窥豹&#xff0c;之后再详细写吧。 笔记中有…

初步认识性能测试和完成一次完整的性能测试

上一篇博文主要通过两个例子让测试新手了解一下测试思想&#xff0c;和在做测试之前应该了解人几点&#xff0c;那么我们在如何完成一次完整的性能测试呢&#xff1f; 测试报告是一次完整性能测试的体现&#xff0c;所以&#xff0c;这里我给出一个完整的性能测试报告&#xff…

搞懂@DateTimeFormat 注解 和 对应的时间类型

通常而言&#xff0c;前端时间控件&#xff0c;一般情况下直接会传一个yyyy-MM-dd的日期字符串到后台。如果我们直接用java.util.Date类型来接收&#xff0c;是无法获取的。这是因为Date类型默认的格式为&#xff1a;Tue May 16 00:00:00 CST 2023这种。 举例 ApiOperation(val…

Games104现代游戏引擎学习笔记08

渲染那部分看的云里雾里的&#xff0c;等学完其他图形学的内容再回头开吧 游戏动画的三个挑战&#xff1a; 1.根据交互实时的反应各种变化 2.一帧时间里的庞大计算 3.更真实自然的表现 2D动画 sprite animation 把每一帧精灵循环绘制出来 2D技术实现3D效果 在各个视角采了一…

shell脚本——流编辑器“三剑客”之awk命令

shell脚本——流编辑器“三剑客”之awk命令 一、awk1、工作原理2、命令格式3、awk常见的内建变量&#xff08;可直接用&#xff09;4、按行输出文本5、按字段输出文本’:’6、通过管道、双引号调用shell命令 一、awk 1、工作原理 逐行读取文本&#xff0c;默认以空格或TAB键为…

射频放大器的原理和作用(射频放大器和功率放大器的区别)

射频放大器是一种电子电路&#xff0c;用于将输入信号增强到足够高的电平以驱动射频输出负载。其原理和作用如下&#xff1a; 射频放大器的工作原理是利用晶体管的三极管效应&#xff0c;将输入信号放大到足够的电平以驱动输出负载。在射频放大器中&#xff0c;输入信号经过输入…

深入理解 python 虚拟机:破解核心魔法——反序列化 pyc 文件

深入理解 python 虚拟机&#xff1a;破解核心魔法——反序列化 pyc 文件 在前面的文章当中我们详细的对于 pyc 文件的结构进行了分析&#xff0c;pyc 文件主要有下面的四个部分组成&#xff1a;魔术、 Bite Filed 、修改日期和 Code Object 组成。在前面的文章当中我们已经对前…

Android NDK: 使用Python生成下载地址

文章目录 1. 目的2. NDK下载链接3. 生成链接的 Python 脚本4. Bonus: 生成表格的 Python 脚本 1. 目的 Android NDK 的 github wiki 中给出了部分历史版本 NDK 的下载地址&#xff0c;有些版本的下载地址并没有在网页中给出。实际上这些下载地址很有规律。本文给出具体的链接&…

无人水面艇声呐装备现状与发展趋势(水声功率放大器)

无人水面艇声呐装备是目前海洋探测和水下情报收集的重要工具&#xff0c;其发展趋势受到了国防、军事、海洋资源勘探等领域的广泛关注。本文将介绍当前无人水面艇声呐装备的现状以及未来的发展趋势。 一、现状 无人水面艇声呐装备主要应用于水下物体的探测和测量&#xff0c;其…

NDK OpenGL仿抖音极快极慢录制特效视频

NDK​系列之OpenGL仿抖音极快极慢录制特效视频&#xff0c;本节主要是在上一节OpenGL代码架构上增加极快极慢等特效的视频录制功能。 实现效果&#xff1a; 实现逻辑&#xff1a; 在上一节的特效效果的基础上&#xff0c;使用MediaCodec和自定义EGL&#xff0c;将效果视频录制…

CountDownLatch与Binder连接池

CountDownLatch与Binder连接池 CountDownLatch 如果现在有一个题,有5个数,这时候我想让这5个数同时都乘2,然后算出结果后再算它们的平均数 这时候就可以用CountDownLatch import java.util.concurrent.CountDownLatch; public class Example {public static void main(Stri…

总结853

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

leetcode(力扣)刷题笔记(c++)【下】

文章预览&#xff1a; 单调栈739. 每日温度496.下一个更大元素 I503. 下一个更大元素 II42. 接雨水84.柱状图中最大的矩形 额外题目1365.有多少小于当前数字的数字941. 有效的山脉数组1207. 独一无二的出现次数189. 轮转数组724. 寻找数组的中心下标922. 按奇偶排序数组 II 后续…