源码地址。
这个包的作用是用于检测process.argv中是否含有特定的标识,用于终端参数判断还是比较多。
用法如下
$ node foo.js -f --unicorn --foo=bar -- --rainbow
// foo.js
const hasFlag = require('has-flag');
hasFlag('unicorn');
//=> true
hasFlag('--unicorn');
//=> true
hasFlag('f');
//=> true
hasFlag('-f');
//=> true
hasFlag('foo=bar');
//=> true
hasFlag('foo');
//=> false
hasFlag('rainbow');
//=> false
知识点
process.argv
process.argv返回的是一个数组,其中包含node进程启动时候传入的参数。
第一个参数是process.execPath,指的是启动node进程的可执行文件的绝对路径。
第二个参数是正在被执行文件的绝对路径。
后面参数依次是传入的参数,参数之间按照空格区分。
$ node source.js -f --unicorn --foo=bar -- --rainbow
console.log(process.argv)
[
'/usr/local/bin/node',
'/Users/xuyizong/Documents/code/tets/source.js',
'-f',
'--unicorn',
'--foo=bar',
'--',
'--rainbow'
]
源码
'use strict';
module.exports = (flag, argv = process.argv) => {
// flag:判断的特定标示或者参数
// argv 默认process.argv 或者自己传入string[]
// 处理flag的前缀、建议还是自带前缀比较好
const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
const position = argv.indexOf(prefix + flag);
const terminatorPosition = argv.indexOf('--');
return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
};
process.stderr、process.stdout
这里扩展介绍这两个属性,后面讲述另外一个包会用到。
process.stderr属性会返回连接到stderr(文件描述符2) 的流。它是一个net.Socket(也就是Duplex流),除非文件描述符2指向文件(在这种情况下它是一个Writable流)。
process.stderr.fd // 2 获取process.stderr的文件描述符的值、这个值有些场景用得上
process.stdout属性会返回连接到stdout(文件描述符1) 的流。 它是一个net.Socket(也就是Duplex流),除非文件描述符1指向文件(在这种情况下它是一个Writable流)。
process.stdout.fd // 1
process.stdout、process.stderr它们分别被用于 console.log() 和 console.error() 内部。
因此
> tty.isatty(1)
true
> tty.isatty(2)
true
好了,今天就到这结束了,下期见。
ps:如果你对node也有兴趣,欢迎关注我公众号:xyz编程日记。