在工做中,須要開發一個腳手架,用於給相關用戶提供相關的開發便利性。javascript
對前端、Node操做有必定的瞭解,同時向瞭解腳手架開發過程或者須要本身實現一個腳手架的開發者。css
更多與用戶交互和文件操做等進階內容能夠查看同系列第二篇:如何實現一個腳手架進階版(Vue-cli v2.9學習篇)前端
腳手架的開發最開始過程與普通的前端項目相同,須要一個入口文件command.js
和配置文件package.json
。java
與其餘配置文件不一樣的是,你須要在command.js
文件第一行增長以下聲明:node
#! /usr/bin/env node
同時須要在package.json
文件中加上一下一項:npm
{ ..., "bin": { "cm-cli": "command.js" } }
在配置文件中增長了此項後,只須要在配置文件根目錄下執行npm link
命令,便可使用cm-cli --help
命令來查看加載的cm-cli腳手架。json
若是你發佈了你的腳手架,那麼在其餘用戶使用命令npm install -g cm-cli
以後,即可以在全局下使用你的腳手架了。segmentfault
在對註釋和命令進行提示中,咱們須要使用到commander
包,使用npm install commander
便可進行安裝。(若是NPM版本低於5,則須要添加--save參數保證更新package.json
配置文件)。curl
commander
是一個提供用戶命令行輸入和參數解析的強大功能。有須要的能夠閱讀相關的庫文檔。在這裏我介紹兩個用的最多的方法。函數
可以初始化自定義的參數對象,設置關鍵字和描述,同時還能夠設置讀取用戶輸入的參數。具體用法以下:
const commander = require('commander'); commander.version('1.0.0') .option('-a, --aaa', 'aaaaa') .option('-b, --bbb', 'bbbbb') .option('-c, --ccc [name]', 'ccccc') .parse(process.argv); if (commander.aaa) { console.log('aaa'); } if (commander.bbb) { console.log('bbb'); } if (commander.ccc) { console.log('ccc', commander.ccc); }
具體展現以下:
該方法可以在命令行增長一個命令。用戶在執行此命令後,可以執行回調中的邏輯。具體用法以下:
commander .command('init <extensionId>') .description('init extension project') .action((extensionId) => { console.log(`init Extension Project "${extensionId}"`); // todo something you need });
具體展現效果以下:
經過上面的步驟,咱們已經可以完成一個簡單的腳手架了。下面,咱們須要讀取用戶配置,同時爲用戶生成一些模板文件。
如今,咱們須要讀取用戶的cm-cli.json
配置文件來進行一些配置。
咱們可使用Node.js的fs文件模塊來對文件進度讀操做,因爲此處沒有太多難點,所以略去。
咱們提早將模板文件存儲在CDN上,再根據本地讀取到的相關腳手架配置文件來進行模板的下載。
注:腳手架中讀取的路徑爲使用者使用時當前路徑,所以沒有辦法將模板文件存儲在腳手架中進行讀取。
咱們可使用諸如request
這種庫來幫助咱們進行文件下載,簡化操做步驟。執行npm install request`便可進行安裝。
注:在文件寫入時建議先判斷文件是否存在,再進行覆蓋。
與Node.js提供的API函數來看,有些人更加傾向於使用Shell腳原本進行文件操做。幸運的是,咱們也能夠在咱們的腳手架中引入node-cmd
來啓用對Shell腳本的支持。執行npm install node-cmd
便可進行安裝。
具體示例以下:
commander .command('init <extensionId>') .description('init extension project') .action((extensionId) => { id = extensionId; console.log(`init Extension Project "${extensionId}"`); cmd.get( ` mkdir -p static/${extensionId} mkdir tmp mkdir tmp/source-file mkdir tmp/build-file curl -o tmp/source-file/index.js https://xxxxxxxx.com?filename=index.js touch tmp/source-file/index.css curl -o tmp/build-file/server.js https://xxxxxxxx.com?filename=server.js curl -o tmp/build-file/router.js https://xxxxxxxx.com?filename=router.js curl -o tmp/build-file/package.json https://xxxxxxxx.com?filename=package.json cp tmp/source-file/* static/${extensionId} cp tmp/build-file/* ./ rm -fr tmp npm install `, (err, data) => { console.log(data) if (!err) { console.log('init success'); return; } console.error('init error'); }); });
咱們能夠快速的使用Shell腳原本進行文件夾的建立和文件模板的下載。
腳手架想要在終端可以快速執行,能夠在package.json
配置文件中增長相關字段。
腳手架須要可以讀取相關終端輸入,可使用commander
庫來快速開發。
腳手架須要可以執行Shell腳本,可使用node-cmd
庫來快速實現需求。