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

Npm做cli命令列工具

Apr 17, 2018 pm 04:14 PM
命令列 工具

這次帶給大家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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1602
29
PHP教程
1504
276
2025年8月Solana價格預測 2025年8月Solana價格預測 Aug 07, 2025 pm 11:21 PM

2025年8月Solana價格預測存在三種情景:1. 樂觀情景下,若網絡穩定性提升且生態繁榮,價格可達$550-$800;2. 中性情景下,網絡穩定、生態穩步發展,價格區間為$300-$500;3. 悲觀情景下,若網絡問題頻發、生態萎縮並遭遇熊市,價格可能回落至$100-$250;投資者可選擇幣安、歐易、火幣、Gate.io、KuCoin或Coinbase等平台進行交易,這些平台提供良好的流動性與安全性,適合不同類型的投資者參與Solana市場。

怎樣用五千本金在幣圈賺五十萬? 怎樣用五千本金在幣圈賺五十萬? Aug 07, 2025 pm 08:42 PM

在數字貨幣這個充滿變數與機遇的領域,將五千本金增長至五十萬,意味著需要實現一百倍的資產增值。這並非一個簡單的數學遊戲,而是一場涉及認知、策略、心態和執行力的綜合考驗。它要求參與者不能僅僅依賴運氣,更需要具備敏銳的市場洞察力和超乎常人的風險管理能力。

狗狗幣DOGE價格預測: 2025年、2026年 - 2030年 狗狗幣DOGE價格預測: 2025年、2026年 - 2030年 Aug 08, 2025 pm 07:54 PM

狗狗币(DOGE)在2025年价格有望达到$0.40至$0.80的乐观区间,前提是市场进入牛市且有实质性应用落地,否则可能在$0.10至$0.25间徘徊;1、2025年价格受市场周期和名人效应驱动,尤其取决于埃隆·马斯克相关企业是否采用DOGE支付;2、2026至2027年可能经历牛市回调,价格出现显著回落;3、至2030年,若DOGE能拓展广泛的应用场景并提升技术性能,长期价格或可稳定在$1.00甚至更高;4、若无法转型为实用型资产,仅依赖社区和名人效应,其吸引力或将减弱,价格长期停滞或被新兴

怎樣在幣圈用三千賺三十萬?終極實戰 怎樣在幣圈用三千賺三十萬?終極實戰 Aug 07, 2025 pm 08:36 PM

從三千到三十萬,意味著尋求百倍的回報。這在加密世界並非天方夜譚,但它要求執行者俱備極高的認知水平、堅韌的心態和精準的操作。這並非一條安逸的道路,而是一場高風險、高回報的博弈。通往這個目標的路徑需要精心設計和嚴格執行。

什麼是加密貨幣成交量?對於交易有什麼用處? 什麼是加密貨幣成交量?對於交易有什麼用處? Aug 08, 2025 pm 11:12 PM

目錄什麼是成交量?成交量與價格的關係成交量對於交易有什麼用處?使用成交量時的注意事項1.成交量的放大不一定是利多2.異常成交量須搭配基本面與消息面解讀3.不同行情階段下的成交量解讀差異極大4.留意成交量造假的可能性(假量、刷量、閃電交易)5.小型股與冷門股的成交量參考性有限6.成交量必須搭配價格型態與技術指標綜合分析OANDA提供獨有的「持倉數據圖表」OANDA未平倉量(OpenPosition)交易原理與應用又是如何?第一象限第

火幣HTX上新資產一周回顧(7.28-8.4):多賽道共振 Meme與AI概念領跑市場 火幣HTX上新資產一周回顧(7.28-8.4):多賽道共振 Meme與AI概念領跑市場 Aug 08, 2025 pm 11:03 PM

目錄Meme熱度依舊:VINE、DONKEY繼續上漲技術敘事升溫:AI與隱私計算受熱捧跨鏈、RWA與區域性敘事:OMNI嶄露頭角火幣HTX財富效應持續釋放關於火幣HTX7月28日至8月4日,全球加密市場維持震盪格局,熱點輪動節奏加快。本周火幣HTX上線資產中,Meme、AI、隱私計算、跨鍊及RWA等多個賽道齊頭並進,市場財富效應持續顯現。這也是火幣HTX自7月以來連續第五週實現上新資產集體上漲,進一步驗證其在前沿項目挖掘與生態佈局上的前瞻性,持續為用戶把握新一輪市場週期提供有力支持。火幣(HTX

一文通俗解釋搞懂幣圈老鼠倉是什麼意思? 一文通俗解釋搞懂幣圈老鼠倉是什麼意思? Aug 07, 2025 pm 09:27 PM

​在討論加密貨幣的世界時,你可能會聽到一個聽起來有些神秘又帶點貶義的詞——“老鼠倉”。這個詞並非幣圈獨有,它源於傳統金融市場,但其在去中心化、監管尚不完善的幣圈環境中,表現得更加淋漓盡致。要理解它,我們可以先從字面意思入手,想像一個糧倉裡有隻老鼠,它總能在主人開倉放糧之前,偷偷地、提前地把最好的糧食叼回自己的洞裡。這個生動的比喻,恰恰揭示了“老鼠倉”行為的核心。

怎樣判斷比特幣買賣的最佳時機?一文帶你搞懂 怎樣判斷比特幣買賣的最佳時機?一文帶你搞懂 Aug 07, 2025 pm 10:45 PM

判斷比特幣的買賣時機是一個複雜的過程,它涉及到對市場多維度信息的綜合解讀。交易者和投資者通常會藉助一系列工具和方法來分析市場動態,力求在波動的市場中找到相對有利的入場點和出場點。這並非一種精確的科學,更像是一門基於數據和經驗的藝術。掌握一些核心的分析方法,有助於更理性地審視市場,從而做出更為審慎的決策。

See all articles