Process(进程)
process 对象是一个全局变量,它提供有关当前 Node.js 进程的信息并对其进行控制。 作为一个全局变量,它始终可供 Node.js 应用程序使用,提供了获取node.js进程的信息,提供了控制nodejs进程的方法,无需使用 require()。
几个属性和方法
在这里我们提供几个属性和方法让大家对process有一个基本的了解。分别如下:
- process.argv: 返回一个数组,其中包含当启动 Node.js 进程时传入的命令行参数。
- process.cwd(): 返回 Node.js 进程的当前工作目录(也就是你当前执行的.js文件所在的目录)。
- process.env : 返回包含用户环境的对象。
- process.stdin:标准输入流
- process.stdout:标准输出流
- process.exit([code]) : 以退出状态 code 指示 Node.js 同步地终止进程,code的默认值为:0。
process.argv
返回一个数组,其中包含当启动 Node.js 进程时传入的命令行参数。
console.log(process.argv);
输出结果
[
'C:\\Program Files\\nodejs\\node.exe',
'F:\\node\\process\\process2.js'
]
返回结果是一个数组,数组中的每一个元素的含义:
- 元素1:执行该 node 程序文件的解析器是谁
- 元素2:是哪一个 .js 文件被执行
那么我获取到这些信息有什么用呢?
这里的信息其实非常更有用,想想看,我们是不是经常会在cmd中输入一些这样的命令
npm install xxx -d-s // 安装某个模块 -d为以开发模式 -s为将当前模块写入开发依赖中
node -v // 输出node的版本号
上面的控制台指令在前端程序员眼中是十分常见的,但是可能很少有人真正了解过指令中的"-d-s"或"-v"这些东西是怎么被识别的。
我们在控制台输入这个指令:
node process2.js -v
上面指令的意思是执行process2.js这个文件,但是后面带了个参数 "-v",这时候指令的含义就变了,现在指的是:查看process2.js这个程序的版本号。
我现在在我的 process2.js 程序中写入这么一段代码:
console.log(process.argv)
let arr = process.argv;
if( arr.includes("-v") ){
console.log("v- 1.0.0")
}
你会在控制tau发现这些结果:
// console.log(process.argv) 的打印结果
[
'C:\\Program Files\\nodejs\\node.exe',
'F:\\node\\process\\process2.js',
'-v'
]
// 版本号
v- 1.0.0
process.cwd()
process.cwd(): 返回 Node.js 进程的当前工作目录(也就是你当前执行的.js文件所在的目录)。
这个方法很好理解,话不多说直接上代码:
console.log(process.cwd);
输出结果
F:\node\process
函数的记过就是我们process2.js这个文件当前所在的目录路径。
process.env : 返回包含用户环境的对象。
process.env : 返回包含用户环境的对象。
这个属性返回的就是当前用户的环境变量组成的一个javascript对象,依然可以在控制台打印查看结果。
看到的结果和我们在cmd中直接出入set看见的结果是一样的,因为每个人电脑的环境变量不一样并且我这里环境变量太多就不展示出来了。
那么这个帮助我们查看系统的环境变量的属性到底有什么用呢?
常见用法可以是这样的:
- 需求:要求程序在开发模式下打印警告和错误信息
- 需求:要求程序在生产模式下不打印警告和错误信息
这时候就到了process.env表演的时刻了。
process.env.mood = "development"; // 当前模式设置成开发模式
process.env.mood = "production"; // 当前模式设置成生产模式
if(process.env.mood === "decelopment") {
// 按照开发模式执行程序
console.log("开发模式")
}else if(process.env.mood === "production"){
// 按照生产模式执行程序
console.log("生产模式")
}else{
// 按照默认模式执行程序
console.log("默认模式")
}
除了上面给大家演示的这种用法你也可以这样玩。
在开发的时候我们可能会和java组一起合作,如果java组人数较少,效率较慢,等待接口的时候你一般都会自己去先去模拟一个接口,等到java那边接口写好了之后再去调用他们的接口,这时候你会发现频繁的修改接口是很头疼的事情,所以你也可以通过设置环境变量的方式来实现两套接口的来回切换。
process.stdout
process.stdout:标准输出流。 我们的数据在计算机中都是像水流一样的存在的,一些数据从A点到B点其实就是像水流一样“慢慢”流过去的,当然这个慢是相对的,一般我们在使用迅雷的下载超大文件的时候就能看的出来,假如一个文件很大,下载需要1小时,其实就是管道比较小水又太多只能靠时间慢慢流过去。
那这里的输出流又是怎么回事呢?下面这段代码展示给你看:
process.stdout.write("Hello Node.js");
当你执行这段代码的时候你会发现在cmd中输出了文字:"Hello Node.js"。
很显然上面的代码跟console.log()的功能是一样的,没错!console.log()的实现就是靠 process.stdout 。
process.stdin
process.stdin:标准输入流。
看完了标准输出流我们再来看一下输入流,顾名思义就是收集数据的流,这个流的使用可以通过 data 事件来触发,代码如下:
process.stdin.on("data",function(data){
console.log(data)
});
执行了该程序后cmd中会出现程序挂起的状态,这个状态就是让你在cmd中输入一些数据的,例如我输入了abcd,注意输入完成之后需要按下回车表示输入数据的动作结束了。
此时在cmd中输出:
<Buffer 61 62 63 64 0d 0a>;
cmd中输出的结果是一个Buffer二进制的数据,前面四个数字对应的应该是abcd四个字符在Buffer中的二进制表示形式,但是后面还有0d 和0a是怎么回事呢?
这里要跟大家说一下我使用的是windows操作系统,在windows中换行符为:\r\n。
所以后面两个数据对应的结果应该是:
- \r : 0d
- \n : 0a
到了这里我们的程序依然还是挂起的,它还在等待你的再次输入,如果想要终止程序可以在cmd中按下:ctrl+c。
仿npm init实现一个package.json
学到了这里我们其实就可以模仿咱们的npm init初始化项目的操作了,如果以前从来没有接触过node的同学这里可以直接略过,等到学完npm和fs模块之后再来学习。
程序代码:
// 导入fs模块
const fs = require("fs")
// 获取当前程序的目录名
let project_name = process.cwd().split("\\")[process.cwd().split("\\").length-1]
// 设置项目的默认模式为开发模式
let mood = "dev"
// 初始化json对象
const obj = {
project_name, // 如果用户不写项目名称那么就使用当前项目的目录名作为项目名称
author:"", // 项目作者默认为空字符串
mood
}
new Promise(resolve=>{
process.stdout.write("请输入项目名称")
process.stdout.write("\n")
// once:表示此输入流只打开一次,避免重复监听后面的数据
process.stdin.once("data",data=>{
obj.project_name = data.toString().slice(0,data.toString().length-2) || obj.project_name
resolve()
})
})
.then(data=>{
return new Promise(resolve=>{
process.stdout.write("请输入作者名称")
process.stdout.write("\n")
process.stdin.once("data",data=>{
obj.author = data.toString().slice(0,data.toString().length-2) || obj.author
resolve()
})
})
}).then(data=>{
return new Promise(resolve=>{
process.stdout.write("请指定模式")
process.stdout.write("\n")
process.stdin.once("data",data=>{
obj.mood = data.toString().slice(0,data.toString().length-2) || obj.mood
resolve()
})
})
}).then(data=>{
// 将数据写入指定的 package.json 文件中
fs.writeFile("./package.json",JSON.stringify(obj),err=>{
if(err) console.log(err)
process.exit()// 关闭当前进程
})
});
在cmd中开始执行程序之后就会让你输入项目名称,作者名,指定模式。
输入完毕之后会在程序的根目录下创建一个叫做:package.json的文件,文件中的内容就是我们之前在cmd输入的内容。
process.exit([code])
process.exit([code]) : 以退出状态 code 指示 Node.js 同步地终止进程,code的默认值为:0。
当这个函数被执行的时候就相当于我们在cmd中按下 ctrl+c,表示结束当前的程序。
结束语
process对象中我们看见的很多的东西都是和操作系统有关,事实上在Node.js中的os(操作系统)模块和process模块很一些方法几乎就是等价的,例如:
- process.arch() => os.arch() : 返回为其编译 Node.js 二进制文件的操作系统的 CPU 架构。
- process.platform() => os.platform() : 返回标识操作系统平台的字符串。 该值在编译时设置。
我们也可以利用process对象来实现比package.json更高级的东西,例如像vue-cli这样的高级应用。