最近对团队开发的脚手架研究了下并参与进去作了一点工做,以为很是的有意思,自此开辟了前端学习的另外一条道路。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