自動化開發工做流
使開發者可以將更多的精力和時間放在業務邏輯之上,一般會使用webpack
gulp
browser-sync
等CLI工具,而自動化的實現則離不開腳本的編寫;對於前端開發工程師而言,可以製做nodejs
命令行腳本工具也成爲必須掌握的技能之一。css
mkdir iconfont-cli
,並使用npm init
進行初始化,一路回車便可。index.js
, 並在package.json設置bin
參數, 定義腳本命令名稱及入口文件,以下:在package.json中添加命令入口文件html
{
"name":'iconfont-cli'
...
"bin": {
"iconfont": "index.js"
}
...
}
複製代碼
建立index.js,文件頂部聲明腳本解釋程序並指定爲nodejs前端
#!/usr/bin/env node
// 代碼...
console.log('iconfont cli start');
複製代碼
npm link
,將npm包連接到全局執行環境,從而在任意位置使用命令行均可以直接運行,開發期間能夠實時調試,該命令主要作兩件事情: 一是爲npm包目錄建立軟連接,將其鏈到{prefix}/lib/node_modules/<package>
,二爲可執行文件(bin)建立軟連接,將其鏈到{prefix}/bin/{name}
iconfont
, 如打印iconfont cli start
, 那麼恭喜,此時項目初始化完成😊命令行交互最核心的兩大部分: 輸入
與輸出
。在準備工做部分,咱們已經經過執行iconfont
簡單命令成功運行腳本並輸出log。而一般,咱們在執行命令時會傳入一些參數供用戶進行配置,相似iconfont --dest xxxx
的形式。命令攜帶的參數能夠在node腳本中經過process.argv
進行訪問,而後解析出參數內容。所幸,目前有不少nodejs插件提供了控制檯命令參數的解析,比較流行的是commander.js
庫, 可使咱們方便快捷的實現參數的解析及幫助文檔的輸出node
npm install commander --save
#!/usr/bin/env node
var program = require('commander');
program
.version('0.0.1') // 設置版本號
.option('-d, --dest <path>', '設置目標文件夾') // 設置dest參數
.action(function (cmd) {
console.log(cmd.dest) // 打印用戶輸入的dest參數
// ...執行後續的功能
})
program.parse(process.argv); // 解析命令行參數
複製代碼
執行iconfont -d ./
,控制檯輸出./
webpack
iconfont --help
或者iconfont -h
輸出有時候咱們但願經過問答的形式使用戶進行一些選擇、輸入或確認操做,以即可以傳達和接收更多的信息git
對於這種需求,咱們能夠藉助Inquirer.js
庫進行實現,例如咱們在上文的commander中配置了dest文件夾後,但願用戶進行二次確認操做,所以咱們能夠有以下作法:
// 此處略去....
var inquirer = require('inquirer');
program
.version('0.0.1') // 設置版本號
.option('-d, --dest <path>', '設置目標文件夾') // 設置dest參數
.action(function (cmd) {
console.log(cmd.dest) // 打印用戶輸入的dest參數
inquirer.prompt([
{
type:'confirm',
name:'destOk',
message:'確認使用目標文件夾:' + cmd.dest
}
]).then(function(answers){
console.log(answers.destOk) // true或false
// ...執行後續的功能
})
})
// 此處略去...
複製代碼
執行iconfont -d ./
,效果以下:github
webfonts-generator
支持經過svg文件製做出css字體圖標web
npm install webfonts-generator --save
#!/usr/bin/env node
var program = require('commander');
var inquirer = require('inquirer');
var webfontsGenerator = require('webfonts-generator');
var path = require('path');
var fs = require('fs');
// 遍歷查詢SVG文件
function findSvgs(folder, list){
list = list || [];
try {
var files = fs.readdirSync(folder);
for(var i=0; i<files.length; i++){
(function(){
var fileName = files[i],
filePath = path.join(folder, fileName),
stats = fs.statSync(filePath);
if(!stats.isFile()){
return findSvgs(filePath, list);
} else if(path.extname(filePath) === '.svg'){
list.push(filePath);
}
})(i);
}
} catch (error) {
console.error(error);
}
return list;
}
program
.version('0.0.1') // 設置版本號
.option('-d, --dest <path>', '設置目標文件夾') // 設置dest參數
.action(function (cmd) {
var currentFolder = process.cwd(); // 當前命令執行的目錄
var destFolder = path.isAbsolute(cmd.dest) ? cmd.dest : path.join(currentFolder,cmd.dest); // 目標目錄, 需區分是否爲絕對路徑
inquirer.prompt([
{
type: 'confirm',
name: 'destOk',
message: '確認使用目標文件夾:' + destFolder
}
]).then(function(answers){
// 用戶確認後執行後續的功能
if(answers.destOk){
webfontsGenerator({
files: findSvgs(currentFolder),
dest: cmd.dest,
html: true
}, function(error) {
if (error) {
console.log('Fail!', error);
} else {
console.log('Done!');
}
})
}
})
})
program.parse(process.argv);
複製代碼
iconfont -d ./iconfont
,便可生成圖標相關的各種文件以及html預覽至此咱們成功完成了一個簡單的命令行工具iconfont-cli
,接下來咱們能夠將其發佈的npm倉庫供其餘開發者下載使用,具體步驟以下:shell
npm adduser
進行登陸,需填寫Username、Password、Email相關信息.npm publish
,此時咱們可能會遇到下面截圖的問題,說明iconfont-cli已經被其餘人發佈過了,因此要換個名字進行發佈,直接修改package.json中的name便可.npm install -g iconfont-cli
全局安裝使用