搜索
首页web前端js教程关于Nodejs中Global模块的深入理解

本篇文章主要介绍了深入理解Nodejs Global 模块,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

浏览器上有自己的全局对象 window,同理, nodejs 下也有自己的全局对象 global,并且在各个模块下 都可以直接访问 global 对象。

在 nodejs 中,除了可以直接使用 V8 JavaScript 引擎中所支持的原生 JavaScript 的函数和对象外,它还追加了一些其他的函数和对象(比如:Buffer 对象、require 函数等)。

  1. Buffer 对象: 用于处理二进制数据

  2. module 对象: 用于访问当前模块的信息

  3. process 对象: 用于访问进程信息

  4. console 对象: 用于向控制端输出某些信息

  5. 6 个计时器相关函数

需要注意的是,可以在不引入模块的情况下直接使用 nodejs 追加的这些函数和对象。

下面将对上面的这些对象和函数的使用进行简单的解释。

Buffer 对象

在 ES6 之前,原生的 JavaScript 并没有专门用来处理二进制数据的机制,所以为了方便地处理二进制数据,nodejs 才引入了 Buffer 对象。

ES6 之后,原生的 JavaScript 引入了 TypedArray,用来处理二进制数据。注意 TypedArray 并不是以一个单一的对象的形式而存在,而是以一系列值的类型为 TypedArray 的对象而存在。在这一系列对象中,Uint8Array 对象和 Buffer 对象最为相似,但是 Buffer 对象更加适用于 nodejs。

Buffer 对象的实例很像一个各个元素都是整数数组,但是与真正的数组的区别在于它的大小固定的(即在实例创建时决定大小),并且为它分配的内存是原生的,并且存在于 V8 的堆内存外。
在 nodejs 6.0 版本之前,是使用 new Buffer() 语法来创建一个实例,但是因为一些安全问题,以这种形式创建实例的方法被废除了,取而代之的是一些 Buffer 对象的一些静态方法。

创建 Buffer 实例

  1. Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0

  2. Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据

  3. Buffer.allocUnsafeSlow(size)

  4. Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)

  5. Buffer.from(arrayBuffer[, byteOffset[, length]]): This creates a view of the ArrayBuffer without copying the underlying memory

  6. Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例

  7. Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例

const buf1 = Buffer.alloc(5);
const buf2 = Buffer.allocUnsafe(5);
const buf3 = Buffer.from([1, '2a', 230]);
const buf4 = Buffer.from('abcdggg');
console.log(buf1); // <Buffer 00 00 00 00 00>
console.log(buf2); // <Buffer b8 ed a3 80 58> (这只是一种可能的结果)
console.log(buf3); // <Buffer 01 00 e6>
console.log(buf4); // <Buffer 61 62 63 64 67 67 67>
console.log(buf4.toString()); // abcdggg
buf2.fill(0);
console.log(buf2); // <Buffer 00 00 00 00 00>

上面讲的不太清楚(以后再优化),因为我是初学,TypedArray 都没玩过呢!

但是放心,大腿在这呢 — Node源码解析 – buffer

源码链接: buffer.js

Buffer.byteLength(string[, encoding]): 返回 string 的实际的字节长度(注意不是字符长度)

let str1 = &#39;a&#39;;
let str2 = &#39;小&#39;;
let str3 = &#39;aa&#39;;
let str4 = &#39;小a&#39;;
console.log(str1.length);    // 1
console.log(Buffer.byteLength(str1)); // 1
console.log(str2.length);    // 1
console.log(Buffer.byteLength(str2)); // 3
console.log(str3.length);    // 2
console.log(Buffer.byteLength(str3)); // 2
console.log(str4.length);    // 2
console.log(Buffer.byteLength(str4)); // 4

上面的汉字 小 的 UTF-8 码正好占用三个字节(\xE5\xB0\x8F),所以才会有上面的结果。

Buffer.concat(list[, totalLength]): 连接多个 Buffer 实例或 Uint8Array 实例,并返回一个新的 Buffer 实例

const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const totalLength = buf1.length + buf2.length;
console.log(totalLength); // 24
const buf = Buffer.concat([buf1, buf2], totalLength);
console.log(buf.length); // 24

Buffer.isBuffer(obj): 判断一个对象是不是 Buffer 实例

Buffer.isEncoding(encoding): 判断是否支持指定的编码方式

