Heim  >  Artikel  >  Web-Frontend  >  Vertiefendes Verständnis des Global-Moduls in Nodejs

Vertiefendes Verständnis des Global-Moduls in Nodejs

黄舟
黄舟Original
2017-06-04 10:50:162014Durchsuche

Dieser Artikel führt hauptsächlich in ein detailliertes Verständnis des Nodejs Global-Moduls ein. Der Herausgeber findet es ziemlich gut, daher werde ich es jetzt mit Ihnen teilen und als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick darauf.

Der Browser verfügt über ein eigenes globales Objekt . Auf die gleiche Weise verfügt auch nodejs über ein eigenes globales Objekt, auf das direkt zugegriffen werden kann unter jedem Modul. Greifen Sie auf das globale Objekt zu.

In nodejs werden neben der direkten Verwendung der nativen JavaScript-Funktionen und der von der V8-JavaScript-Engine unterstützten Objekte auch einige andere Funktionen und Objekte hinzugefügt (zum Beispiel: Pufferobjekt, require-Funktion usw.).

  1. Pufferobjekt: wird zum Verarbeiten von Binärdaten verwendet

  2. ModulObjekt: wird zum Zugriff auf Informationen des aktuellen Moduls verwendet

  3. Prozessobjekt: wird für den Zugriff auf Prozessinformationen verwendet

  4. Konsolenobjekt: wird für die Ausgabe bestimmter Informationen an das Steuerterminal verwendet

  5. 6 Timer-bezogene Funktionen

Es ist zu beachten, dass diese von nodejs hinzugefügten Funktionen und Objekte direkt verwendet werden können, ohne dass Module eingeführt werden müssen.

Im Folgenden wird die Verwendung der oben genannten Objekte und Funktionen kurz erläutert.

Pufferobjekt

Vor ES6 wurde natives JavaScript nicht speziell für die Verarbeitung binärer Datenmechanismen entwickelt. Um Binärdaten bequem verarbeiten zu können, hat nodejs das Buffer-Objekt eingeführt.

Nach ES6 führte natives JavaScript TypedArray zur Verarbeitung von Binärdaten ein. Beachten Sie, dass TypedArray nicht als einzelnes Objekt existiert, sondern als eine Reihe von Objekten, deren Werte vom Typ TypedArray sind. In dieser Objektreihe ist das Uint8Array-Objekt dem Buffer-Objekt am ähnlichsten, das Buffer-Objekt eignet sich jedoch besser für NodeJS. Eine Instanz eines

Buffer-Objekts ist einem Array sehr ähnlich, bei dem jedes Element eine Ganzzahl ist, der Unterschied zu einem echten Array besteht jedoch darin Die Größe ist fest (d. h. die Größe wird beim Erstellen der Instanz festgelegt), und der ihr zugewiesene Speicher ist nativ und befindet sich außerhalb des Heap-Speichers von V8.
Vor nodejs 6.0 wurde die neue Buffer()-Syntax zum Erstellen einer Instanz verwendet. Aufgrund einiger Sicherheitsprobleme war die Methode zum Erstellen einer Instanz jedoch abgeschafft. , ersetzt durch einige statische Methoden einiger Buffer-Objekte.

Pufferinstanz erstellen

  1. Puffer.alleoc(size[, fill[,kodierung]]): Gibt eine angegebene Größe zurück Pufferinstanz: Wenn die Füllung nicht festgelegt ist, wird sie standardmäßig mit 0 gefüllt

  2. Buffer.allocUnsafe(size): Gibt eine Pufferinstanz der angegebenen Größe zurück, dies ist jedoch nicht der Fall initialisiert, daher kann es vertrauliche Daten enthalten

  3. Buffer.allocUnsafeSlow(size)

  4. Buffer.from(array): Gibt ein Array zurück, das von initialisiert wurde der Wert der Array New Buffer-Instanz (die Elemente des eingehenden Arrays können nur Zahlen sein, sonst werden sie automatisch mit 0 überschrieben)

  5. Buffer.from(arrayBuffer[, byteOffset[, length]]): Dadurch wird eine Ansicht des ArrayBuffer erstellt, ohne den zugrunde liegenden Speicher zu kopierenBuffer.from(buffer): Kopieren Sie die eingehenden Buffer-Instanzdaten und geben Sie eine neue Buffer-Instanz zurück.

  6. Buffer.from(

    string
  7. [,kodierung]): Gibt eine neue zurück, die mit dem Wert von initialisiert wird string Die Buffer-Instanz
  8. ist oben nicht ganz klar (wird später optimiert), da ich Anfänger bin und noch nie mit TypedArray gespielt habe!
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>
Aber keine Sorge, Ihre Schenkel sind hier – Knoten-Quellcode-Analyse – Puffer


Quellcode-Link: buffer.js


Gibt die tatsächliche Bytelänge der Zeichenfolge zurück (beachten Sie nicht die Zeichenlänge)

Der kleine UTF-8-Code der oben genannten chinesischen Schriftzeichen belegt genau drei Bytes (xE5xB0x8F), daher das obige Ergebnis erhalten wird. Buffer.byteLength(string[, encoding]):

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

Verbinden Sie mehrere Buffer-Instanzen oder Uint8Array-Instanzen und geben Sie eine neue Buffer-Instanz zurück

Buffer.concat(list[, totalLength]):Beurteilen Sie, ob ein Objekt eine Buffer-Instanz ist

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.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 下,即可以直接在代码中进行使用。


Das obige ist der detaillierte Inhalt vonVertiefendes Verständnis des Global-Moduls in Nodejs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn