這次帶給大家Npm做cli命令列工具,Npm做cli命令列工具的注意事項有哪些,下面就是實戰案例,一起來看一下。
前言
# 如果你想寫一個npm插件,如果你想透過命令列來簡化自己的操作,如果你也是個懶惰的人,那麼這篇文章值得一看。
po主的上一篇文章介紹了自訂自己的模版,但這樣po主還是不滿足啊,專案中我們頻繁的需要新建一些頁面,邏輯樣式等文件,每次都手動new一個,然後複製一些基本程式碼進去非常的麻煩,所以就有這篇文章了。接下來就讓po主為大家一步一步示範怎麼做一個npm命令列插件。
註冊npm帳戶
# 發布npm插件,首先肯定要有個npm帳號了,過程就不囉嗦了,走你。
npm官網
有了帳號後,我們透過npm init 產生一個package設定檔,填寫一些你的信息,然後就可以開始寫邏輯程式碼了。
編寫指令入口
# 首先來看看專案結構
. ├── bin //命令配置 ├── README.md //说明文档 ├── index.js //主入口 ├── src //功能文件 ├── package.json //包信息 └── test //测试用例
實例命令程式碼都是寫在bin目錄下,我們現在設定檔package檔中啟用指令,新增一個設定項bin
"bin": { "xu": "./bin/xu.js" },
然後安裝一個依賴,TJ大神寫的commander插件,
npm i commander --save
有了這個工具我們可以很方便的寫命令程式碼
# xu.js
#!/usr/bin/env node process.title = 'xu'; require('commander') .version(require('../package').version) .usage('<command> [options]') .command('generate', 'generate file from a template (short-cut alias: "g")') .parse(process.argv) require('./xu-generate'); >>引入
這個檔案可以看作是入口檔案,第一行程式碼是必須新增的,腳本用env啟動的原因,是因為腳本解釋器在linux中可能被安裝在不同的目錄,env可以在系統的PATH目錄中查找。同時,env也規定一些系統環境變數。 這種寫法主要是為了讓你的程式在不同的系統上都能適用。
在這一步,你可以簡單測試你自己的npm外掛
$ node ./bin/xu.js >>> 输出一些插件usage。help信息
# 關於commander,大家可以去作者的Github先學習了解,這裡不對參數講解。
xu-generate.js
#!/usr/bin/env node const program = require('commander'); const chalk = require('chalk') const xu = require('../src/generate'); /** * Usage. */ program .command('generate') .description('quick generate your file') .alias('g') .action(function(type, name){ xu.run(type, name); }); program.parse(process.argv);# 這就是功能指令,定義了一個generate指令,.alias('g')是該指令的縮寫,然後.action(function(type, name){xu.run(type, name); });傳回一個函數,這個函數就是我們定義這個指令需要做什麼。
編寫功能函數
# ./src/generate.js# 這個檔案就定義了當我們輸入$ xu g所做的操作了。
/** * Created by xushaoping on 17/10/11. */ const fs = require('fs-extra') const chalk = require('chalk') exports.run = function(type, name) { switch (type) { case 'page': const pageFile = './src/page/' + name + '/' + name + '.vue' const styleFile = './src/page/' + name + '/' + name + '.less' fs.pathExists(pageFile, (err, exists) => { if (exists) { console.log('this file has created') } else { fs.copy('/usr/local/lib/node_modules/vue-xu-generate/src/template/page.vue', pageFile, err => { if (err) return console.error(err) console.log(pageFile + ' has created') }) fs.copy('/usr/local/lib/node_modules/vue-xu-generate/src/template/page.less', styleFile, err => { if (err) return console.error(err) console.log(styleFile + ' has created') }) } }) break; case 'component': const componentFile = './src/components/' + name + '.vue' fs.pathExists(componentFile, (err, exists) => { if (exists) { console.log('this file has created') } else { fs.copy('/usr/local/lib/node_modules/vue-xu-generate/src/template/component.vue', componentFile, err => { if (err) return console.error(err) console.log(componentFile + ' has created') }) } }) break; case 'store': const storeFile = './src/store/modules' + name + '.js' fs.pathExists(storeFile, (err, exists) => { if (exists) { console.log('this file has created') } else { fs.copy('/usr/local/lib/node_modules/vue-xu-generate/src/template/store.js', storeFile, err => { if (err) return console.error(err) console.log(storeFile + ' has created') }) } }) break; default: console.log(chalk.red(`ERROR: uncaught type , you should input like $ xu g page demo` )) console.log() console.log(' Examples:') console.log() console.log(chalk.gray(' # create a new page')) console.log(' $ xu g page product') console.log() console.log(chalk.gray(' # create a new component')) console.log(' $ xu g component product') console.log() console.log(chalk.gray(' # create a new store')) console.log(' $ xu g store product') console.log() break; } };這裡有2個新的依賴,分別是指令輸出顏色和一個檔案操作的插件,透過npm安裝。
$ npm i fs-extra --save $ npm i chalk --save這個js檔案導出了一個run函數給xu-generate.js調用,我們透過參數拿到了使用者輸入的type,name,然後就可以根據type透過node fs模組(這裡用了一個依賴,但原理還是fs)操作把template檔案複製了一份到你的專案中。 到這,我們就已經完成了一個指令的開發,這個指令可以快速產生專案的模版檔。
本地測試
npm套件開發不像web開發,可以直接在瀏覽器看,實例目錄下建立一個test文件,然後 node test 就可以測試我們的邏輯。如果有一些功能需要在發布後才能測,npm 有個 link指令 可以連接你本地的模組,當然你也可以發佈後 自己安裝插件測試,就跟平常引入一個插件一樣。發布npm套件
# 首先在專案根目錄執行npm登陸$ npm login $ npm publish如果這裡有個報錯,可能是你使用了cnpm位址,需要把npm倉庫設定回來
$ npm config set registry https://registry.npmjs.org/然後,更新更新npm包,版本號碼需要大於上次
後記
###至此,一個入門級的npm包就製作完成了。萬分感慨,記得剛入門前端的時候看到別人的插件做的真牛,自己只要簡單安裝一下就能搞得那麼漂亮,想搞~但是看到一堆陌生的東西,立刻慫了(node環境,東西非常非常多,直接拷貝vue-cli看到一對代碼,一頭霧水。 學習是一個循序漸進的過程,大牛寫出來的東西,沒有一定的基礎,和長時間的累積經驗,原始碼是很難學習。非要啃,也行,只是效率感覺不如循序漸進來的好。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
用AngualrJs使用定時器ReactJS操作表單選擇 ################################################## ####以上是Npm做cli命令列工具的詳細內容。更多資訊請關注PHP中文網其他相關文章!