首页 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工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

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)

十大数字货币交易所app推荐 币圈虚拟币交易所排名前十 十大数字货币交易所app推荐 币圈虚拟币交易所排名前十 Apr 22, 2025 pm 03:03 PM

十大数字货币交易所app推荐:1. OKX,2. Binance,3. gate.io,4. Huobi,5. Coinbase,6. KuCoin,7. Kraken,8. Bitfinex,9. Bybit,10. Bitstamp,这些app均提供实时行情、技术分析和价格提醒功能,帮助用户实时监控市场动态并做出明智的投资决策。

靠谱好用的虚拟币交易所app推荐 币圈十大交易所排行榜最新 靠谱好用的虚拟币交易所app推荐 币圈十大交易所排行榜最新 Apr 22, 2025 pm 01:21 PM

靠谱好用的虚拟币交易所app是:1. Binance,2. OKX,3. Gate.io,4. Coinbase,5. Kraken,6. Huobi Global,7. Bitfinex,8. KuCoin,9. Bittrex,10. Poloniex。这些平台因其交易量、用户体验和安全性等因素被评选为最佳,均提供注册、验证、存款、提款和交易操作功能。

十大数字虚拟货币app排行榜 币圈交易数字货币交易所排名前十 十大数字虚拟货币app排行榜 币圈交易数字货币交易所排名前十 Apr 22, 2025 pm 03:00 PM

十大数字虚拟货币app排行榜分别是:1. OKX,2. Binance,3. gate.io,4. Coinbase,5. Kraken,6. Huobi,7. KuCoin,8. Bitfinex,9. Bitstamp,10. Poloniex。这些交易所根据交易量、用户体验和安全性等因素评选,均提供多种数字货币交易服务和高效的交易体验。

适合新手的数字货币交易App有哪些?一文了解币圈 适合新手的数字货币交易App有哪些?一文了解币圈 Apr 22, 2025 am 08:45 AM

选择适合新手的数字货币交易平台需考虑安全性、易用性、教育资源和费用透明度:1. 优先选择提供冷存储、双重验证和资产保险的平台;2. 界面简洁、操作清晰的App更适合新手;3. 平台应提供教程和市场分析等学习工具;4. 注意交易手续费和提现费等隐性成本。

meme币交易所排行榜 meme币主流交易所top10盘点 meme币交易所排行榜 meme币主流交易所top10盘点 Apr 22, 2025 am 09:57 AM

最适合交易Meme币的平台包括:1. 币安(Binance),全球最大,流动性高,低手续费;2. 欧意(OKX),高效交易引擎,支持多种Meme币;3. XBIT,去中心化,支持跨链交易;4. 雷迪姆(Solana DEX),低成本,结合Serum订单簿;5. PancakeSwap(BSC DEX),交易费用低,速度快;6. Orca(Solana DEX),用户体验优化;7. Coinbase,安全性高,适合新手;8. 火币(Huobi),亚洲知名,交易对丰富;9. DEXRabbit,智能

2025数字货币交易平台有哪些 十大数字货币app最新排行榜 2025数字货币交易平台有哪些 十大数字货币app最新排行榜 Apr 22, 2025 pm 03:09 PM

十大虚拟币看盘平台app推荐:1. OKX,2. Binance,3. Gate.io,4. Huobi,5. Coinbase,6. Kraken,7. Bitfinex,8. KuCoin,9. Bybit,10. Bitstamp,这些平台提供实时行情、技术分析工具和用户友好的界面,帮助投资者进行有效的市场分析和交易决策。

免费的看盘软件网站有哪些 币圈十大免费看行情软件排名 免费的看盘软件网站有哪些 币圈十大免费看行情软件排名 Apr 22, 2025 am 10:57 AM

币圈十大免费看行情软件排名前三分别是OKX、Binance和gate.io。 1. OKX提供简洁界面和实时数据,支持多种图表和市场分析。 2. Binance功能强大,数据准确,适合各种交易者。 3. gate.io以稳定性和全面性着称,适合长期和短线投资者。

安全好用的虚拟数字币交易软件 十大加密货币交易平台推荐 安全好用的虚拟数字币交易软件 十大加密货币交易平台推荐 Apr 22, 2025 pm 12:48 PM

安全好用的虚拟数字币交易软件包括:1. Binance,2. OKX,3. Gate.io,4. Coinbase,5. Kraken,6. Huobi,7. Bittrex,8. Poloniex,9. Bitfinex,10. KuCoin,这些交易所各具特色,提供多种加密货币交易和高级功能,用户界面友好,安全措施强大,适合不同水平的交易者使用。

See all articles