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

Typescript构建命令行工具入门指南

时间:2023-04-03 23:45:12 Node.js

本小教程演示了使用TypeScript构建命令行工具,使用async/await进行非阻塞操作,使用mocha自动化测试和travis-ci进行持续集成。Intro最近TJ发布了node-prune来清理node_modules中的冗余文件,但是项目是用Go写的,所以我移植了一个JavaScript版本。您可以继续阅读带有源代码的文章。该项目使用TypeScript构建,在npm发布时自动翻译成JavaScript,因此您可以自由使用最新的语法和类型检测,如async/await。同时在TypeScript环境下使用ts-node直接调试。项目代码量小,适合作为类似小工具的模板~TypeScriptSetup项目最终结构如下,源码放在src/目录下,最后转码到lib/目录下发布到npm,test/目录是测试代码。.├──src/├──test/├──lib/├──node_modules/├──LICENSE├──README.md├──package-lock.json├──package.json└──tsconfig。json首先使用npminit初始化项目并安装TypeScriptnpmitypescript-D输入后打开package.json添加:{"scripts":{"build":"tsc","dev":"tsc-w","prepare":"npmrunbuild",}},tsc是TypeScript翻译的命令。-w参数可以观察源码的变化,继续翻译。prepare命令会在npminstall和npmpublish之前执行,以保证最新的翻译发布代码。为了告诉tsc如何翻译,需要一个配置文件tsconfig.json,可以在命令行tsc--init中生成一个默认模板。如果要支持Node6.x、7.x,修改Node项目的"target":"ES2015"。模块生成需要“module”:“commonjs”,然后指定下面包含的ts文件。{"compilerOptions":{"target":"ES2015","module":"commonjs","outDir":"./lib","strict":true},"exclude":["node_modules","lib"],"include":["src/**/*.ts"]}现在我们可以愉快的写TS代码了,试试写一个所有文件和文件夹的遍历函数,import*asfsfrom'fs-extra';import*aspathfrom'path';exportasyncfunctionwalk(dir:string,prunerF:(p:string,s:fs.Stats)=>void):Promise{让s=awaitfs.lstat(dir);如果(!s.isDirectory())返回;constitems=awaitfs.readdir(dir);for(letitemofitems){constitemPath=path.join(dir,item);consts=awaitfs.lstat(itemPath);constpruned=awaitprunerF(itemPath,s);如果(!pruned&&s.isDirectory()){等待步行(itemPath,prunerF);}}}注意这里我们可以直接使用async/await,对传入的参数进行类型标记。如果你使用支持插件的编辑器,就能感受到智能补全带来的愉悦体验。npmbuild之后,你可以在lib/中看到翻译后的ES2015代码。看一眼就会发现async是通过定义一个__awaiter函数来实现的。有兴趣的同学可以自己研究。var__awaiter=(this&&this.__awaiter)||function(thisArg,_arguments,P,generator){returnnew(P||(P=Promise))(function(resolve,reject){functionfulfilled(value){try{step(generator.next(value));}catch(e){reject(e);}}functionrejected(value){try{step(generator["throw"](value));}catch(e){reject(e);}}functionstep(result){result.done?resolve(result.value):newP(function(resolve){resolve(result.value);}).then(fulfilled,rejected);}step((generator=generator.apply(thisArg,_arguments||[])).next());});};CLI可以通过nodefile.js运行一个脚本,但是如何安装一个npm可执行文件至于文件,根据npmjs.com的描述,添加{"bin":{"prune":"lib/cli.js"}}到package.json,可以在系统路径下安装一个prune,执行的文件#!/usr/bin/envnode需要在最上面加上,否则不会被识别为Node脚本。为了读取从命令行传入的参数,可以使用args。在src/cli.ts中,这段代码constargv=yargs.usage('Prunenode_modulesfilesanddependencies\n\nUsage:node-prune').option('config',{alias:'c',description:'配置文件名',默认值:'.prune.json',类型:'string'}).option('dryrun',{别名:'d',描述:'dryrun',默认值:'false',type:'boolean'}).option('verbose',{description:'logprunedfileinfo',default:'false',type:'boolean'}).help('help').alias('help','h').version('version','0.1.0').alias('version','v').argv;常量路径=argv._[0]||'节点模块';constconfigs={config:argv.config,dryrun:argv.dryrun,verbose:argv.verbose};可以生成这样的结果:$prune-hPrunenode_modulesfilesanddependenciesUsage:node-pruneOptions:--config,-cconfigfilename[string][default:".prune.json"]--试运行,-d试运行[boolean][default:"false"]--verboselogprunedfileinfo[boolean][default:"false"]--help,-h显示帮助[boolean]--version,-v显示版本号[boolean]get参数后面可以导入自己写的业务代码进行操作,这里不再赘述。看了Github上的例子,我们可以通过npmpublis发布,下载安装工具,然后执行prune直接调用。AsyncTest测试代码也需要使用TypeScript和async/await。使用mocha进行BDD风格的测试。chai是一个可以很好地协同工作的断言库。$npminstallmochats-node-g$npminstallmochachaits-node--save-dev正常使用mocha会在test/目录下执行JavaScript。为了跳过翻译,直接测试TS代码,我们可以绑定ts-node直接执行测试代码,并添加到package.json:{"scripts":{"test":"mocha-rts-node/registertest/**/*.spec.ts"},}所以所有在test/下的*.spec.ts都会被测试,你可以使用await异步和期望来实现BDD。一个例子。Travis在项目语言下添加.travis.yml后添加项目语言的配置:node_jsnode_js:-"6"-"7"-"8"-"9"然后在https://travis添加自己的开源-ci.org/项目可以自动测试编译,每次推送都会测试。点击build|passing后,将图片的链接粘贴到项目的README中,即可显示CI在Github上的状态!原地址