process
是Nodejs操作当前进程和控制当前进程的API,并且是挂载到globalThis下面的全局API(作为一个全局对象,process
无需通过require
来引入,可以在任何地方直接使用)
API 介绍
process.arch
- 返回操作系统 CPU 架构 跟前面章节中的os.arch 一样
- 返回内容:
'arm'
、'arm64'
、'ia32'
、'mips'
、'mipsel'
、'ppc'
、'ppc64'
、's390'
、's390x'
、以及'x64'
process.platform
- 运行Node.js进程的操作系统平台,如
'darwin'
,'win32'
,'linux'
等。毕竟platform就是平台的意思
console.log(process.platform)
process.argv
- 包含启动Node.js进程时传入的命令行参数的数组。
process.argv[0]
:通常是node
的路径。process.argv[1]
:被执行的JavaScript文件的完整路径。process.argv[2]
、process.argv[3]
…:任何额外的命令行参数。
- 这个数组通常在需要解析命令行参数时使用,比如,可以通过它来实现CLI(命令行接口)工具的参数读取与处理。
使用案例
// index.js
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`);
});
//然后我在终端打印:node index.js xiaoyu-1 xiaoyu-2 xiaoyu-3
- 能够看到从数组2开始,将终端额外的命令参数输出出来了。
- 通过这里,就可以知道小满的判断命令是怎么进行的。argv获取到了终端输入的内容,然后通过JS原生的API(includes)进行三元判断是否包含该内容,再决定输出什么内容
console.log(process.argv.includes('--version') ? 'version': 'no version');
process.cwd
- 返回Node.js进程的当前工作目录(不包括当前文件)
- 其实跟
__dirname
的功能是一样的,但我们应该知道__dirname
是node的产物,在ESM模式下是用不了的。这时候就可以使用process的cwd代替一下
- 其实跟
console.log(process.cwd());
process.memoryUsage
- 返回Node.js进程的内存使用情况的对象,包括
rss
(常驻集大小)、heapTotal
、heapUsed
、external
和arrayBuffers
{
rss: 30932992, // 常驻集大小 这是进程当前占用的物理内存量,不包括共享内存和页面缓存。它反映了进程实际占用的物理内存大小
heapTotal: 4362240, //堆区总大小 这是 V8 引擎为 JavaScript 对象分配的内存量。它包括了已用和未用的堆内存
heapUsed: 3214208, //已用堆大小
external: 1118858, //外部内存使用量 这部分内存不是由 Node.js 进程直接分配的,而是由其他 C/C++ 对象或系统分配的
arrayBuffers: 10519 //是用于处理二进制数据的对象类型,它使用了 JavaScript 中的 ArrayBuffer 接口。这个属性显示了当前进程中 ArrayBuffers 的数量
}
process.exit方法
- exit:当进程准备退出时触发。
- process.exit([code]):使用指定的
code
终止当前进程。如果省略,将使用代码0
或上一个设置的退出码- 这个事件会退出当下的执行,比如下面的例子中,我在2秒的时候准备打印一句话,但在开始第一秒就退出进程了。而2秒是在1秒之后的,所以当进程一结束,2秒的定时器任务就没机会执行了
- 那为什么我的解释是当进程准备退出时触发?这好像跟我们目前案例用的方式不太一样,这是因为他同样可以当作方法来进行执行的,他既决定了退出的时机,但同时也会触发对应的方法
- 还是刚才的案例,我们加上方法,在退出的时候,触发对应的方法来提示我们进程已经结束了
setTimeout(() => {
console.log('小余2秒执行');
}, 2000);
setTimeout(() => {
process.exit()
},1000)
process.on('exit',()=>{
console.log("进程结束了");
})
process.kill方法
- 与exit类似,kill用来杀死一个进程,接受一个参数进程id可以通过process.pid 获取
- process.kill(pid, [signal]):
pid
参数是要发送信号的进程的ID,[signal]
参数是要发送的信号的名称或数字标识。如果省略了[signal]
参数,将发送默认的SIGTERM
信号
process.kill(process.pid)
kill与exit的区别
- 即时性:
process.exit()
会导致程序立即停止执行,而process.kill()
发送一个信号,被杀死的进程可以选择捕获该信号并决定如何响应(包括不响应,继续运行)。 - 控制粒度:
process.kill()
可以发送多种不同的信号,有的是用来结束进程,有的是用于进程之间的通信。而process.exit()
只是单纯地停止进程。 - 使用范围:
process.exit()
只能结束当前Node.js进程,process.kill()
可以向任何系统进程发送信号。 - 响应方式:进程可以忽略
SIGTERM
信号或在处理之前执行清理操作,但不能忽略process.exit()
的调用。
使用
exit
的场景包括:
- 正常结束程序。
- 在遇到不可恢复的错误或完成了所有任务后结束程序。
- 在命令行工具中,根据操作的成功或失败返回相应的退出码。
使用
kill
的场景包括:
- 通知一个进程结束,但结束可能不是立即的,因为进程可以捕获并处理或忽略该信号。
- 发送特定的信号给进程,可能用于其他非结束进程的目的,比如暂停(
SIGSTOP
)或继续(SIGCONT
)。- 在多进程应用程序中,一个进程可以管理其他进程的生命周期。
process.env
- 用于读取操作系统所有的环境变量,也可以修改和查询环境变量。这是最常用的API之一
- 通过下面简单的标注一点就能看出其中的对应关系
-
而通过env,也是可以修改环境变量的,但只会在当前进程生效,不会真正影响系统的环境变量。
-
在当前进程生效是什么意思?
其实就是说,我们在当前进行修改了。终端输出的是已经被我们修改的状态,但通过windows系统打开的环境变量是不会真正发生变化的,该怎么样还是怎么样
-
这个方法的用途是很多的,比如可以区分开发环境和生产环境的区别
- 这个方法其实也是很实用的,比如我们生产环境和开发环境下用的服务器不是同一个,我希望可以自动判断,而不是每次都要手动更改一下(人工操作容易失误)。
- 这种情况是很常见的,有很多的好处:
1. 隔离性:
- 安全性:生产环境通常包含敏感数据,如用户信息、支付信息等。将开发环境与生产环境分离可以降低安全风险,防止未经授权的访问或潜在的安全漏洞影响生产数据。
- 稳定性:开发环境中频繁的更改和测试可能会导致不稳定。通过分离环境,可以确保生产环境的稳定性,不受开发过程中的实验性更改影响。
2. 调试和测试:
- 开发环境通常配置有更详细的日志记录和调试工具,便于开发者诊断问题。而生产环境则可能因性能考虑而减少日志记录的详细程度。
- 开发环境允许开发者自由测试新功能和bug修复,而不会影响到最终用户的使用体验。
3. 性能优化:
- 生产环境的服务器配置和优化通常针对高性能和高可用性,以满足实际用户的需求。开发环境则可能采用较低的规格,因为它不需要处理真实的用户流量。
- 在开发环境中测试的性能调优和配置更改可以在推送到生产环境前经过彻底验证,减少生产环境的潜在问题。
4. 配置差异:
- 开发和生产环境在配置上往往有所不同,如数据库连接、API 密钥、外部服务的访问权限等。通过区分环境,可以避免将开发环境的测试配置错误地部署到生产环境。
5. 发布管理:
- 通过分离开发和生产环境,可以实现更加严格和控制的发布流程。代码从开发环境经过测试环境(和/或)预生产环境验证后,最终才会部署到生产环境。
- 这种流程可以确保只有经过充分测试并被认为是稳定的版本才会被部署到生产环境中。
6. 用户体验:
- 保证生产环境的稳定性和性能可以提供更好的用户体验。用户不会因为后台的开发测试活动而受到影响。
- 第二个方式是:通过第三方库cross-env,也可以设置对应的环境变量
process.env.NODE_ENV == 'dev' ? '开发环境' : '生产环境'//在需要判断环境的情况下这样判断
- 然后终端输出pnpm run dev或者 pnpm run build的时候,就能够判断当下的环境变量,进行我们的设置内容
总结
- 那除了上面的部分API之外,其实还有不少没有写到,在下方以表格的形式进行总结
API | 描述 |
---|---|
process.env |
包含环境变量的对象,可用于获取或设置环境变量。 |
process.argv |
包含启动 Node.js 进程时传递的命令行参数的数组。 |
process.cwd() |
返回 Node.js 进程的当前工作目录。 |
process.exit([code]) |
使用指定的退出码终止 Node.js 进程。若未指定,使用 0 表示成功。 |
process.nextTick(callback, [...args]) |
将回调函数放到下一个事件循环迭代的队列中。 |
process.uptime() |
返回 Node.js 进程已运行的秒数。 |
process.memoryUsage() |
返回一个对象,描述了 Node.js 进程的内存使用情况。 |
process.pid |
返回 Node.js 进程的 PID(进程 ID)。 |
process.platform |
返回 Node.js 进程运行所在的操作系统平台。 |
process.version |
返回 Node.js 的版本号。 |
process.versions |
返回一个对象,包含了 Node.js 和其依赖的版本号。 |
process.stdout |
一个可写流,对应于标准输出。 |
process.stderr |
一个可写流,对应于标准错误输出。 |
process.stdin |
一个可读流,对应于标准输入。 |
process.on('event', callback) |
用于绑定事件监听器,例如 exit 、uncaughtException 等事件。 |
原文链接:https://juejin.cn/post/7356812825329713202 作者:XiaoYu2002