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用他的新仿生肢参加波士顿马拉松比赛时&…

goland 方法注释_goland 设置注释模板的过程图文详解

网上找了一些办法 都没有说到关键点:梳理一下设置步骤如下,以及避免的坑。新建文件自动加注释:Preferences | Editor | File and Code Templates 打开go File 在右侧输入模板,然后点击Apply;对已有的方法或者文件添加注…

python爬虫源码下载 视频_Python爬虫下载视频文件部分源码

importrequestsimporttime headers{User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36} movie_url 在这里输入视频地址,例如:http://www.***********.mp4movie_name 视…

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

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

PHP的错误处理机制

php的错误处理是比较复杂的, 本文讲解php中所有错误相关的重要知识点做一次梳理, 便于理解php的错误机制. 基础知识 在此之前, 先熟悉一下php error的基础知识 预定义常量运行时配置异常错误处理函数预定义常量 定义了所有php的错误类型常量, 每一个常量都是一个整型数值, 它的…

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

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

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

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

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

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

HTML文件属于void值吗,使用HTML :: TreeBuilder查找html文件中的值

找到与匹配内容,在这种情况下,“磁盘空间使用情况”,然后找到下一个。一旦你有一个元素树:my $usage $t->look_down(_tag > td,sub {$_[0]->as_trimmed_text() ~ /^Disk Space Usage$/})->right()->as_trimmed_te…

SQL Server-基础-经典SQL语句

1 经典SQL语句2 基础3 1、说明:创建数据库4 CREATE DATABASE database-name 5 2、说明:删除数据库6 drop database dbname7 3、说明:备份sql server8 --- 创建 备份数据的 device9 USE master10 EXEC sp_addumpdevice disk, testBack, c:\mss…

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

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

spring字符串判空_字符串工具类StringUtils实现字符串是否中文、字符串分割/判空/替换/查找、是否包含乱码及字符串数组合并等常规操作...

一、前言关于字符串工具类StringUtils实现字符串是否包含isChinese中文、是否包含isMessyCode乱码、常规数据类型转换、替换/删除/判空、两字符串数组mergeStringArrays合并、删除trimArrayElements字符串数组指定数组元素、字符串去重removeDuplicateStrings处理、字符串集合转…

成人高考 计算机英语作文,2017年成人高考英语作文范文

本文“2017年成人高考英语作文范文”,跟着出国留学网成人高考频道来了解一下吧。希望能帮到您!假设你叫王红,于5月7日星期五在学校门口看到两则海报后,决定邀你的好友Harry一起参加其中的一项活动。你赶到Harry住处时,发现他不在。…

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

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

php后台接受上传图片

配合上个博文的&#xff0c;捣鼓了一个php后台的东西&#xff0c;虽然不怎么懂&#xff0c;但慢慢来&#xff0c;还是可以的。传送门 java太不好学了&#xff0c;玩玩php&#xff0c;满足一下自己。 那个图片压缩的效果很明显&#xff0c;居然压缩了好几倍。 <?php header(…

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

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

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

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

计算机网络画出发送窗口变化,2010年7月计算机网络原理试题及答案

全国2010年7月计算机网络原理试题一、单项选择题(本大题共24小题&#xff0c;每小题1分&#xff0c;共24分)1.由一组用户群构成、不需要基站、没有固定路由器的移动通信网络是( C )A.蜂窝通信网B.无线局域网C.Ad hoc网络D.虚拟专用网2.广域网WAN一般采用( D )A.“广播”传输方式…