国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

node.js命令行教程圖文詳解

2019-11-19 11:28:06
字體:
供稿:網(wǎng)友

本文先介紹原生的node.js實(shí)現(xiàn)命令行交互,了解原生的api,然后通過commander.js和inquirer.js實(shí)現(xiàn)一個(gè)完整的交互命令行工具。

項(xiàng)目地址

process (進(jìn)程)

process對(duì)象是一個(gè)全局變量,它提供了當(dāng)前node.js進(jìn)程的信息并對(duì)其控制。因?yàn)槠涫且粋€(gè)全局變量所以無需在文件中引入。

需要用到的幾個(gè)api

  • process.argv
  • process.cwd()
  • process.stdin
  • process.stdout
  • process.stdin.resume()
  • process.argv

process.argv

屬性返回一個(gè)數(shù)組。數(shù)組的第一個(gè)值是process.execPath,第二個(gè)是正在執(zhí)行的JavaScript的文件路徑,其余參數(shù)為其它命令參數(shù),這是我們來自定義命令的關(guān)鍵。

示例

新建argv.js

// argv.jsconsole.log(process.argv)

執(zhí)行node命令node argv.js

node argv.js --name zhu## 輸出[ '/usr/local/bin/node', ## 執(zhí)行當(dāng)前腳本的Node二進(jìn)制文件的絕對(duì)路徑 '/Users/zhuhuilong/Node/Book/argv.js', ## 文件的絕對(duì)路徑 '--name', ## 其余參數(shù) 'zhu' ]

接收自定義的命令參數(shù)進(jìn)行處理輸出

// argv.jsconsole.log(process.argv)let argvs = process.argvlet param = argvs.splice(2)if(param[0] && param[0] == '--name'){ if(param[1]){ console.log(`hello ${param[1]}`) }else{ console.log('請(qǐng)輸入name') }}

運(yùn)行argv.js

node argv.js --name zhu## 輸出[ '/usr/local/bin/node', '/Users/zhuhuilong/Node/Book/argv.js', '--name', 'zhu' ]hello zhuparam [ '--name', 'zhu' ]

process.stdin與process.stdout

process.stdin(標(biāo)準(zhǔn)輸入)

process.stdin 屬性返回連接到 stdin (fd 0) 的流。 它是一個(gè) net.Socket 流(也就是雙工流),除非 fd 0 指向一個(gè)文件,在這種情況下它是一個(gè)可讀流。

process.stdout(標(biāo)準(zhǔn)輸出)

process.stdout 屬性返回連接到 stdout (fd 1) 的流。 它是一個(gè) net.Socket 流(也就是雙工流),除非 fd 1 指向一個(gè)文件,在這種情況下它是一個(gè)可寫流。

process.stdin.resume()

  • 一個(gè)指向 標(biāo)準(zhǔn)輸入流(stdin) 的可讀流(Readable Stream)。標(biāo)準(zhǔn)輸入流默認(rèn)是暫停 (pause) 的,所以必須要調(diào)用 process.stdin.resume() 來恢復(fù) (resume) 接收。
  • 作為流,process.stdin可以在舊模式下使用。為了兼容node v0.10以前的版本。在舊模式喜愛使用stdin必須調(diào)用process.stdin.resume()。注意如果調(diào)用了process.stdin.resume() stdin將轉(zhuǎn)為舊模式。

通俗來講就是控制臺(tái)等待我們輸入內(nèi)容不退出進(jìn)程,對(duì)輸入輸出進(jìn)行交互。

新建inputout.js

// inputout.jsprocess.stdin.setEncoding('utf8')let argvs = process.argvlet param = argvs.splice(2)if (param[0] && param[0] == '--name') { if (param[1]) { console.log(`hello ${param[1]}`) } else { process.stdout.write(`請(qǐng)輸入name:`) process.stdin.resume() process.stdin.on('data', chunk => {  if (!!chunk.replace(/[/r/n]/g, '')) {  process.stdout.write(`你輸入的name是: ${chunk}`)  process.stdin.emit('end')  } else {  process.stdout.write(`請(qǐng)輸入name:`)  } }) }}process.stdin.on('end', () => { process.stdout.write('結(jié)束/n')})

>執(zhí)行node inputout.js --name

備注

在新版本node模式下可以使用process.stdin.on("readable",()=>{})代替process.stdin.resume()恢復(fù)輸入流接收。

示例:

process.stdin.on("readable", () => { var chunk = process.stdin.read(); console.log(typeof(chunk)) if (chunk !==null) { process.stdout.write(`data: ${chunk}`); process.stdin.emit("end"); }});process.stdin.on("end", () => { process.stdout.write("end");});

從上面的示例我們可以拿到process.argv參數(shù)對(duì)其進(jìn)行處理交互,但如果要實(shí)現(xiàn)更復(fù)雜的命令交互,使用上面的方法會(huì)很吃力。下面我們使用commander.js和inquirer來實(shí)現(xiàn)一個(gè)完整的node命令行工具(創(chuàng)建項(xiàng)目模版)。

commander.js

node.js命令行界面的完整解決方案,受Ruby Commander啟發(fā)。

commander.js的API簡(jiǎn)述

program.version() 聲明版本

const program = require('commander')const pkg = require('../package.json')program.version(pkg.version)

Options 解析

使用.option()方法定義commander的選項(xiàng)options,也可以作為選項(xiàng)的文檔。

