当前位置: 首页 > 科技观察

讲解Node如何由浅入深开发一个命令行工具

时间:2023-03-18 14:45:59 科技观察

最近山月开发了一个可以解析任意URL内容并生成markdown的客户端小工具:markdown-read。用于我个人的公众号内容获取和一些优质的内容收藏。欢迎Star,下载使用。$markdownhttps://juejin.cn/post/6924258563862822919|head-10>本文作者:Wind,Skyler,ZRJ,ZJ##前言Webpack5于2020年10月10日正式发布,一直在快速发展经过几个月的演进和迭代,截至1月28日,Webpack5已经更新了18个小版本,带来了很多吸引人的新特性。根据【官网介绍】(https://webpack.js.org/blog/2020-10-10-webpack-5-release/#general-direction《官网介绍》),Webpack5整体的方向性变化有以下几点:![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/77ee2267bfa34ef5bf7bb29553a5035c~tplv-k3u1fbpfcp-zoom-1.image)+通过持久化硬盘缓存容量提升构建性能+passBetteralgorithmstoimprovelong-termcaching(降低产品资源的缓存失败率)。用Node开发命令行工具也很常见,也很有意思。总结命令行工具。什么是命令行工具?最初的印象大概就是ls,pwd,这些可以在终端执行的系统命令,这样的命令有很多,统称为系统内置命令。如果用which查一下它们的来历,就能发现它们的真面目:$whichpwdpwd:shellbuilt-incommand随着对Linux/Unix系统的了解和使用逐渐深入,发现了很多非内置命令:toppsnetstatdigmanuseWhich检测情况,发现他们实际的执行路径是在某个bin目录$whichtop/usr/bin/top$whichps/bin/ps而这些bin目录在环境变量PATH中,一下子就明白了。简而言之:PATH中路径上的命令可以在其他任何地方执行。exportPATH=$HOME/bin:/usr/local/bin:$PATH你好像想到了什么?大学配置Java时被环境变量支配的各种恐惧?是的,所有语言的可执行命令都必须放在PATH下,只不过其他语言自动帮你做而已,而Java让你自己做。javapythonpipnodenpm开发命令行的原理也是一样的,本文的目标是使用前端开发者熟悉的Javascript语言,借助Node环境开发一个命令行工具。原理先看两个命令行工具:serve是比较流行的静态文件服务器,markdown是自己写的命令行,用来解析url到markdow。使用命令解析他们指向的符号链接$ls-lah$(whichserve)lrwxr-xr-x1xiangeadmin65B7122020/usr/local/bin/serve->../../../Users/shanyue/.config/yarn/global/node_modules/.bin/serve$ls-lah$(whichmarkdown)lrwxr-xr-x1xiangeadmin48B12820:06/usr/local/bin/markdown->../lib/node_modules/markdown-read/md-read-cli。js可以看他们对命令行的分析:npm全局下载包到/usr/local/lib/node_modules(yarn也是一样)根据package.json中bin选项的说明,挂载对应的二进制脚本到PATH路径对应的二进制脚本加上x权限(可执行文件权限)简而言之,Node环境下的命令行工具无非就是使用环境变量Path和package.json中package.json的符号链接bin选项为用于指定最终命令行工具的名称{"bin":{"markdown":"./md-read-cli"}}如上所示,markdown是最终在终端执行的命令,而./md-read-cli是命令实际执行的文件。对于最终可执行的命令行工具,Node项目一般都比较喜欢将文件放在bin目录下,比如下面的Typescript配置:{"bin":{"tsc":"./bin/tsc","tsserver":"./bin/tsserver"},}一个执行环境对于可以直接执行的文件,需要指定执行环境,在第一行加一行解释:#!/usr/bin/envnode//code这句话写下来是什么意思?#!后面是解释器,表示文件使用/usr/bin/env节点执行/usr/bin/env是env的绝对路径,用于执行PATH路径下的命令(在各种系统中,位置node命令行不一样,所以用envnode找路径执行)envnode可以理解为在人的层面上执行node命令,所以这句话的意思是:用node执行这个脚本//不要写#!/usr/bin/envnode$nodeserve.//写#!/usr/bin/envnode$serve。解析命令输入$nodecmd.js123//Output:[//'/usr/local/bin/node',//'/Users/shanyue/cmd.js',//'1',//'2',//'3',//]process.argv根据解析process.argv获取各种参数作为命令行输入,当然解析参数也要参考基本规则:格式、可选、必填、缩写、描述、帮助等等,命令行工具命名约定一文已经说的够详细了。//更常规的命令行帮助)--indicatetheendofnodeoptions--abort-on-uncaught-exceptionabortinginsteadofexitingcausesacorefiletobegeneratedforanalysis-c,--checksyntaxcheckscriptwithoutexecution--completion-bashprintsource-ablebashcompletionscript--cpu-prof在启动时启动V8CPU配置文件,并在退出前将CPU配置文件写入磁盘。学习了多个解析命令参数的库,实际工作中直接使用!yargs:Star8.5K,weeklydownloads4900Kcommander:Star19.7K,weeklydownloads5300K,tj大师的作品使用commander解析不同的输入Instructionconst{program}=require('commander')//分析不同的指令输入程序。option('-d,--debug','outputxtradebugging').option('-s,--small','smallpizzasize').option('-p,--pizza-type','flavourofpizza')program.parse(process.argv)constoptions=program.opts()console.log(options)丰富的色彩体验NextBuildoutput目前大部分终端都支持彩色输出。丰富的高亮颜色就像代码高亮一样,让用户可以快速抓住重点,用不同的颜色标记异常、警告、成功信息。命令行工具的输出是不言自明的。大多数现代构建工具,例如Webpack,也支持彩色输出。下面是命令行工具常用的两个颜色库,支持各种颜色的输出。粉笔颜色下面是一个粉笔的例子,Error和Warning信息用不同的颜色表示constchalk=require('chalk')consterror=chalk.bold.redconstwarning=chalk.keyword('orange')console.log(error('Error!'))console.log(warning('Warning!'))发布安装辛辛苦苦写了一个cli工具,是时候查看结果了。发布到npm仓库,让大家可以使用你的命令行工具,这也是最重要的一步#发布前需要npmlogin,登录npmregistry$npmpublish发布成功后,全局下载命令行工具,开始使用.用它抓取例子记下我的博客主页$npmi-gmarkdown-read/usr/local/bin/markdown->/usr/local/lib/node_modules/markdown-read/md-read-cli.js+markdown-read@1.1.0added102packagesfrom72contributorsandupdated10packagesin33.15s$markdownhttps://shanyue.tech##[#](#山岳的统计博客客记录)本博客在日常工作中做文章总结。以后我也会做前端进阶系列、个人服务器指南系列等系列文章输出。个人微信shanyue94,欢迎加交流##[#](#名称来源)名字由来内容提要本文从浅入深地讲解了以下几个方面:Node开发的全局可执行命令行工具的原理是什么命令行工具需要的配置开发命令行工具时如何解析参数,根据实践,开发了一个从URL读取Markdown的小工具:markdown-read,欢迎Star,下载使用。另外我基于这个命令行做了一个网页版,欢迎体验:https://devtool.tech/html-md。转载本文请联系全栈成长之路公众号。