首頁 > web前端 > js教程 > Npm做cli命令列工具

Npm做cli命令列工具

php中世界最好的语言
發布: 2018-04-17 16:14:28
原創
2159 人瀏覽過

這次帶給大家Npm做cli命令列工具,Npm做cli命令列工具的注意事項有哪些,下面就是實戰案例,一起來看一下。

前言

# 如果你想寫一個npm插件,如果你想透過命令列來簡化自己的操作,如果你也是個懶惰的人,那麼這篇文章值得一看。

po主的上一篇文章介紹了自訂自己的模版,但這樣po主還是不滿足啊,專案中我們頻繁的需要新建一些頁面,邏輯樣式等文件,每次都手動new一個,然後複製一些基本程式碼進去非常的麻煩,所以就有這篇文章了。接下來就讓po主為大家一步一步示範怎麼做一個npm命令列插件。

註冊npm帳戶

# 發布npm插件,首先肯定要有個npm帳號了,過程就不囉嗦了,走你。

npm官網

有了帳號後,我們透過npm init 產生一個package設定檔,填寫一些你的信息,然後就可以開始寫邏輯程式碼了。

編寫指令入口

# 首先來看看專案結構

1

2

3

4

5

6

7

.

├── bin      //命令配置

├── README.md   //说明文档

├── index.js   //主入口

├── src      //功能文件

├── package.json //包信息

└── test     //测试用例

登入後複製

實例命令程式碼都是寫在bin目錄下,我們現在設定檔package檔中啟用指令,新增一個設定項bin

1

2

3

 "bin": {

    "xu""./bin/xu.js"

  },

登入後複製

然後安裝一個依賴,TJ大神寫的commander插件,

1

npm i commander --save

登入後複製

有了這個工具我們可以很方便的寫命令程式碼

# xu.js

1

2

3

4

5

6

7

8

#!/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外掛

1

2

$ node ./bin/xu.js

>>> 输出一些插件usage。help信息

登入後複製

# 關於commander,大家可以去作者的Github先學習了解,這裡不對參數講解。

xu-generate.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#!/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

# 這個檔案就定義了當我們輸入

1

$ xu g

登入後複製
所做的操作了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

/**

 * 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安裝。

1

2

$ 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登陸

1

2

$ npm login 

$ npm publish

登入後複製
如果這裡有個報錯,可能是你使用了cnpm位址,需要把npm倉庫設定回來

1

 $ npm config set registry https://registry.npmjs.org/

登入後複製
然後,更新更新npm包,版本號碼需要大於上次

後記

###

至此,一個入門級的npm包就製作完成了。萬分感慨,記得剛入門前端的時候看到別人的插件做的真牛,自己只要簡單安裝一下就能搞得那麼漂亮,想搞~但是看到一堆陌生的東西,立刻慫了(node環境,東西非常非常多,直接拷貝vue-cli看到一對代碼,一頭霧水。 學習是一個循序漸進的過程,大牛寫出來的東西,沒有一定的基礎,和長時間的累積經驗,原始碼是很難學習。非要啃,也行,只是效率感覺不如循序漸進來的好。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

用AngualrJs使用定時器


ReactJS操作表單選擇


################################################## ####

以上是Npm做cli命令列工具的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板