[Node.js] 02 - Read Eval Print Loop

視頻課程:帶你入門Nodejs,說起了很是多的後端知識點javascript

  • 發佈時間: 2017年10月7日
  • 課程時長:193 分鐘
  • 類別:後端
  • 課時:22

 

npm Resource: html

npm模塊管理器【阮一峯】java

npm.com【官網】node

 

 

從這裏開始:Node.js 命令行程序開發教程git


 

命令行交互任務

  • 讀取 - 讀取用戶輸入,解析輸入了Javascript 數據結構並存儲在內存中。shell

  • 執行 - 執行輸入的數據結構npm

  • 打印 - 輸出結果json

  • 循環 - 循環操做以上步驟直到用戶兩次按下 ctrl-c 按鈕退出。後端

 

加入環境變量

$ ./hello
hello world

//更爲簡單的執行
$ hello
hello world

執行步驟:bash

Step 1, 在當前目錄下新建 package.json

{
"name": "hello", "bin": { "hello": "hello" } }


$ npm linkStep 2, run this.

 

命令行參數

process.argv[...] 獲取參數。

#!/usr/bin/env node
console.log('hello ', process.argv[2]);

 

新建進程

child_process模塊:node.js是基於單線程模型架構,這樣的設計能夠帶來高效的CPU利用率,可是沒法卻利用多個核心的CPU,爲了解決這個問題,node.js提供了child_process模塊。

#!/usr/bin/env node
var name = process.argv[2];
var exec = require('child_process').exec;

var child = exec('echo hello ' + name, function(err, stdout, stderr) {
  if (err) throw err;
  console.log(stdout);
});

 

Shell的調用

安裝 ---->

npm install --save shelljs

shelljs 模塊從新包裝了 child_process,調用系統命令更加方便。它須要安裝後使用。

#!/usr/bin/env node
var name = process.argv[2];
var shell = require("shelljs");

shell.exec("echo hello " + name);  // 非全局模式,有點是函數模式

全局模式容許直接在腳本中寫 shell 命令。

require('shelljs/global');

if (!which('git')) {
  echo('Sorry, this script requires git');
  exit(1);
}

mkdir('-p', 'out/Release');
cp('-R', 'stuff/*', 'out/Release');

cd('lib');
ls('*.js').forEach(function(file) {
  sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
  sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file);
  sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file);
});
cd('..');

if (exec('git commit -am "Auto-commit"').code !== 0) {
  echo('Error: Git commit failed');
  exit(1);
}

  

Shell的參數處理

安裝 ----> 

$ npm install --save yargs

yargs 模塊yargs 模塊可以解決如何處理命令行參數

#!/usr/bin/env node
var argv = require('yargs').argv;

console.log('hello ', argv.name);

方便提取參數。

$ hello --name=tom
hello tom

$ hello --name tom
hello tom

進一步,支持多個別名(短參數,長參數)。

#!/usr/bin/env node
var argv = require('yargs')
  .alias('n', 'name')      # 指定 name 是 n 的別名
  .argv;

console.log('hello ', argv.n); 

更爲奇巧的,console.log(argv._),能夠獲取非連詞線開頭的參數

$ hello A -n tom B C
hello  tom
[ 'A', 'B', 'C' ]

 

命令行參數的配置

  • demand:是否必選
  • default:默認值
  • describe:提示

更多參數處理選項

#!/usr/bin/env node
var argv = require('yargs')
  .demand(['n'])          // n參數不可省略
  .default({n: 'tom'})    // 且默認值爲tom 
  .describe({n: 'your name'})
  .argv;

console.log('hello ', argv.n);

options 方法容許將全部這些配置寫進一個對象,{ }內就不用再寫那麼多重複的"n"了。

#!/usr/bin/env node
var argv = require('yargs')
  .option('n', {
    alias : 'name',
    demand: true,
    default: 'tom',
    describe: 'your name',
    type: 'string'
  })
  .argv;

console.log('hello ', argv.n);

  

判斷有沒有該參數

能夠用 boolean 方法指定這些參數返回布爾值。

#!/usr/bin/env node
var argv = require('yargs')
  .boolean(['n'])
  .argv;

console.log('hello ', argv.n);

有該參數,返回true;不然,返回false。

$ hello
hello  false
$ hello -n
hello  true
$ hello -n tom
hello  true

boolean 方法也能夠做爲屬性,寫入 option 對象。

#!/usr/bin/env node
var argv = require('yargs')
  .option('n', {
    boolean: true
  })
  .argv;

console.log('hello ', argv.n);

 

幫助信息

yargs 模塊提供如下方法,生成幫助信息。

usage:  用法格式
example:提供例子
help:   顯示幫助信息
epilog: 出如今幫助信息的結尾 

但願達到的效果:

$ hello -h

Usage: hello [options]

Options:
  -f, --name  your name [string] [required] [default: "tom"]
  -h, --help  Show help [boolean]

Examples:
  hello -n tom  say hello to Tom

copyright 2015

實現方式:

#!/usr/bin/env node
var argv = require('yargs')
  .option('f', {
    alias : 'name',
    demand: true,
    default: 'tom',
    describe: 'your name',
    type: 'string'
  })
  .usage('Usage: hello [options]')
  .example('hello -n tom', 'say hello to Tom')
  .help('h')
  .alias('h', 'help')
  .epilog('copyright 2015')
  .argv;

console.log('hello ', argv.n);

 

子命令

yargs 模塊還容許經過 command 方法,設置 Git 風格的子命令。 

$ hello morning -n tom
Good Morning
hello tom

實現方式就是使用兩次command(...),或者再與 shellojs 模塊結合起來

#!/usr/bin/env node
require('shelljs/global');
var argv = require('yargs') .command("morning", "good morning", function (yargs) { echo("Good Morning"); }) .command("evening", "good evening", function (yargs) { echo("Good Evening"); }) .argv; console.log('hello ', argv.n);

 

子命令設置各自的參數形式:

每一個子命令每每有本身的參數,這時就須要在回調函數中單獨指定。回調函數中,要先用 reset 方法重置 yargs 對象。

#!/usr/bin/env node
require('shelljs/global');
var argv = require('yargs') .command("morning", "good morning", function (yargs) { echo("Good Morning");
var argv = yargs.reset() .option("m", { alias: "message", description: "provide any sentence" }) .help("h") .alias("h", "help") .argv; echo(argv.m); }) .argv;

用法以下:

$ hello morning -m "Are you hungry?"
Good Morning
Are you hungry?

 

其餘事項

(1)返回值

根據 Unix 傳統,程序執行成功返回 0,不然返回 1 。

if (err) { process.exit(1); } else { process.exit(0); } 

 

(2)重定向

Unix 容許程序之間使用管道重定向數據。

$ ps aux | grep 'node' 

腳本能夠經過監聽標準輸入的data 事件,獲取重定向的數據。

process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on('data', function(data) { process.stdout.write(data); }); 

下面是用法。

$ echo 'foo' | ./hello hello foo 

 

(3)系統信號

操做系統能夠向執行中的進程發送信號,process 對象可以監聽信號事件。

process.on('SIGINT', function () { console.log('Got a SIGINT'); process.exit(0); }); 

發送信號的方法以下。

$ kill -s SIGINT [process_id] 
相關文章
相關標籤/搜索