黑龙江网站备案,新生活cms下载,cms与wordpress,贵阳城乡和住房建设厅网站奇技指南本文来自奇舞周刊公众号#xff0c;转载请注明出处。作者#xff1a;刘观宇#xff0c;360 奇舞团高级前端工程师、技术经理#xff0c;W3C CSS 工作组成员。源 起植根于Unix系统环境下的程序#xff0c;很多都把贯彻Unix系统设计的哲学作为一种追求。Unix系统管道…奇技指南本文来自奇舞周刊公众号转载请注明出处。作者刘观宇360 奇舞团高级前端工程师、技术经理W3C CSS 工作组成员。源 起植根于Unix系统环境下的程序很多都把贯彻Unix系统设计的哲学作为一种追求。Unix系统管道机制的发明者Douglas McIlroy把Unix哲学总结为三点专注做一件事并做到极致。程序协同工作。面向通用接口如文本数据流。随着Unix/Linux系统在服务器上影响力越发强大以及各种跨平台解决方案的发展这种哲学也被带到了各种平台上。若干年前笔者第一次接触NodeJS和其包管理解决方案NPM时候就感觉到其官方倡导的风格和Unix系统哲学非常契合。近年来随着NodeJS在服务端以及前端构建领域上的不断开拓NodeJS的这种思想也正快速的渗透到这些领域。其实NodeJS的本身也是开发命令行程序的一个重要利器。本文就将介绍几个常用的NodeJS相关命令行程序之后介绍几个开发命令行中常用的组件最后介绍发布npm包以及带scope的包的发布方法。命令行是如何工作的命令行可以简单定义为是一种基于文本流的用户交互接口和交互方式。命令行程序常常通过命令行参数的传递来得到不同的运行方式。而由于一切命令的下达都是基于文本的所以也为元编程提供了便利。命令行程序可以是编译执行的也可以是解释执行的。对于编译后的命令行程序将直接以机器码执行。而对于大多数的解释型的命令行程序运行往往需要借助命令行解释程序。这篇文章中提到的命令行程序特指需要解释程序的命令行程序。可以充当命令行解释程序的其实包含了大家听说过的常见的解释器比如bash、zsh、perl、python、ruby、tcl等等当然还有NodeJS。打开一个命令行程序比较标准的写法是在第一行写明解释程序的路径如#!/usr/local/opt/python/bin/python3.6这里 #! 称为shebang一般位于文件的最开头。在Unix系统中#!所在行后面的部分将被视为解释器指令。同时会把文件所在路径作为参数附在解释器后面。上例中如果文件是/usr/local/bin/pip则直接运行/usr/local/bin/pip的效果等同于/usr/local/opt/python/bin/python3.6 /usr/local/bin/pip。这样做使得用户无需关心解释程序无需关心代码编写的语言直接运行对应的命令行程序本身就好了。这也是shebang存在的意义。不过由于系统设定的原因使用windows的同学可能无法享受这种便利一般还需手动指定解释程序的路径。但是他们可以双击运行:-)。可以试着用文本编辑工具打开一个NodeJS写成的脚本如webpack会发现其第一行是#!/usr/bin/env node。这句话并不是直接的NodeJS的解析程序。这里 /usr/bin/env是一个程序目的是从系统的PATH中寻找对应名字的解释程序的地址。此时解释程序可以被安装在各种路径只要在系统PATH中注册过就可以找到了。可能大家遇到过这种问题在运行某些NodeJS程序会出现报错/usr/bin/env: node: No such file or directory此时可以从系统PATH中是否有node这个文件路径、某些版本的NodeJS是否名为node等方向来排查问题。NodeJS相关好用的命令行工具在NodeJS目前已经成为前端工作流的主力语言的情况下 babel和webpack基本已经成为前端开发、测试、发布上的重要工具。同时围绕babel和webpack有一系列周边的工具包和插件协助开发者完成日常开发的方方面面。同时目前最为流行的前端框架Angular、react、vue(以首字母为序)各自有自带的脚手架和开发辅助工具。如ng-cli、create-react-app和vue-cli等等。更有Poi1这样的通吃React和Vue的脚手架工具。上面这部分每一个都可以独立出来单独讲解。有兴趣的读者可以参考上述工具的官方网站获取更多信息。下面来说几个其他方面的NodeJS相关的软件包。多版本共存 n/nvm大多数情况我们只需面对单一的NodeJS版本。等到时机成熟再统一把NodeJS版本升级到更高版本。不过笔者就曾经遇到过一个年久失修失修的项目需要重新维护的情况。此时需要把NodeJS版本切到老版本。同时我们也不想舍弃大多数项目运行的新版本NodeJS环境。这种情况可以使用n或nvm。下图展示了用n下载并切换到一个新版本的过程。除了下载之外n还提供了列表的方式切换多个版本以及删除某个版本的方法。读者可以在安装之后使用n -h查看所有可用参数。n采用bash编写。但提供了一个npm仓库安装的入口可以使用大家传统意义的npm安装法进行全局安装前提是你必须有一个可以运行的NodeJS环境。npm install -g n或者在没有NodeJS的环境下可以使用n-install脚本。安装只需运行curl -L https://git.io/n-install | bash。如果是windows用户在windows10下面可以安装wsl来获得Linux脚本运行环境官方仓库的一个issues对此有一个操作说明2。对windows10以下的用户可以考虑折腾下Cygwin。除了n之外还有一个管理工具为nvm也是采用bash脚本编写。安装亦可使用安装脚本来完成。如curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash 或 wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash。这里的v0.34.0是版本号可能会随着版本迭代而变化。使用windows的读者除了上述wsl和Cygwin之外可以考虑使用nvm-windows3这个用Golang编写的版本。就目前的最新版本来说n和nvm的都会尝试处理公共的依赖库然而处理方式是不一样的。n和nvm都会在首次使用某个版本时将此版本的NodeJS下载至本地不同的是n将尝试用新版本代替系统路径中关键路径如bin、lib、include、share的包。nvm则是保留每一个版本的副本并将NodeJS的系统路径指向.nvm维护的沙箱地址。从处理上nvm显得更轻量和高效但是需要修改系统的PATH这一步nvm脚本会自动完成。n则无需入侵系统路径但每次修改时候均需操作系统路径且此时最好使用sudo n运行避免因权限不足拒绝向系统路径复制。由于nvm会修改PATH地址所以如果同时默认安装nvm和nn会运转不正常。一种方案是避免同时安装另外可以手动修改PATH使默认的NodeJS路径先于nvm的系统路径如修改PATH片段为/usr/local/bin:/Users/leon/.nvm/versions/node/v10.6.0/bin:执行辅助 nodemon/npxnodemon是一个执行器意义在于如果版本变化或者程序变化无需重新启动。这在开发时候非常有用。nodemon还可以指定运行的端口如nodemon ./server.js localhost 8080除了控制NodeJS包之外nodemon还可以控制非NodeJS脚本比如nodemon --exec python -v ./app.py将监控app.py的内容并在最开始以及发生变化时候调用python -v进行解析。当然如果你的app.py指定了shebang也可以不需指定解析函数。nodemon有很多灵活的配置通过这些配置可以实现环境变量设置、延迟启动、命令执行、监控定制扩展名、优雅重启、事件监听等功能。做法是在需要这些配置的目录下提供相关的配置nodemon.json也可以在package.json中通过nodemonConfig字段指明。在这里4 有官方提供的一份配置文件的样例供读者参考。再来说说npx。什么是npx呢简单说就是找到并运行一个包并且“用完即走”。这里有两层意思找到。从哪里找先是当前的依赖然后是PATH还找不到就到网上找来安装。用完即走。即使从网上安装的运行完就会删掉不会留下运行的包。 读者可以试着运行下npx github:piuccio/cowsay awesome npx体验下。这实在是居家旅行、开发调试的利器。比如我要在当前目录下开一个http服务可以直接运行npx http-server之后就可以直接在浏览器访问这个地址进行调试了。另外如果你需要临时用一个老版本的node来运行某个脚本也可以祭出npx这个node会被临时安装、临时使用、用完即走。npx -p node6 npm init切换NodeJS注册表 nrm/yrmnrm/yrm维护了一个列表包括npm主站和其他镜像。可以使用nrm/yrm use 快速切换以达到最快的下载速度。nrm维护的是npm的注册表yrm维护的是yarn注册表。辅助编写NodeJS包除了直接用大神们写好的命令之外我们也可以按照自己的需求定制自己需要的NodeJS包。我们知道命令行其实也是一种人机交互因此交互上有很多可以借鉴的效果。编写者只需将包倒入就可以使用这些交互效果。这里笔者给大家推荐几个包命令行参数读取 commander命令行的一个特点就是根据参数的不同调整运行策略。然而处理命令行输入以及验证是一个非常繁琐的事情。为此TJ大神曾经创立了commander包。最基础的用法如下var program require(commander);program .version(0.1.0) .option(-p, --peppers, Add peppers) .option(-P, --pineapple, Add pineapple) .option(-b, --bbq-sauce, Add bbq sauce) .option(-c, --cheese [type], Add the specified type of cheese [marble], marble) .parse(process.argv);console.log(you ordered a pizza with:);if (program.peppers) console.log( - peppers);if (program.pineapple) console.log( - pineapple);if (program.bbqSauce) console.log( - bbq);console.log( - %s cheese, program.cheese);默认地commander会自动创建-h的帮助文件即利用每一个option的输入产生帮助文案。用户的每一个输入都会放置在program对应option长名的字段的驼峰形式上如果没有提供长名则放在短名字段上。上例中如使用 testcommander -p 111 -P 222 -b 333则依次存储在program的peppers、pineapple和bbqSauce上。同时commander提供多种验证方式如正则表达式program.option(-s --size , Pizza size, /^(large|medium|small)$/i, medium)则指定只能输入特定的值。同时commander提供一个方案允许用户设置子命令。commander称之为Git风格的子命令。var program require(commander);program .version(0.1.0) .command(install [name], install one or more packages) .command(search [query], search with optional query) .command(list, list packages installed, {isDefault: true}) .parse(process.argv);这个例子中假设命令行名字为pm则当用户输入pm-install、pm-search或pm-list时候commander会尝试在入口文件的同一级目录找到install、search或list并交给这个文件去执行。进度条 progress在编写web程序时候大家经常会展示一个进度条。用以缓解用户在等待时候的焦虑。其实在命令行程序中也会有这种交互方式。比如wget就会在下载过程中给出进度提示。在NodeJS中也有这样的效果可以使用。这就是progress包。下面的代码运行结果是下载CentOS安装盘。在下载之中会实时打印进度const ProgressBar require(progress)const request require(request)const progress require(request-progress)const fs require(fs)const download (url, headers, target, totalSize) { let percent 0 const bar new ProgressBar(下载中: ├:bar┤ 完成:percent 预估完成时间:eta秒 用时:elapseds, { total: 100, complete: █