process
process.env
// NODE_ENV=production node app.js
// NODE_ENV=dvelopment node app.js
if(process.env.NODE_ENV === 'production'){
console.log('生產(chǎn)環(huán)境');
}else{
console.log('非生產(chǎn)環(huán)境');
}
process.nextTick(fn)
- process.nextTick將放在node事件循環(huán)的下次tick中
- process.nextTick(fn)比setTimeout的性能要更高
// 執(zhí)行結(jié)果: s1 s2 ss
console.log('s1');
process.nextTick(function(){
console.log('ss');
});
console.log('s2');
process.argv
即獲取命令行:node + 文件 + 參數(shù), 如下:
// NODE_ENV=development node argv.js --env production
process.argv.forEach(function(val, index, array) {
console.log('參數(shù)' + index + ': ' + val);
});
// 參數(shù)傳入env為production,但更改process.env.NODE_ENV為development
process.cwd()\process.chdir()
// 獲取當(dāng)前路徑
console.log('Starting directory: ' + process.cwd());
try {
// 切換到tmp下,沒有即創(chuàng)建
process.chdir('/tmp');
console.log('New directory: ' + process.cwd());
}catch (err) {
console.log('chdir: ' + err);
}
process.connect()與process.disconnect()
var child_process = require('child_process');
child_process.fork('./connectedChild.js', {
stdio: 'inherit'
});
// connectedChild.js
console.log( 'process.connected: ' + process.connected );
process.disconnect();
console.log( 'process.connected: ' + process.connected );
// 輸出:
// process.connected: true
// process.connected: false
標(biāo)準(zhǔn)輸入輸出信息和錯(cuò)誤信息的處理 process.stdin、process.stdout、process.stderr
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
var chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write(`data: ${chunk}`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
系統(tǒng)相關(guān)信息
- 運(yùn)行情況/資源占用情況: process.uptime()、process.memoryUsage()
- 進(jìn)程信息: process.pid\title
- 用戶/組信息:process.seteuid(id)、 process.geteuid().........
- 環(huán)境信息: process. platform:返回關(guān)于平臺(tái)描述的字符串,比如 darwin、win32 等。
- 處理器信息: process.arch: 返回當(dāng)前系統(tǒng)的處理器架構(gòu)(字符串),比如'arm', 'ia32', or 'x64'。
子進(jìn)程相關(guān)功能
const spawn = async (...args) => {
const { spawn } = require('child_process');
return new Promise(resolve => {
const proc = spawn(...args)
proc.stdout.pipe(process.stdout)
proc.stderr.pipe(process.stderr)
proc.on('close', () => {
resolve()
})
})
}
// 執(zhí)行spawn('npm', ['install'], { cwd: `./${name}` })
1.exec - child_process.exec 使用子進(jìn)程執(zhí)行命令,緩存子進(jìn)程的輸出,并將子進(jìn)程的輸出以回調(diào)函數(shù)參數(shù)的形式一次性返回。exec方法會(huì)從子進(jìn)程中返回一個(gè)完整的buffer。默認(rèn)情況下,這個(gè)buffer的大小應(yīng)該是200k。如果子進(jìn)程返回的數(shù)據(jù)大小超過了200k,程序?qū)?huì)崩潰,同時(shí)顯示錯(cuò)誤信息“Error:maxBuffer exceeded”。你可以通過在exec的可選項(xiàng)中設(shè)置一個(gè)更大的buffer體積來解決這個(gè)問題,但是你不應(yīng)該這樣做,因?yàn)閑xec本來就不是用來返回很多數(shù)據(jù)的方法。
2.spawn - child_process.spawn 使用指定的命令行參數(shù)創(chuàng)建新進(jìn)程。spawn 會(huì)返回一個(gè)帶有stdout和stderr流的對(duì)象。你可以通過stdout流來讀取子進(jìn)程返回給Node.js的數(shù)據(jù)。stdout擁有’data’,’end’以及一般流所具有的事件。當(dāng)你想要子進(jìn)程返回大量數(shù)據(jù)給Node時(shí),比如說圖像處理,讀取二進(jìn)制數(shù)據(jù)等等,你最好使用spawn方法。
3.fork - child_process.fork 是 spawn()的特殊形式,用于在子進(jìn)程中運(yùn)行的模塊,如 fork(‘./son.js’) 相當(dāng)于 spawn(‘node’, [‘./son.js’]) 。與spawn方法不同的是,fork會(huì)在父進(jìn)程與子進(jìn)程之間,建立一個(gè)通信管道,通過process.send和on("message")通信。