linux运行nodejs一般路径_NodeJS和命令行程序

奇技指南

本文来自奇舞周刊公众号,转载请注明出处。作者:刘观宇,360 奇舞团高级前端工程师、技术经理,W3C CSS 工作组成员。

cc6c5941e924505bca684364e0519871.png

源 起

植根于Unix系统环境下的程序,很多都把贯彻Unix系统设计的哲学作为一种追求。Unix系统管道机制的发明者Douglas McIlroy把Unix哲学总结为三点:

  1. 专注做一件事,并做到极致。
  2. 程序协同工作。
  3. 面向通用接口,如文本数据流。

随着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下载并切换到一个新版本的过程。

8f87b00886bd33885df73565148ce854.gif

除了下载之外,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和n,n会运转不正常。一种方案是避免同时安装,另外可以手动修改PATH,使默认的NodeJS路径先于nvm的系统路径,如修改PATH片段为:

/usr/local/bin:/Users/leon/.nvm/versions/node/v10.6.0/bin:

执行辅助 nodemon/npx

nodemon是一个执行器,意义在于,如果版本变化或者程序变化,无需重新启动。这在开发时候非常有用。

nodemon还可以指定运行的端口,如:

nodemon ./server.js localhost 8080

除了控制NodeJS包之外,nodemon还可以控制非NodeJS脚本,比如:nodemon --exec "python -v" ./app.py,将监控app.py的内容,并在最开始以及发生变化时候,调用python -v进行解析。当然,如果你的app.py指定了shebang,也可以不需指定解析函数。

46536228b5870bce23efdf267228665a.png

nodemon有很多灵活的配置,通过这些配置,可以实现环境变量设置、延迟启动、命令执行、监控定制扩展名、优雅重启、事件监听等功能。做法是在需要这些配置的目录下,提供相关的配置nodemon.json,也可以在package.json中通过nodemonConfig字段指明。

在这里4 有官方提供的一份配置文件的样例,供读者参考。

再来说说npx。什么是npx呢?简单说,就是找到并运行一个包,并且“用完即走”。

这里有两层意思:

  1. 找到。从哪里找:先是当前的依赖,然后是PATH,还找不到就到网上找来安装。
  2. 用完即走。即使从网上安装的,运行完就会删掉,不会留下运行的包。 读者可以试着运行下:npx github:piuccio/cowsay "awesome npx"体验下。

这实在是居家旅行、开发调试的利器。比如我要在当前目录下开一个http服务,可以直接运行:npx http-server

78e5ebc2de05af008fcca1e1ae3366aa.png

之后就可以直接在浏览器访问这个地址进行调试了。

另外,如果你需要临时用一个老版本的node来运行某个脚本,也可以祭出npx,这个node会被临时安装、临时使用、用完即走。

npx -p node@6 npm init

切换NodeJS注册表 nrm/yrm

nrm/yrm维护了一个列表,包括npm主站和其他镜像。可以使用nrm/yrm use 快速切换,以达到最快的下载速度。nrm维护的是npm的注册表,yrm维护的是yarn注册表。

900d356617bd5c04c7048978051f6b6a.png

辅助编写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的输入产生帮助文案。

50d625db36f40bb98873b0dabe3f8c99.png

用户的每一个输入,都会放置在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: "█

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机怎么允许用户安装文件,如何禁止安装某个软件?电脑不允许安装软件的方法...

如何禁止安装某个软件?想要禁止安装软件,可以在组策略中直接启用软件安装规则,但如果只是想要禁用某个软件的安装,则需要用户将该软件的证书进行一个限制,证书不通过,自然无法安装,下面是操作步…

Docker日志收集最佳实践

传统日志处理 说到日志,我们以前处理日志的方式如下: 日志写到本机磁盘上 通常仅用于排查线上问题,很少用于数据分析 需要时登录到机器上,用grep、awk等工具分析 那么,这种方式有什么缺点呢? 第一&#x…

2020年10个诱人的技术里程碑

来源:IEEE电气电子工程师心理控制仿生四肢将首次亮相波士顿马拉松麻省理工学院的研究人员已经开发出一种只用思想控制仿生肢体的方法。2016年首次在人类身上试验。2020年,当在阿富汗失去腿的老兵Brandon Korona用他的新仿生肢参加波士顿马拉松比赛时&…

耶鲁大学计算机科学录取,耶鲁大学计算机科学研究生Offer及录取要求

对于打算去耶鲁大学读研究生的学生来讲,耶鲁大学研究生申请要求及耶鲁大学研究生专业介绍是学生最关心的问题。本文香港介绍耶鲁大学研究生申请要求及耶鲁大学研究生的专业介绍,帮助更多的学生更好的了解耶鲁大学。耶鲁大学研究生申请要求及专业介绍耶鲁…

什么是智能仓储?一文带你彻底搞懂!

来源:机器人网什么是智能仓储?智能仓储是仓库自动化的产物。与智能家居类似,智能仓储可通过多种自动化和互联技术实现。这些技术协同工作以提高仓库的生产率和效率,最大限度地减少人工数量,同时减少错误。在手动仓库中…

