Nodejs の Global モジュールについての深い理解

黄舟
リリース: 2017-06-04 10:50:16
オリジナル
2011 人が閲覧しました

この記事は主にNodejsグローバルモジュールについて詳しく紹介しています。編集者が非常に良いと思ったので、参考として共有します。エディターに従って見てみましょう。ブラウザーには独自のグローバル オブジェクト

ウィンドウがあり、nodejs にも独自のグローバル オブジェクト global があり、各モジュールでグローバル オブジェクトに直接アクセスできます。

nodejs では、V8
JavaScript

エンジンでサポートされているネイティブ JavaScript

関数 やオブジェクトを直接使用することに加えて、他の関数やオブジェクト (バッファ オブジェクト、require 関数 wait など) も追加されます。

Buffer オブジェクト: バイナリデータの処理に使用されます
  1. module
  2. オブジェクト: 現在のモジュールに関する情報にアクセスするために使用されます

    process オブジェクト: プロセス情報にアクセスするために使用されます
  3. console オブジェクト: に使用されます制御端末はある情報を出力します
  4. タイマー関連関数6つ
  5. なお、nodejsで追加されたこれらの関数やオブジェクトは、モジュールを導入せずに直接利用することができます。

上記のオブジェクトと関数の使用法を以下に簡単に説明します。

Buffer オブジェクト


ES6 より前のネイティブ JavaScript にはバイナリ データを処理するための専用の機構がなかったため、バイナリ データを便利に処理するために、nodejs は Buffer オブジェクトを導入しました。

ES6 以降、ネイティブ JavaScript ではバイナリ データを処理するために Typed
Array

が導入されました。 TypedArray は単一のオブジェクトとしてではなく、値が TypedArray 型である一連のオブジェクトとして存在することに注意してください。この一連のオブジェクトでは、Uint8Array オブジェクトが Buffer オブジェクトに最も似ていますが、Nodejs には Buffer オブジェクトの方が適しています。

Buffer オブジェクトのインスタンスは、各要素が
integer

である

array によく似ていますが、実際の配列との違いは、そのサイズが固定されていることです (つまり、サイズはインスタンスの作成時に決定されます)。が作成されます)、およびそれに割り当てられるサイズ メモリはネイティブであり、V8 のヒープの外側に存在します。 nodejs バージョン 6.0 より前では、new Buffer() 構文がインスタンスの作成に使用されていましたが、
セキュリティ の問題により、この形式でインスタンスを作成するメソッドは廃止され、一部の Buffer オブジェクトの一部の に置き換えられました。 . 静的 メソッド。 バッファインスタンスの作成

Buffer.
    all
  1. oc(size[, fill[,coding]]): fill が設定されていない場合は、指定されたサイズの Buffer インスタンスを返します。 default

    Buffer.allocUnsafe(size): 指定されたサイズの Buffer インスタンスを返しますが、初期化されないため、機密データが含まれる可能性があります
  2. Buffer.allocUnsafeSlow(size)
  3. Buffer。 from(array): array の値によって初期化された新しい Buffer インスタンスを返します (渡される配列の要素は数値のみであり、それ以外の場合は自動的に 0 で上書きされます)
  4. Buffer.from(arrayBuffer[, byteOff
  5. set
  6. [, length ]]): これにより、基になるメモリを

    コピーせずに ArrayBuffer のビューが作成されます

    Buffer.from(buffer): 受信した Buffer インスタンスのデータをコピーし、新しい Buffer インスタンスを返します
  7. Buffer.from(
  8. string
  9. [, 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を持っていません。

でも心配しないでください、あなたの太ももはここにあります - ノードのソースコード分析 - バッファ

ソースコードリンク:buffer.js

Buffer.byteLength(string[, encoding]): </code >文字列の実際の値を返します バイト長 (文字の長さではないことに注意してください) <br/><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;">let str1 = &amp;#39;a&amp;#39;; let str2 = &amp;#39;小&amp;#39;; let str3 = &amp;#39;aa&amp;#39;; let str4 = &amp;#39;小a&amp;#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</pre><div class="contentsignin">ログイン後にコピー</div></div></p> 上記の漢字の小さな UTF-8 コードはちょうど 3 バイト (xE5xB0x8F) を占めるため、上記の結果が得られます。 <p><code>Buffer.byteLength(string[, encoding]): 返回 string 的实际的字节长度(注意不是字符长度)

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
ログイン後にコピー

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

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

console.log(Buffer.isEncoding(&#39;utf8&#39;)); // true
console.log(Buffer.isEncoding(&#39;utf9&#39;)); // false
ログイン後にコピー
ログイン後にコピー

Buffer.isBuffer(obj):
Buffer.concat(list[, totalLength]): 複数の Buffer インスタンスまたは Uint8Array インスタンスを接続し、新しい Buffer インスタンスを返します

const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);
console.log(buffer.buffer === arrayBuffer); // true
ログイン後にコピー
ログイン後にコピー
🎜Buffer.isBuffer(obj): </code >オブジェクトがバッファインスタンスであるかどうかを判断します🎜🎜<p><code>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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!