成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

node.js命令行教程

lucas / 577人閱讀

摘要:命令行教程本文先介紹原生的實(shí)現(xiàn)命令行交互,了解原生的然后通過和實(shí)現(xiàn)一個(gè)完整的交互命令行工具。它是一個(gè)流也就是雙工流,除非指向一個(gè)文件,在這種情況下它是一個(gè)可讀流。命令行界面的完整解決方案,受啟發(fā)。

node 命令行教程

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

process (進(jìn)程)

process對象是一個(gè)全局變量,它提供了當(dāng)前node.js進(jìn)程的信息并對其控制。因?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.js
console.log(process.argv)

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

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

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

//  argv.js
console.log(process.argv)

let argvs = process.argv

let param = argvs.splice(2)
if(param[0] && param[0] == "--name"){
  if(param[1]){
    console.log(`hello ${param[1]}`)
  }else{
    console.log("請輸入name")
  }
}

運(yùn)行argv.js

node argv.js --name zhu
## 輸出
[ "/usr/local/bin/node",
  "/Users/zhuhuilong/Node/Book/argv.js",
  "--name",
  "zhu" ]
hello zhu
param [ "--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)為舊模式。

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

新建inputout.js

// inputout.js
process.stdin.setEncoding("utf8")

let argvs = process.argv

let param = argvs.splice(2)
if (param[0] && param[0] == "--name") {
  if (param[1]) {
    console.log(`hello ${param[1]}`)
  } else {
    process.stdout.write(`請輸入name:`)
    process.stdin.resume()
    process.stdin.on("data", chunk => {
      if (!!chunk.replace(/[
]/g, "")) {
        process.stdout.write(`你輸入的name是: ${chunk}`)
        process.stdin.emit("end")
      } else {
        process.stdout.write(`請輸入name:`)
      }
    })
  }
}

process.stdin.on("end", () => {
  process.stdout.write("結(jié)束
")
})

>執(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ù)對其進(jìn)行處理交互,但如果要實(shí)現(xiàn)更復(fù)雜的命令交互,使用上面的方法會很吃力。下面我們使用commander.js和inquirer來實(shí)現(xiàn)一個(gè)完整的node命令行工具(創(chuàng)建項(xiàng)目模版)。

commander.js

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

commander.js的API簡述

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 ") //<>必選參數(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  [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 ")
  .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è)通用交互式命令行用戶界面的集合。具有常用的控制臺交互操作。

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

type:表示提問的類型,包括:input, confirm, list, rawlist, expand, checkbox, password, editor;

name: 存儲當(dāng)前問題回答的變量;

message:問題的描述;

default:默認(rèn)值;

choices:列表選項(xiàng),在某些type下可用,并且包含一個(gè)分隔符(separator);

validate:對用戶的回答進(jìn)行校驗(yàn);

filter:對用戶的回答進(jìn)行過濾處理,返回處理后的值;

transformer:對用戶回答的顯示效果進(jìn)行處理(如:修改回答的字體或背景顏色),但不會影響最終的答案的內(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: "請選擇一種模版",
    name: "template",
    choices: ["vue", "angular", "webpack-m-pages"],
    filter: function(val) {
      return val.toLowerCase()
    }
  }
]

program
  .version(pkg.version)
  .command("create ")
  .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

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

#!/usr/bin/env node

require("../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、測試

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/109845.html

相關(guān)文章

  • 從零開始打造個(gè)人專屬命令工具集——yargs完全指南

    摘要:自阮大神的文章發(fā)布以來,有了一些改動(dòng),添加有很多有用的功能,特別是這個(gè)功能,對打造命令行工具集合非常有用,所以寫一個(gè)新版本的教程還是有必要的。 前言 使用命令行程序?qū)Τ绦騿T來說很常見,就算是前端工程師或者開發(fā)gui的,也需要使用命令行來編譯程序或者打包程序 熟練使用命令行工具能極大的提高開發(fā)效率,linux自帶的命令行工具都非常的有用,但是這些工具都是按照通用需求開發(fā)出來的,如果有一些...

    wanghui 評論0 收藏0
  • 如何將命令參數(shù)傳遞給Node.js程序

    摘要:標(biāo)準(zhǔn)方法參數(shù)存在在中更多詳情,可以參考官方鏈接。是一個(gè)包含命令行參數(shù)的數(shù)組。第一個(gè)元素是,第二個(gè)元素是文件的名稱。接下來的元素將是任何附加的命令行參數(shù)。時(shí)間年月日前端教程打印將會輸出以下結(jié)果時(shí)間年月日前端教程 標(biāo)準(zhǔn)方法參數(shù)存在在process.argv中 更多詳情,可以參考官方鏈接。 process.argv 是一個(gè)包含命令行參數(shù)的數(shù)組。第一個(gè)元素是node,第二個(gè)元素是JavaScr...

    jzman 評論0 收藏0
  • Node Hero】5. Node.js 數(shù)據(jù)庫教程

    摘要:是一種設(shè)計(jì)用于關(guān)系型數(shù)據(jù)庫的查詢語言。另一方面,數(shù)據(jù)庫在最近十年變得相當(dāng)流行。大多數(shù)數(shù)據(jù)庫都有驅(qū)動(dòng)程序可以用,它們在上也有庫。我們已經(jīng)完成了在中使用數(shù)據(jù)庫所必須知道的所有基礎(chǔ)知識。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1751原文:https://blog.risingstack.com/node-js-database-t...

    Hujiawei 評論0 收藏0
  • Vue項(xiàng)目環(huán)境搭建教程

    摘要:項(xiàng)目環(huán)境搭建教程針對開發(fā)工具等一下載和下載鏈接中文官網(wǎng)下載好之后使用命令行再次確認(rèn)查看順便看看內(nèi)置的版本如果是非安裝包形式,安裝的直接解壓的,不是程序安裝的形式,需要配置環(huán)境變量,必要時(shí)還需要配置要使用的版本出 ...

    darkbaby123 評論0 收藏0
  • NODEJS如何發(fā)送以太坊交易

    摘要:是將與以太坊交互的模塊。在路由器內(nèi)部我需要我的以太坊地址,我將發(fā)送我的交易地址,合約地址和合約。你可以通過以太坊錢包或搜索合約。我們?yōu)橐蕴粍?chuàng)建了我們的一個(gè)極小的后端。 注意:在本教程中我使用web3js 1.0版本 大家好,我將解釋如何從NodeJS后端發(fā)送交易。我將使用rinkeby testnet并將創(chuàng)建一個(gè)路由器,還添加一些節(jié)點(diǎn)模塊并使用infura http接口來完成教程...

    付倫 評論0 收藏0

發(fā)表評論

0條評論

lucas

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<