assign深拷贝_Object.assign 深拷贝?浅拷贝?

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。Object.assign(target, ...sources) 【target:目标对象】,【souce:源对象(可多个)】1.如果目标对象中的属性具有相同的键,…

python交互模式运行py文件_对Python的交互模式和直接运行.py文件的区别详解

很多初学的小伙伴总是搞不清交互模式和命令行模式,下面一起来了解一下。 看到类似C:\>是在Windows提供的命令行模式,看到>>>是在Python交互式环境下。 在命令行模式下,可以执行python进入Python交互式环境,也可以执行…

什么是具身认知?反身理论?

来源:人机与认知实验室 具身认知(Embodied cognition),也称“具体化”(embodiment),是心理学中一个新兴的研究领域。具身认知理论主要指生理体验与心理状态之间有着强烈的联系。生理体验“激活”…

todo已完成任务_这么多Todo工具,总有一个能让我告别拖延症!

写下这个标题之后,本喵就陷入了沉思:这个世界上,真的有能让人告别拖延症的工具吗?或者拖延症这个东西,真的需要告别吗?但不管怎么样,该有的todo工具还是要有毕竟,只有好好规划了待办…

【数字孪生】关于数字孪生的冷思考及其背后的建模和仿真技术

来源:系统仿真学报张霖 北京航空航天大学教授。曾任国际建模仿真学会(SCS)主席,北 航自动化 学院副院长等,现为ASIASIM主席,中国仿真学会常务理事,SCS Fellow,复杂产品先进制造…

合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)

这是 北航士谔书院 的第 940 篇推送北航士谔书院X大班提醒您:道路千万条,学习第一条不搞单片机,开学两行泪——新春快乐,我们又回来了!本文对 IC 总线的协议做出详细的介绍,并对其在 51 单片机上的应用代码…

webpack打包测试_2020年了,再不会webpack敲得代码就不香了(近万字实战)

前言2020年即将到来,在众多前端的招聘要求里,webpack、工程化这些字眼频率越来越高。日常开发者中,我们常常在用诸如vue-cli、create-react-app的脚手架来构建我们的项目。但是如果你想在团队脱颖而出(鹤立鸡群)、拿到更好的offer(还房贷),那么你必须去深…

可解释性 or 准确性?AI 模型就一定不能两者兼得吗?

来源: AI科技评论编译: 张大倩编辑:丛末模型的可解释性,已然成为了AI 领域最具挑战性的主题之一。一般规律中,模型的复杂度和准确性往往是正相关的关系,而越高的复杂度也意味着模型越可能无法实现可解释性。…

仓库温度湿度控制措施_药品仓库如何保持温湿度均衡?

各种药物器械本身的性质不同,储存的方式也就有所不同。一般常规的药品储存在温度10度-30度的仓库中最适宜,避免高温使药品因为受热,或低温潮湿,使受潮湿而发霉变质变形。药片更容易受潮,一般储存的仓库温湿度要在45%-7…

在疫情防控一线,技术能发挥什么作用?

来源:雷锋网新型冠状病毒感染的肺炎疫情在继续扩散。 截至 2020 年 1 月 26 日 24 时,国家卫生健康委收到 30 个省(区、市)累计报告确诊病例 2744 例,现有重症病例 461 例,累计死亡病例 80 例,累…

爱荷华大学计算机科学专业,爱荷华大学计算机科学专业好不好?专业设置详情一览...

自从计算机诞生以后,关于和计算机相关的行业发展的是越来越快,其中计算机科学专业就是其中一个,计算机专业的飞速发展对于人类的生活起到了重大的帮助,生活也发生了翻天覆地的变化,而美国是计算机的发源地,…

cpu工作原理flash动画_秒懂桥式整流工作原理(动画)

限时领取 | 20套电力系统及电气设备PPT资料(点蓝字,免费领资料↑↑)本文分享几张桥式整流电路工作原理的动画图。变压器u2正半周时电流通路变压器u2负半周时电流通路整个周期电流通路是这样的桥式整流电路输出波形与全波整流电路的一样,也是全波波形&…

python 创建一个空向量_Python之Django系列-创建第一个应用-5

上一篇:Python之Django系列-创建第一个应用-4这一章我们会讲到视图层怎么与数据库操作并返回数据到模板层进行渲染最终显示在页面上投票应用基本上会有这么几个视图问题列表页问题详情页问题结果页投票处理器在Django中,网页和其他内容都是通过视图派生而…

新计算机无法 盘启动不了,U盘无法被电脑识别导致制作U盘启动盘失败怎么办?...

我们知道,装系统的方式有很多,从之前的光盘装系统到现在的网上直接下载资源装系统,装系统的方式已经变得越来越简便了,但是相对来说,不少用户还是更加喜欢选择使用U盘来装系统的方式,因为U盘要比光盘和硬盘…

塔勒布: 2019-nCoV的系统风险:一份笔记

来源:混沌巡洋舰塔勒布的思考值得更多人了解,下面是对该文的全文翻译和注解:新型冠状病毒在中国武汉出现,这一病毒具有致命危险,也具有高度传染性。中国至今的反应措施有,几大主要城市已经对数以千万计的人…