Node 全局对象

468 阅读2分钟

Node 全局对象

node的全局对象(global)是什么:

<ref *1> Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  },
  queueMicrotask: [Function: queueMicrotask],
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  }
}

全局对象中封装了:

  • console.log()
  • setTimeout

等等api。

在浏览器中,我们有 documentwindow 等全局对象;而 Node 只包含 ECMAScript 和 V8,不包含 BOM 和 DOM,因此 Node 中不存在 documentwindow;取而代之,Node 专属的全局对象是 process

JavaScript 全局对象的分类

在此之前,我们先看一下 JavaScript 各个运行环境的全局对象的比较,如下图所示:

img

可以看到 JavaScript 全局对象可以分为四类:

  1. 浏览器专属,例如 windowalert 等等;
  2. Node 专属,例如 process__dirname__filename 等等;
  3. 浏览器和 Node 共有,但是实现方式不同,例如 console(第一节中已提到)、setTimeoutsetInterval 等;
  4. 浏览器和 Node 共有,并且属于 ECMAScript 语言定义的一部分,例如 DateStringPromise 等;

Node 专属全局对象解析

process

process 全局对象可以说是 Node.js 的灵魂,它是管理当前 Node.js 进程状态的对象,提供了与操作系统的简单接口。

首先我们探索一下 process 对象的重要属性。打开 Node REPL,然后我们查看一下 process 对象的一些属性:

  • pid:进程编号
  • env:系统环境变量
  • argv:命令行执行此脚本时的输入参数
  • platform:当前操作系统的平台

提示

可以在 Node REPL 中尝试一下这些对象。像上面说的那样进入 REPL(你的输出很有可能跟我的不一样):

$ node
Welcome to Node.js v12.10.0.
Type ".help" for more information.
> process.pid
3
> process.platform
'darwin'
应用
查看 PATH
console.log(process.env.PATH.split(':').join('\n'));
设置 PATH
process.env.PATH += ':/newpath';
获取信息
// 获取平台信息
process.arch // x64
process.platform // darwin// 获取内存使用情况
process.memoryUsage();
​
// 获取命令行参数
process.argv
复制代码
nextTick

process.nextTick 方法允许你把一个回调放在下一次时间轮询队列的头上,这意味着可以用来延迟执行,结果是比 setTimeout 更有效率。

const EventEmitter = require('events').EventEmitter;
​
function complexOperations() {
  const events = new EventEmitter();
​
  process.nextTick(function () {
    events.emit('success');
  });
​
  return events;
}
​
complexOperations().on('success', function () {
  console.log('success!');
});

Buffer

Buffer 全局对象让 JavaScript 也能够轻松地处理二进制数据流,结合 Node 的流接口(Stream),能够实现高效的二进制文件处理。

换句话说:如果没有提供编码格式,文件操作以及很多网络操作就会将数据作为 Buffer 类型返回。

分别代表当前所运行 Node 脚本的文件路径和所在目录路径。

注意

__filename__dirname 只能在 Node 脚本文件中使用,在 REPL 中是没有定义的。

使用 Node 全局对象

接下来我们将在刚才写的脚本文件中使用 Node 全局对象,分别涵盖上面的三类:

  • Node 专属:process
  • 实现方式不同的共有全局对象:consolesetTimeout
  • ECMAScript 语言定义的全局对象:Date

提示

setTimeout 用于在一定时间后执行特定的逻辑,第一个参数为时间到了之后要执行的函数(回调函数),第二个参数是等待时间。例如:

setTimeout(someFunction, 1000);

就会在 1000 毫秒后执行 someFunction 函数。

代码如下:

timer.js 查看完整代码
console.log('Hello World!');
setTimeout(() => {
  console.log('Hello World!');
}, 3000);
  
console.log('当前进程 ID', process.pid);
console.log('当前脚本路径', __filename);
  
const time = new Date();
console.log('当前时间', time.toLocaleString());

运行以上脚本,在我机器上的输出如下(Hello World! 会延迟三秒输出):

$ node timer.js
当前进程 ID 7310
当前脚本路径 /Users/mRc/Tutorials/nodejs-quickstart/timer.js
当前时间 12/4/2019, 9:49:28 AM
Hello World!

从上面的代码中也可以一瞥 Node.js 异步的魅力:在 setTimeout 等待的 3 秒内,程序并没有阻塞,而是继续向下执行,这就是 Node.js 的异步非阻塞!

\