每天一个npm包:has-flag

742 阅读1分钟

源码地址

这个包的作用是用于检测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编程日记。