var program = require('commander'); program .version('0.1.0') .option('-p, --peppers', 'Add peppers') .option('-P, --pineapple', 'Add pineapple') .option('-b, --bbq-sauce', 'Add bbq sauce') .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') .parse(process.argv); console.log('you ordered a pizza with:');if (program.peppers) console.log(' - peppers');if (program.pineapple) console.log(' - pineapple');if (program.bbqSauce) console.log(' - bbq');console.log(' - %s cheese', program.cheese);

添加自定義命令program.command()

var program = require('commander'); program .command('rm <dir>') //<>必選參數(shù),如果是[]則是可選參數(shù) .option('-r, --recursive', 'Remove recursively') .action(function (dir, cmd) { console.log('remove ' + dir + (cmd.recursive ? ' recursively' : '')) }) program.parse(process.argv)// command()可變參數(shù)/** 命令command有且只有最后一個(gè)參數(shù)可變不固定的。 要使參數(shù)變量可變,必須將...附加到參數(shù)名稱。**/program .version('0.1.0') .command('rmdir <dir> [otherDirs...]') .action(function (dir, otherDirs) { console.log('rmdir %s', dir); if (otherDirs) {  otherDirs.forEach(function (oDir) {  console.log('rmdir %s', oDir);  }); } });program.parse(process.argv);

program.action() 定義命令的回調(diào)函數(shù)

var program = require("commander");program .command("rm <dir>") .option("-r, --recursive", "Remove recursively") .option("-f, --force", "remove force") .action(function(dir, cmd) { // cmd為option參數(shù)選項(xiàng) //console.log('cmd',cmd) if (cmd.recursive) {  console.log("remove " + dir + " recursively"); } if (cmd.force) {  console.log("remove " + dir + " forcefully"); } });program.parse(process.argv);

inquirer.js

Inquirer.js 使用NodeJs做的一個(gè)通用交互式命令行用戶界面的集合。具有常用的控制臺(tái)交互操作。

由于交互的問題種類不同,inquirer為每個(gè)問題提供很多參數(shù):

  • type:表示提問的類型,包括:input, confirm, list, rawlist, expand, checkbox, password, editor;
  • name: 存儲(chǔ)當(dāng)前問題回答的變量;
  • message:?jiǎn)栴}的描述;
  • default:默認(rèn)值;
  • choices:列表選項(xiàng),在某些type下可用,并且包含一個(gè)分隔符(separator);
  • validate:對(duì)用戶的回答進(jìn)行校驗(yàn);
  • filter:對(duì)用戶的回答進(jìn)行過濾處理,返回處理后的值;
  • transformer:對(duì)用戶回答的顯示效果進(jìn)行處理(如:修改回答的字體或背景顏色),但不會(huì)影響最終的答案的內(nèi)容;
  • when:根據(jù)前面問題的回答,判斷當(dāng)前問題是否需要被回答;
  • pageSize:修改某些type類型下的渲染行數(shù);
  • prefix:修改message默認(rèn)前綴;
  • suffix:修改message默認(rèn)后綴。
  • 創(chuàng)建cli.js
const program = require('commander')const inquirer = require('inquirer')const fs = require('fs')const path = require('path')const pkg = require('../package.json')const CWD = process.cwd()const promptList = [ { type: 'list', message: '請(qǐng)選擇一種模版', name: 'template', choices: ['vue', 'angular', 'webpack-m-pages'], filter: function(val) {  return val.toLowerCase() } }]program .version(pkg.version) .command('create <dir>') .description('create project template') .action(function(dir, cmd) { const TEMPLATE_PATH = path.join(CWD, dir) if (fs.existsSync(TEMPLATE_PATH)) { } else {  fs.mkdirSync(TEMPLATE_PATH) } if (dir) {  inquirer.prompt(promptList).then(anwsers => {  console.log(anwsers)  }) } })program.parse(process.argv)

運(yùn)行 node cli/cli.js create vue

已經(jīng)可以運(yùn)行了,我們自定義一個(gè)命名替代每次都執(zhí)行node

命令為:test-cli create <dir>

1、創(chuàng)建bin文件夾,在bin文件夾下創(chuàng)建index.js文件

#!/usr/bin/env noderequire('../cli/cli')

2、修改package.json文件

添加bin選項(xiàng)

"bin": { "test-cli": "./bin/index.js" },

3、執(zhí)行npm link (如果沒有權(quán)限,執(zhí)行sudo npm link)

4、測(cè)試

5、發(fā)布 npm publish (如果未登錄需先 npm login登錄)

6、發(fā)布完畢,需npm unlink解除本地的命令映射

npm install -g XXX

總結(jié)

以上所述是小編給大家介紹的node.js命令行教程圖文詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 清新县| 济南市| 长白| 虞城县| 奎屯市| 临潭县| 东丽区| 滨州市| 西安市| 上蔡县| 富蕴县| 临邑县| 眉山市| 大英县| 重庆市| 义马市| 兴宁市| 同仁县| 罗甸县| 淄博市| 饶阳县| 庆阳市| 连江县| 延寿县| 巨鹿县| 遂溪县| 娱乐| 封丘县| 福贡县| 焦作市| 石台县| 徐水县| 长寿区| 新乡县| 承德市| 葵青区| 大田县| 潜山县| 乌拉特后旗| 怀安县| 安泽县|