当前位置: 首页 > 后端技术 > Node.js

前端脚手架实践

时间:2023-04-03 17:10:55 Node.js

最近在研究团队开发的脚手架,参与了一点工作。觉得很有意思,从此开辟了前端学习的另一条路。目的相信大家都在开发过程中遇到过这样的问题:为了新建一个项目,复制文件,配置东西,或者干脆从头开始,都是非常耗时的。这个时候,大家就非常需要一个贴心的脚手架了。它可以帮助我们只用简单的命令就可以完成项目的创建、编译、打包、发布,让我们可以专注于自己的核心业务。一般来说,一个贴心的脚手架可以帮助我们解决以下问题:减少重复性工作,不再需要复制其他项目和删除不相关的代码,或者从头开始创建项目和文件。根据交互动态生成项目结构和配置文件等。多人协作更方便,无需来回传递文件??。功能通过命令行询问用户,获取用户输入参数实现,根据用户输入参数,对项目进行创建、启动、编译、发布、删除、更新依赖包等操作。常用依赖包用于开发脚手架:接口相关:脚手架需要通过命令行或可视化工具与用户进行交互,获取用户意图。这里我们使用命令行询问用户并获取用户输入。以下包可以帮助我们完成这些事情:yargs通过解析参数和生成优雅的用户界面构建交互式命令行工具https://www.npmjs.com/package...inquirer通用交互式命令行用户界面集合https://www.npmjs.com/package...chalk可以在控制台修改字符串的样式https://www.npmjs.com/package...yargs使用示例:#!/usr/bin/envnoderequire('yargs')//eslint-disable-line.command('serve[port]','starttheserver',(yargs)=>{yargs.positional('port',{describe:'要绑定的端口',默认:5000})},(argv)=>{if(argv.verbose)console.info(`startserveron:${argv.port}`)serve(argv.port)}).option('verbose',{alias:'v',type:'boolean',description:'Runwithverboselogging'}).argv使用--help参数运行这个脚本如下:节点进程和文件操作是相关的:因为我们scaffold运行在node环境下,我们需要用到很多nodeAPI,其中大部分是child_process和文件系统fs。不过我们并没有使用原生的nodeAPI,而是尝试了一些兼容性更好的,使用更方便的第三方node依赖包。cpxlinux的cp命令有更多watch功能https://www.npmjs.com/package...cross-spawnnode的spawn和spawnSync的跨平台(window、macos等)解决方案https://www.npmjs.com/package...asnyc处理异步javascripthttps://www.npmjs.com/package...fs-extra补充node的fs模块,支持方法promisehttps://www.npmjs.com/package...replace命令用于在文件上执行搜索和替换的行实用程序https://www.npmjs.com/package...empty-dir检查目录是否为空https://www.npmjs.com/package...示例用法:constspawn=require('cross-spawn');//异步生成NPMconstchild=spawn('npm',['list','-g','-depth','0'],{stdio:'inherit'});//同步生成NPMconstresult=spawn.sync('npm',['list','-g','-depth','0'],{stdio:'inherit'});文件编译相关:脚手架开发过程中,经常需要处理配置文件的创建、替换内容等,这些都与AST(抽象语法分析树)密切相关。esprima和escodegen是两个常用的处理AST的依赖包。esprima将javascript解析成AST解析器https://www.npmjs.com/package...escodegen生成AST到javascripthttps://www.npmjs.com/package...'BinaryExpression',operator:'+',left:{type:'Literal',value:40},right:{type:'Literal',value:2}});esprima使用示例:varesprima=require('esprima');varprogram='constanswer=42';console.log(esprima.tokenize(program));//可以看到constanswer=42解析如下:[{type:'Keyword',value:'const'},{type:'Identifier',value:'answer'},{type:'Punctuator',value:'='},{type:'Numeric',value:'42'}]许多typescript类型文件在使用第三方库时,我们需要引用其声明文件,从而获得相应的代码补全、界面提示等功能。推荐使用@types统一管理第三方库的声明文件,如@types/async、@types/cross-spawn、@types/empty-dir等。总的来说脚手架的开发是一个很有意思的事情,后面我们会继续探讨。参考文章#!/usr/bin/envnode到底是什么?https://juejin.im/post/5cb93c...typescript声明文件:https://ts.xcatliu.com/basics...