一、是什么

process对象是一个全局变量,提供了有关当前Node.js进程的信息并对其进行控制,作为一个全局变量。
我们都知道,进程是计算机系统进行资源分配和调度的基本单位,是操作系统结构的基础,是线程的容器。当我们启动一个js文件,实际上就是开启了一个服务进程,每个进程都拥有自己的独立空间地址、数据栈,像另一个进程无法访问当前进程的变量、数据结构,只有数据通信后,进程之间才可以数据共享。
由于JavaScript是一个单线程语言,所以通过node xxx启动一个文件后,只有一条主线程。

二、属性与方法

关于process常见的属性有如下:

  • process.env:环境变量,例如通过process.env.NODE_ENV获取不同环境项目配置信息
  • process.nextTick:在谈及EventLoop时经常提到
  • process.pid:获取当前进程的 id
  • process.ppid:获取当前进程的父进程
  • process.cwd():获取当前进程工作目录
  • process.platform:获取当前进程运行的操作系统平台
  • process.uptime():当前进程已运行时间,例如:pm2 守护进程的 uptime 值
  • 进程事件:process.on(‘uncaughtException’,cb) 捕获异常信息、 process.on(‘exit’,cb)进程推出监听
  • 三个标准流:process.stdout标准输出、process.stdin标准输入、process.stderr标准错误输出
  • process.title指定进程名称,有的时候需要给进程指定一个名称

下面来介绍几个常用方法:

process.cwd()

返回当前Node进程执行的目录:
一个 node 模块 A 通过 NPM 发布,项目 B 中使用了模块 A。在 A 中需要操作 B 项目下的文件时,就可以用process.cwd()来获取 B 项目的路径。

process.argv

在终端通过Node执行命令的时候,通过process.argv可以获取传入的命令行参数,返回值是一个数组:

  • 0 :Node 路径
  • 1:被执行的 JS 文件路径
  • 2 ~ n:真实传入命令的参数

所以,我们只要从process.argv[2]开始获取就好了

  1. const args = process.argv.slice(2);

process.env

返回一个对象,存储当前环境相关的所有信息,一般很少直接用到。
一般我们会在 process.env 上挂载一些变量标识当前的环境。比如最常见的用process.env.NODE_ENV 区分developmentproduction
在 vue-cli 的源码中也经常会看到 process.env.VUE_CLI_DEBUG标识当前是不是 DEBUG 模式

process.nextTick()

我们都知道Node.js是基于事件轮询,在这个过程中,同一时间只会处理一件事情。在这种模式下,process.nextTick()就是定义出一个动作,并且让这个动作在下一个时间轮询的时间点上执行。
例如下面例子将一个foo函数在下一个时间点调用。

  1. function foo() {
  2. console.error('foo');
  3. }
  4. process.nextTick(foo);
  5. console.error('bar');

输出结果为barfoo
想要详细了解process.nextTick以及Node.jsevent loop,可以看看我这篇文章浏览器端与服务端的Event loop