關於
《Nodejs開發加密貨幣》,是一個加密貨幣產品的詳細開發文檔,涉及到使用Nodejs開發產品的方方面面,從前端到後臺、從服務器到客戶端、從PC到移動、加密解密、區款鏈等各個環節。代碼完全開源、文章免費分享。 相關資源見 http://ebookchain.org
QQ交流羣: 185046161
前言
在源碼分享之前,我們先簡單分享一下commander和async兩個組件(或模塊)的應用,這裏,按照我個人的理解來描述。
題外話
搞編程的都是學習高手。但不同的人,方法迥異。有的天生聰穎,翻翻源碼和文檔,就能在日後自由使用。相反,有的就差一些,我個人就算典型的一個,堅信自己愚鈍至極。
我經常遇到這樣的情況,對於某個組件,這次用了,下次有需要,還要再看文檔,特別是在方法的選擇上,有時候要反覆試驗。所以,多年來,我認真總結和改進自己的做法,努力向高手靠攏。
這關係到“知識”的理解和吸收。知識由語言組成,語言由概念和邏輯組成,概念和邏輯涉及到人的記憶能力與分析能力。很多人喜歡邏輯上的思考,而對於概念“視而不見”。
事實上,概念中含有邏輯,是邏輯的高級濃縮版。概念清晰,邏輯必然是清晰的,相反卻未必。因此,學習知識,掌握概念最重要。
比如,什麼是模塊,什麼叫組件?我的理解是,Nodejs提供的原生功能模塊,叫模塊
(module
,例如:domain),而第三方提供的獨立功能模塊稱爲組件
(component
),其實他們都叫中間件
(middleware
),本質沒什麼區別。
但是,在自己的思維邏輯中,這麼簡單的區分一下,其實表明我們掌握了更多信息,比如在文檔、代碼質量、可信度等方面,模塊
天生要好於組件
。知道domain
是模塊,自然會去nodejs官網查找最可靠的資料(注,官方計劃廢棄domain
,不提倡再使用了)。
因此,我的做法就是解讀概念(官方提供)、提煉概念(官方沒有)、解釋概念(介紹用法),用自己的理解梳理相關知識。這裏的概念不以“全”爲目標,以“好記、好用、好區分”爲主。
以後介紹的每個組件或模塊,網上都會有很多相關文檔。我的做法自然也規避了文字雷同的可能,畢竟人的思維可以相似,但不會相同。
本文,先介紹commander,看能否讓您一下記住,並直接用於開發。
Commander
事實上,在Nodejs或ruby等語言環境裏,只要在文件頭部添加一行所謂的shebang
(提供一個執行環境),就可以將代碼轉爲命令行執行。難在命令行選項處理和流程控制,所以纔有了這類工具的出現,叫它們命令行框架
最合適。
類似Commander
的工具有很多,但多數以規範命令行選項爲主,對一些編碼細節還要自己實現,比如:何時退出程序(調用process.exit(1)
)。Commander
把這一切都簡化了,小巧靈活、簡單易用,有它足夠了。
1.概念定義
簡單直接的命令行工具開發組件。
2.概念解釋
- 這是一個
組件
,說明是第三方開發的,其實就是開發Express
的大神tj
開發的。ruby語言也有一個同名的開發組件,同樣是tj
的傑作,所以,雖爲組件,但足夠權威,“您值得擁有
”。 命令行工具開發
,Commander
的英文解釋是命令
,如其名字,這個是用來開發命令行命令
的。簡單直接
,怎麼簡單?四個函數
而已。怎麼直接?如果您瞭解“命令行”的話,就能體會深刻,它通常包含命令、選項、幫助和業務邏輯四個部分,該組件分別提供了對應函數。
因此,只要記住該Commander這個名字和這一句話的概念定義,基本上已經掌握了該組件的全部。下面的用法介紹,僅僅是幫助您更好的記憶和使用。
3.用法介紹:
這裏,我們也給它概念化,叫“命令行開發三步曲”。具體以 gitbook-summary爲例,解釋如下:
- 第1步:給工具起名字
這個名字
,是工具的名字(其實也是命令
,我叫它主命令),用來區分系統命令,限定命令
使用的上下文。我通常用工程的名字或操作對象的名字代替,是個名詞,比如:book
。而用Commander
寫的命令
是個動詞(其實是用.command()方法定義的子命令),比如:generate
,最後的形式如下:
$ book generate [--options]
只所以把起名字單獨提出來,主要是在Nodejs的世界裏,這一步是固定不變
的,只要記住就是了。方法是,在package.json
裏定義下面的字段:
{
"bin": {
"book": "./path/to/your-commander.js"
}
}
注:package.json
文件是包配置文件,是全局配置不可逾越之地。很多工具,都是基於它,提供入口程序的。比如:Nodejs自己就是請求main
字段的(沒有定義,默認請求index.js文件),Npm請求scripts
字段。這裏多了一個,Commander請求bin
字段。
如果,不使用package.json
,那麼定義的就是node
命令之下的子命令,調用方法是:
$ node ./path/to/your-commander.js generate [--options]
如果連node都不想輸入,那麼就要在代碼第一行添加shebang
,即:
#!/usr/bin/env node
- 第2步:填充四個函數
這一步,用於定義命令、選項、幫助和業務邏輯,完全是Commander
概念定義的使用。其實,第三方組件,也就是起到這種微框架
的作用。具體用法,自然最好是看 官方文檔 了。這裏,需要進一步思考的是,對於這個組件而言,這四個函數,最重要的是什麼?
我們想到的通常是業務邏輯
,不過,請注意,只要是開發,邏輯部分自然只能開發者自己實現,所以,Commander
僅僅提供了一個接口函數而已。這裏的命令
,僅是一個名稱。幫助
是提示,也僅是簡單的文本信息。剩下的各種選項
,可以規範,也最爲關鍵,纔是Commander
的可愛之處。
(1)命令: 使用command
函數定義(子命令),例如
var program = require("commander");
program
.command("summary <cmd>")
.alias("sm") //提供一個別名
.description("generate a `SUMMARY.md` from a folder") //描述,會顯示在幫助信息裏
...
當使用-h
選項調用命令時,上述命令summary|sm
會被顯示在幫助信息裏。這裏的alias
和description
僅是錦上添花而已。
更復雜的,例如下面官方的例子, .command() 包含了描述信息和 .action(callback) 方法調用,就是說要用子命令各自對應的執行文件,這裏就是./pm-install.js,以及 ./pm-search.js 和 ./pm-list.js等。
#!/usr/bin/env node
var program = require('..');
program
.version('0.0.1')
.command('install [name]', 'install one or more packages')
.command('search [query]', 'search with optional query')
.command('list', 'list packages installed')
.command('publish', 'publish the package')
.parse(process.argv);
說明:不使用command
方法直接定義主命令,個人建議不要這麼做。中規中矩地定義每一個子命令(本文統稱命令),只要使用command
方法,不帶描述信息,附帶action
方法。如果定義類似git類型的,一連串的命令,一個一個來,顯然麻煩,就把描述信息放在command
裏,去掉action
方法,這時默認請求對應的js文件。
(2)選項:使用option
方法定義,可以理解爲命令行數據結構
。
該函數很簡單,可以方便的將文本輸入轉化爲程序需要的數據形式。其功能如下:
- 可以設置任何數量的選項,每一個對應一個
.option
函數調用; - 可以設置默認值;
- 可以提供文本、數值、數組、集合和範圍等約束類型(通過提供處理函數);
- 可以使用正則表達式;
說明:option
方法,基本使用就用選項名稱和描述;複雜一點就要提供處理函數或默認值;再複雜就用arguments
方法代替option
方法,使用可變參數
(帶...
的參數)。
(3)幫助: 使用help
方法輸出一切有用的描述信息,這些信息通常在命令和選項的定義中,例如
program.help();
如果要定製幫助信息,就用:
program.on('--help',cb);
(4)邏輯: 使用action
方法註冊邏輯,將代碼轉向執行自己的邏輯代碼,當然,git類型的多命令也可以不用。例如
program.action(function(cmd, options) { //code });
- 第3步:開發業務邏輯
撰寫action
可以調用的代碼就是了。
4.案例分析:
代碼地址:https://github.com/imfly/gitbook-summary 具體內容,請自己看代碼吧。
這是一個一鍵生成文檔目錄文件的命令行工具,以後可能還會加入簡繁轉化功能。生成的目錄文件,是gitbook生成電子書的必須文件。
我從來不願意爲寫作而寫作,更不願意處理任何重複性的工作,因此,隔一段時間,經常積累一堆問題清單和零零散散的文檔。這個命令行工具基本上爲自己定製。但發現也有很多小盆友在用,看來跟我一樣,^_^。
總結
這篇僅僅介紹了commander
組件的相關概念和使用,關於如何安裝(簡單一條命令)、如何修改權限,都沒有細說。這類知識,我堅信網上一搜多的是,自行補充吧。
鏈接
本系列文章即時更新,若要掌握最新內容,請關注下面的鏈接
本源文地址: https://github.com/imfly/bitcoin-on-nodejs
電子書閱讀: http://bitcoin-on-nodejs.ebookchain.org
電子書下載: 下載頁面
參考
Node.js 命令行程序開發教程(中文): http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html
用npm構建簡單命令行(英文): http://blog.npmjs.org/post/118810260230/building-a-simple-command-line-tool-with-npm
用Node.js開發命令行工具(英文): http://shapeshed.com/command-line-utilities-with-nodejs/