最近山月开发了一个可以解析任意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整体的方向性变化有以下几点:+通过持久化硬盘缓存容量提升构建性能+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