console.log(Buffer.isEncoding(&#39;utf8&#39;)); // true
console.log(Buffer.isEncoding(&#39;utf9&#39;)); // false

Buffer.poolSize: 指定预分配的字节数的大小,默认为 8192(即 8 KB)

Buffer.prototype.buffer: 一个指向 ArrayBuffer 的引用

const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);
console.log(buffer.buffer === arrayBuffer); // true

Buffer.prototype.equals(otherBuffer): 比较两个 Buffer 实例是否拥有完全相同的 bytes

const buf1 = Buffer.from(&#39;hello&#39;);
const buf2 = Buffer.from(&#39;hello&#39;);
console.log(buf1.equals(buf2)); // true

用于迭代的方法

  1. Buffer.prototype.entries()

  2. Buffer.prototype.keys()

  3. Buffer.prototype.values()

Buffer.prototype.fill(value[, offset[, <a href="http://www.php.cn/wiki/1048.html" target="_blank">end</a>]][, encoding]): 用指定的值填充满 Buffer 实例

const b = Buffer.allocUnsafe(25).fill(&#39;abc呵呵&#39;);
// 注意下面因为不够容纳全部的汉字字节,所以乱码
console.log(b.toString()); // abc呵呵abc呵呵abc呵�

Buffer.prototype.<a href="http://www.php.cn/wiki/137.html" target="_blank">include</a>s(value[, byteOffset][, encoding])

Buffer.prototype.indexOf(value[, byteOffset][, encoding])

Buffer.prototype.to<a href="http://www.php.cn/wiki/1488.html" target="_blank">JSON</a>(): 返回一个 JSON 对象

当 JSON.stringify(buf) 的参数为一个 Buffer 实例时,会隐式地调用上面的方法

const b = Buffer.from(&#39;hell&#39;)
let json = b.toJSON();
console.log(json); // { type: &#39;Buffer&#39;, data: [ 104, 101, 108, 108 ] }
console.log(JSON.stringify(b)); // {"type":"Buffer","data":[104,101,108,108]}

Buffer.prototype.toString([encoding[, start[, end]]]): 以指定的 encoding 解码 Buffer 实例,返回解码后的字符串

const buf = Buffer.from([104, 101, 108, 108]);
console.log(buf.toString()); // hell
console.log(buf.toString(&#39;base64&#39;)); // aGVsbA==
console.log(buf.toString(&#39;hex&#39;)); // 68656c6c

字符串不能被修改,但是 Buffer 实例却可以被修改。

const buf = Buffer.from(&#39;abcd&#39;);
console.log(buf.toString()); // abcd
buf[1] = 122;
console.log(buf.toString()); // azcd

Buffer.prototype.write(string[, offset[, length]][, encoding]): 将指定字符串写入到 Buffer 中

const buf = Buffer.from(&#39;abcdefg&#39;);
console.log(buf); // <Buffer 61 62 63 64 65 66 67>
console.log(buf.toString()); // abcdefg
buf.write(&#39;和&#39;, 1);
console.log(buf); // <Buffer 61 e5 92 8c 65 66 67>
console.log(buf.toString()); // a和efg

好了,还有一堆方法就不一一列出来了,Buffer 就到这里了。

module 对象

在使用 require 函数加载模块文件时,将运行该模块文件中的每一行代码

模块在首次加载后将缓存在内存缓存区中,所以对于相同模块的多次引用得到的都是同一个模块对象,即对于相同模块的多次引用不会引起该模块内代码的多次执行。

在编译的过程中,Node 会对获取的 JavaScript 文件内容进行头尾包装!

// 包装前 module666.js
const PI = 6666;
module.exports = PI;
// 包装后,注意下面不是立即执行函数
(function(exports, require, module, filename, dirname) {
 const PI = 6666;
 module.exports = PI;
});

filename & dirname

  1. filename: 返回当前模块文件的绝对路径(带文件名)

  2. dirname: 返回当前模块文件所在目录的绝对路径

// 1.js
console.log(filename); // c:\Users\percy\Desktop\nodejs\1.js
console.log(dirname); // c:\Users\percy\Desktop\nodejs

Process 对象

process 对象是 nodejs 的一个全局对象,提供当前 nodejs 进程的信息。

属性

  1. process.arch: 返回当前处理器的架构

  2. process.env: 返回一个包含用户环境变量的对象

  3. process.argv: 返回一个数组,数组的第一个元素总是 node 程序的绝对路径,第二个元素是当前执行脚本的绝对路径

  4. process.execPath: 返回 node 程序的绝对路径

  5. process.argv0: 返回 node 程序的绝对路径

  6. process.pid: 返回当前进程的进程号

  7. process.platform: 返回当前的系统平台标识符(比如:'darwin', ‘freebsd', ‘linux', ‘sunos' or ‘win32')

  8. process.version: 返回当前 node 的版本号

  9. process.versions: 返回一个对象,列出了 nodejs 和其相关依赖的版本号

三个重要的属性

  1. process.stdin: 返回一个指向标准输入流的可读流(Readable Stream)

  2. process.stdout: 返回一个指向标准输出流的可写流(Writable Stream)

  3. process.stderr: 返回一个指向标准错误流的可写流(Writable Stream)

方法

  1. process.cwd(): 返回进程当前的工作目录

  2. process.chdir(path): 改变进程当前的工作目录

  3. process.cpuUsage(): 返回当前 CPU 的使用情况

  4. process.memoryUsage(): 返回当前内存的使用情况

  5. process.uptime(): 返回 Node 程序已运行的秒数

  6. process.nextTick(callback[, …args]): 指定回调函数在当前执行栈的尾部、下一次Event Loop之前执行

  7. process.emitWarning(warning[, options]): 触发一个 warning 事件,可以自定义一些警告信息

  8. process.exit([code]): 立即结束当前进程,但是会触发 process 的 exit 事件

  9. process.abort(): 立即结束当前进程,不会触发 exit 事件

console.log(process.cwd()); // c:\Users\percy\Desktop\nodejs
process.chdir(&#39;../&#39;);
console.log(process.cwd()); // c:\Users\percy\Desktop
process.emitWarning(&#39;Something happened!&#39;, {
 code: &#39;MY_WARNING&#39;,
 detail: &#39;This is some additional information&#39;
});
process.on(&#39;warning&#39;, (warning) => {
 console.log(warning);
})
process.on(&#39;exit&#39;, function(code) {
 console.log(&#39;exit~&#39;, code);
});
process.exit(); // exit~

process 对象还有一些方法没列出来,因为我现在看不懂怎么用,以后补 >_<

Console 对象

这个对象就是用来在控制台下面打印一些信息而已,挑几个有用但没记牢的方法来玩玩。

console.dir(value): 打印一个对象的详细信息

const buf = Buffer.from(&#39;abcdefg&#39;);
console.log(buf); // <Buffer 61 62 63 64 65 66 67>
console.dir(buf); // Buffer [ 97, 98, 99, 100, 101, 102, 103 ]

console.time(label) & console.timeEnd(label): 用来统计代码执行时间

let label = &#39;time&#39;;
let str = &#39;hello&#39;;
console.time(label);
while (str.length < 999999) {
 str += &#39;a&#39;;
}
console.timeEnd(label); // time: 133.724ms

6 个计时器函数

在浏览器上,就有相应的 4 个计时器函数(setInterval、clearInterval、setTimeout、clearTimeout),只不过它们是 window 全局对象的属性。

在 nodejs 中,除过上面的 4 个计时器,还增加了两个(setImmediate,clearImmediate)。

这六个计时器函数被定义在了全局对象 global 下,即可以直接在代码中进行使用。


以上是关于Nodejs中Global模块的深入理解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

聊聊Node.js中的多进程和多线程聊聊Node.js中的多进程和多线程Jul 25, 2022 pm 07:45 PM

大家都知道 Node.js 是单线程的,却不知它也提供了多进(线)程模块来加速处理一些特殊任务,本文便带领大家了解下 Node.js 的多进(线)程,希望对大家有所帮助!

火了!新的JavaScript运行时:Bun,性能完爆Node火了!新的JavaScript运行时:Bun,性能完爆NodeJul 15, 2022 pm 02:03 PM

今天跟大家介绍一个最新开源的 javaScript 运行时:Bun.js。比 Node.js 快三倍,新 JavaScript 运行时 Bun 火了!

nodejs中lts是什么意思nodejs中lts是什么意思Jun 29, 2022 pm 03:30 PM

在nodejs中,lts是长期支持的意思,是“Long Time Support”的缩写;Node有奇数版本和偶数版本两条发布流程线,当一个奇数版本发布后,最近的一个偶数版本会立即进入LTS维护计划,一直持续18个月,在之后会有12个月的延长维护期,lts期间可以支持“bug fix”变更。

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

深入浅析Nodejs中的net模块深入浅析Nodejs中的net模块Apr 11, 2022 pm 08:40 PM

本篇文章带大家带大家了解一下Nodejs中的net模块,希望对大家有所帮助!

怎么获取Node性能监控指标?获取方法分享怎么获取Node性能监控指标?获取方法分享Apr 19, 2022 pm 09:25 PM

怎么获取Node性能监控指标?本篇文章来和大家聊聊Node性能监控指标获取方法,希望对大家有所帮助!

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),