最近對團隊開發的腳手架研究了下並參與進去作了一點工做,以爲很是的有意思,自此開闢了前端學習的另外一條道路。javascript
相信你們在開發過程當中都遇到這樣的問題:爲了新建項目,要不停地拷貝文件,配置什麼的,或者乾脆從零開始,這樣是很是浪費時間的。
這個時候,一個善解人意的scaffold就很被你們須要了,它能夠僅用簡單的命令就幫助咱們完成項目的建立,編譯打包,發佈等工做,讓咱們能夠專一於咱們的核心業務。
整體來講,一個貼心的scaffold能夠幫咱們解決如下問題:前端
經過命令行詢問用戶並獲取用戶輸入參數,根據用戶的輸入參數進行項目的建立,啓動,編譯,發佈,刪除,更新依賴包等工做。java
yargs | 經過解析參數並生成優雅的用戶界面來構建交互式命令行工具 | https://www.npmjs.com/package... |
inquirer | 常見的交互式命令行用戶界面的集合 | https://www.npmjs.com/package... |
chalk | 能夠修改控制檯中字符串的樣式 | https://www.npmjs.com/package... |
yargs用法示例:node
#!/usr/bin/env node require('yargs') // eslint-disable-line .command('serve [port]', 'start the server', (yargs) => { yargs .positional('port', { describe: 'port to bind on', default: 5000 }) }, (argv) => { if (argv.verbose) console.info(`start server on :${argv.port}`) serve(argv.port) }) .option('verbose', { alias: 'v', type: 'boolean', description: 'Run with verbose logging' }) .argv
用--help參數運行此段腳本以下:linux
cpx | linux的cp命令,多了watching功能 | https://www.npmjs.com/package... |
cross-spawn | node的spawn和spawnSync的跨平臺(window,macos等)解決方案 | https://www.npmjs.com/package... |
asnyc | 處理異步javascript | https://www.npmjs.com/package... |
fs-extra | 補充了node的fs模塊,支持方法的promise | https://www.npmjs.com/package... |
replace | 用於在文件上執行搜索和替換的命令行實用程序 | https://www.npmjs.com/package... |
empty-dir | 檢查目錄是否爲空 | https://www.npmjs.com/package... |
用法示例:typescript
const spawn = require('cross-spawn'); // Spawn NPM asynchronously const child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' }); // Spawn NPM synchronously const result = spawn.sync('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
esprima | 將javascript解析成AST的解析器 | https://www.npmjs.com/package... |
escodegen | 將AST生成javascript | https://www.npmjs.com/package... |
escodegen用法示例:macos
escodegen.generate({ type: 'BinaryExpression', operator: '+', left: { type: 'Literal', value: 40 }, right: { type: 'Literal', value: 2 } });
esprima用法示例:npm
var esprima = require('esprima'); var program = 'const answer = 42'; console.log(esprima.tokenize(program)); // 能夠看到把const answer = 42解析以下: [ { type: 'Keyword', value: 'const' }, { type: 'Identifier', value: 'answer' }, { type: 'Punctuator', value: '=' }, { type: 'Numeric', value: '42' } ]
當使用第三方庫時,咱們須要引用它的聲明文件,這樣才能得到對應的代碼補全、接口提示等功能。推薦使用 @types
統一管理第三方庫的聲明文件,好比@types/async,@types/cross-spawn,@types/empty-dir等。promise