前端有各類各樣的腳手架工具, 好比咱們經常使用的vue-cli, create-react-app等工具. 爲咱們前端早期工程的開發, 帶來極大的便利.javascript
這麼便利的node cli, 是否是特別想知道是如何開發的? 接下來, 爲你們介紹一下怎樣開發一個腳手架工具.前端
本系列, 將分爲三節: 上中下vue
常見的一個cli工具, 通常會實現什麼功能呢? 看看咱們屬性的命令: 咱們以npm init, npm install爲例:java
如今咱們一一介紹, 要實現這些功能. 咱們可用的武器有哪些?node
是一個工具包,其做用是讓node命令行程序的製做更加簡單,封裝後的node命令行接口, 簡單易用.react
安裝:webpack
npm install commander -D
複製代碼
const program = require('commander');
// 處理-v, --version時的輸出.
program.version(require('../package.json').version, '-v, --version');
// 解析輸入參數. 記得放在最後便可.
program.parse(process.argv);
複製代碼
const program = require('commander');
program
.version(require('../package.json').version, '-v, --version')
.command('create <name>')
.description('Create a new project')
.action(name => {
console.log(name);
})
program.parse(process.argv);
複製代碼
當執行create命令後, 沒有提供參數時, 會提示缺乏參數name. 提供後, 控制檯就輸出咱們提供的name值. git
使用它很容易的完成用戶和命令行的交互. 好比npm init時, 要咱們輸入package name, author等等信息. 最後還要咱們輸入yes確認等交互.github
具體的用法,基於上面的代碼. 咱們添加和命令行的交互. 輸入一個author信息和最後確認.web
#!/usr/bin/env node
const program = require('commander');
const inquirer = require('inquirer');
program
.version(require('../package.json').version, '-v, --version')
.command('create <name>')
.description('Create a new project')
.action(name => {
inquirer.prompt([
// 輸入類型
{
type: 'input',
name: 'author',
message: 'Please input the author name.'
},
// 確認類型.
{
type: 'confirm',
name: 'continune',
message: 'Is that ok?'
}
]).then(result => {
// 輸出: {author, continune}的實際的值.
console.log(result);
})
})
program.parse(process.argv);
複製代碼
輸出進度條, loading等信息
const p = ora('建立中...')
p.start();
setTimeout(() => {
p.stop();
}, 3000);
複製代碼
控制檯中, |一直在轉, 3s後中止.
用來在控制檯中輸出不一樣樣式的信息. 好比文字顏色, 文字背景等.
const chalk = require('chalk')
console.log(chalk.red('some error'))
複製代碼
經過PATH環境變量到該路徑內查找可執行文件,因此基本的功能是尋找可執行. 好比查找是否安裝了npm。
const which = require('which');
const chalk = require('chalk');
// 查找系統中用於安裝依賴包的命令
function findNpm() {
const npms = ['tnpm', 'cnpm', 'npm'];
for (let i = 0; i < npms.length; i++) {
try {
// 查找環境變量下指定的可執行文件的第一個實例
which.sync(npms[i]);
return npms[i]
} catch (e) {
}
}
throw new Error(chalk.red('請安裝npm'));
}
複製代碼
bin/cli文件
#!/usr/bin/env node
const program = require('commander');
const inquirer = require('inquirer');
const chalk = require('chalk');
const ora = require('ora');
program
.version(require('../package.json').version, '-v, --version')
.command('create <name>')
.description('Create a new project')
.action(name => {
console.log(name);
inquirer.prompt([
{
type: 'input',
name: 'author',
message: 'Please input the author name.'
},
{
type: 'confirm',
name: 'continune',
message: 'Is that ok?'
}
]).then(result => {
console.log(result);
console.log(chalk.red('some error'))
const p = ora('建立中...')
p.start();
setTimeout(() => {
p.stop();
}, 3000);
})
})
program.parse(process.argv);
複製代碼
package.json文件
{
"name": "cli-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"bin": {
"xcli": "./bin/cli"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"chalk": "^2.4.2",
"commander": "^3.0.1",
"download-git-repo": "^2.0.0",
"inquirer": "^7.0.0",
"ora": "^3.4.0",
"which": "^1.3.1"
}
}
複製代碼
// 進入項目文件夾
npm link
複製代碼
安裝成功後. xcli工具就能夠在任意地方使用了.
xcli create xxx
複製代碼
有了這些武器, 咱們開發一個node命令就很是的容易了. 這些工具的完整用法. 能夠直接在github上查看官方使用說明便可.
詳情請查看: 建立Node腳手架工具(中)