返回顶部
首页 > 资讯 > 精选 >Nodejs和命令行程序是什么
  • 296
分享到

Nodejs和命令行程序是什么

2023-06-15 06:06:08 296人浏览 泡泡鱼
摘要

这篇文章主要介绍nodejs和命令行程序是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!源起植根于Unix系统环境下的程序,很多都把贯彻Unix系统设计的哲学作为一种追求。Unix系统管道机制的发明者Dougla

这篇文章主要介绍nodejs和命令行程序是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

源起

植根于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目前已经成为前端工作流的主力语言的情况下, babelWEBpack基本已经成为前端开发测试、发布上的重要工具。同时围绕babelwebpack有一系列周边的工具包和插件协助开发者完成日常开发的方方面面。

同时,目前最为流行的前端框架angularReactVue(以首字母为序),各自有自带的脚手架和开发辅助工具。如ng-clicreate-react-appvue-cli等等。更有Poi这样的通吃React和Vue的脚手架工具。

上面这部分每一个都可以独立出来单独讲解。有兴趣的读者可以参考上述工具的官方网站获取更多信息。

下面来说几个其他方面的NodeJS相关的软件包。

多版本共存 n/nvm

大多数情况,我们只需面对单一的NodeJS版本。等到时机成熟,再统一把NodeJS版本升级到更高版本。

不过笔者就曾经遇到过一个年久失修失修的项目需要重新维护的情况。此时需要把NodeJS版本切到老版本。同时,我们也不想舍弃大多数项目运行的新版本NodeJS环境。

这种情况可以使用n或nvm。下图展示了,用n下载并切换到一个新版本的过程。

Nodejs和命令行程序是什么

除了下载之外,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,对此有一个操作说明。

对windows10以下的用户,可以考虑折腾下Cygwin

除了n之外,还有一个管理工具为nvm,也是采用bash脚本编写。安装亦可使用安装脚本来完成。如:curl -o- Https://raw.GitHubusercontent.com/creationix/nvm/v0.34.0/install.sh | bashwget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash。这里的v0.34.0是版本号,可能会随着版本迭代而变化。

使用windows的读者,除了上述wslCygwin之外,可以考虑使用nvm-windows这个用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,也可以不需指定解析函数。

Nodejs和命令行程序是什么

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

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

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

这里有两层意思:

  • 找到。从哪里找:先是当前的依赖,然后是PATH,还找不到就到网上找来安装。

  • 用完即走。即使从网上安装的,运行完就会删掉,不会留下运行的包。 读者可以试着运行下:npx github:piuccio/cowsay "awesome npx"体验下。

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

Nodejs和命令行程序是什么

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

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

npx -p node@6 npm init

切换NodeJS注册表 nrm/yrm

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

Nodejs和命令行程序是什么

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

Nodejs和命令行程序是什么

用户的每一个输入,都会放置在program对应option长名的字段的驼峰形式上,如果没有提供长名,则放在短名字段上。上例中,如使用: testcommander -p 111 -P 222 -b 333则依次存储在programpepperspineapplebbqSauce上。

同时,commander提供多种验证方式,如正则表达式

program.option('-s --size <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-installpm-searchpm-list时候,commander会尝试在入口文件的同一级目录找到installsearchlist,并交给这个文件去执行。

进度条 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: "█",        incomplete: "─",        width: 60    })    let opt = {        headers,        url: url    }    return new Promise((resolve, reject) => {        progress(request.get(opt))            .on('progress', function (state) {                let progressFix = ((state.percent) * 100).toFixed(2)                delta = progressFix - percent                bar.tick(delta)                percent = progressFix            })            .on("error", () => {                return reject()            })            .on('end',  () => {                bar.tick(100 - percent)                console.log('\n')                return resolve(target)            })            .pipe(fs.createWriteStream(target));    })}const foo = {    getHeaders: () => {        const headers = {            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',            'Accept-Charset': 'UTF-8,*;q=0.5',            'Accept-Encoding': 'gzip,deflate,sdch',            'Accept-Language': 'en-US,en;q=0.8',            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0'        }        return Object.assign({}, headers)    },    download: function (url, target, totalSize){        let headers = this.getHeaders()        headers = Object.assign(headers)        download(url, headers, target, totalSize)    }}foo.download("http://mirrors.cmich.edu/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso",    "CentOS-7-x86_64-DVD-1810.iso", 4508876.8    )

运行的结果如图:

Nodejs和命令行程序是什么

这个包的核心就是根据内置和自定义的token在命令行打印出相应的字符,用以完成交互。

交互着色 chalk

chalk是一个命令行交互的着色工具。在命令行支持的情况下,可以支持最多16位色域(前提是命令行终端可以支持)。一般可以配合console.log使用,如:

const chalk = require('chalk');const log = console.log;// Combine styled and nORMal stringslog(chalk.blue('Hello') + ' World' + chalk.red('!'));

笔者曾经做过一个在命令行下显示图片的程序,就是利用的chalk和console.log进行的配合。

Nodejs和命令行程序是什么

交互式问答 inquirer

在需要不断的同用户进行交互式问答,并根据用户的输入进行验证和路径选择,这个时候inquirer是非常趁手的工具。它内置了单选、多选、问答等多种交互方式。大家可以感受下:

Nodejs和命令行程序是什么

Nodejs和命令行程序是什么

Nodejs和命令行程序是什么

Nodejs和命令行程序是什么

Nodejs和命令行程序是什么

Nodejs和命令行程序是什么

甚至可以通过插件实现suggest

Nodejs和命令行程序是什么

vue框架的脚手架vue-cli是一个使用inquire的绝佳案例,读者可以通过阅读源码,感受下大神出神入化的使用。

小图标 ora

ora打印出一个优雅的文本小图标,用于在各种情况下给出用户优雅而清晰的提示。用法很简单:

const ora = require('ora');const spinner = ora('Loading unicorns').start();setTimeout(() => {spinner.color = 'yellow';spinner.text = 'Loading rainbows';}, 1000);

Nodejs和命令行程序是什么

命令行玩浏览器 puppeteer

puppeteer是谷歌开发的无头浏览器,使得命令行亦可操作浏览器,并能根据浏览器的执行结果进行进一步操控。因为puppeteer源自官方,所以之前类似项目PhantomJS的开发者决定不再更新PhantomJS。

目前puppeteer已经广泛用于前端测试,端对端测试,以及爬虫

鉴于篇幅无法展开介绍,读者可以参考其官方文档。同时,奇舞周刊中黄小璐老师的的这篇文章以及李光钊老师的这篇文章都曾经介绍过puppeteer的使用。

发布NodeJS包

写好的NodeJS包需要发布出去,才能给大家使用。npm publish就是为了这个需求而产生的。为了发布你需要在npm上注册用户,并登录,然后发布就好了。npm的详情页面以及各个镜像会在一段时间内自动更新。

如果你的NodeJS包,是使用尚未广泛支持的语法写成的。那么需要在package.json的script字段加入prepublish命令,调用babel等预编译器处理,使得程序可以有更多的兼容性。

对于希望用户在全局使用的命令,要注意在根目录写好入口,一般是在package.json中的bin字段,指定入口文件。在安装时,如果是全局安装,npm将会使用符号链接把这些文件链接到prefix/bin,如果是本地安装,会链接到./node_modules/.bin/。

除了通常的包,还有一种是带有scope的包,vue-cli的3.0版本就是@vue开头的。这个scope是组织的名字。每一个带有scope的包有公有和私有之分,私有的需要付费给npm。

目前npm的读写权限策略如下:

Nodejs和命令行程序是什么

如果是个人,可以考虑增加公有的命名空间。如果是企业付费用户,你在发布相关包之前,需要申请成为这个scope的member。

对公有scope,首先将包的name改为@scope名字/包名,同时,在发布时,使用npm publish --access public即可。

以上是“Nodejs和命令行程序是什么”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Nodejs和命令行程序是什么

本文链接: https://lsjlt.com/news/278281.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Nodejs和命令行程序是什么
    这篇文章主要介绍Nodejs和命令行程序是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!源起植根于Unix系统环境下的程序,很多都把贯彻Unix系统设计的哲学作为一种追求。Unix系统管道机制的发明者Dougla...
    99+
    2023-06-15
  • 用什么库写Python命令行程序
    这篇文章主要介绍“用什么库写Python命令行程序”,在日常操作中,相信很多人在用什么库写Python命令行程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”用什么库写Python命令行程序”的疑惑有所帮助!...
    99+
    2023-06-16
  • 用什么命令行查看nodejs版本号
    本篇内容主要讲解“用什么命令行查看nodejs版本号”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“用什么命令行查看nodejs版本号”吧! ...
    99+
    2024-04-02
  • mysql命令行是什么
    mysql命令行是一个文本界面,用于与mysql数据库交互,可执行以下操作:创建和管理数据库;创建和管理表;插入、更新和删除数据;查询和检索数据;管理用户和权限。 MySQL命令行 M...
    99+
    2024-04-14
    mysql
  • Java程序员必知的Unix Shell命令行路径是什么?
    作为一名Java程序员,熟悉Unix Shell命令行路径是非常重要的。因为在开发过程中,我们经常需要在命令行窗口中执行一些操作,例如编译、运行、调试等。在这个过程中,掌握一些基本的命令行路径知识,可以帮助我们更快地定位和解决问题。 本文...
    99+
    2023-10-12
    unix shell path
  • linux命令和dos命令指的是什么
    这篇“linux命令和dos命令指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“l...
    99+
    2023-02-15
    linux dos
  • mysql命令行工具是什么
    mysql命令行工具是一款命令解释器,用于管理mysql数据库服务器。其功能包括连接到服务器、创建/删除数据库、表和数据,以及查询、管理用户和监控性能。使用方法:打开命令提示符,输入"m...
    99+
    2024-04-14
    mysql linux macos
  • Linux命令行下的常用svn命令是什么
    Linux命令行下的常用svn命令是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。svn是Linux系统中一个版本控制软件,进行文件的一个版本的管理工具,接下来和大家分...
    99+
    2023-06-28
  • 命令行中怎么查看nodejs目录
    小编给大家分享一下命令行中怎么查看nodejs目录,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 命...
    99+
    2024-04-02
  • Linux上行扩展命令是什么
    本篇内容主要讲解“Linux上行扩展命令是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux上行扩展命令是什么”吧!Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,...
    99+
    2023-06-12
  • Ubuntu的命令行终端是什么
    Ubuntu的命令行终端是一个名为Terminal的应用程序,它允许用户在Ubuntu操作系统中使用命令行进行各种操作和任务。Ter...
    99+
    2024-04-02
  • debian桌面和命令行切换的方法是什么
    在Debian系统中,可以通过以下方法在桌面和命令行之间切换: 使用键盘快捷键:在桌面环境中,通常可以使用Ctrl + Alt ...
    99+
    2024-03-04
    debian
  • find命令的结果顺序是什么
    目录1. 目的2. 准备: 克隆 doxygen 源码3. Ubuntu22.04 结果4. ubuntu16.04 结果5. git bash 结果6. 三路比较7. 保持一样的结果: 用自然排序8. Referenc...
    99+
    2023-05-23
    find命令的结果顺序 find命令
  • pyw格式、命令行运行python程序与
    pyw格式简介:   与py类似,我认为他们俩卫衣的不同就是前者运行时候不显示终端窗口,后者显示 命令行运行python程序:   在我学习python的过程中我通常使用IDLE来运行程序,这一步骤太过繁琐(需要打开文件,再按下F5),使...
    99+
    2023-01-30
    命令行 格式 程序
  • C#程序调用cmd.exe执行命令
    在windows环境下,命令行程序为cmd.exe,是一个32位的命令行程序,微软Windows系统基于Windows上的命令解释程序,类似于微软的DOS操作系统。输入一些命令,cm...
    99+
    2024-04-02
  • linux如何运行c程序命令
    在Linux中,运行C程序的命令为:1. 编写C程序:使用任意文本编辑器创建一个以`.c`为扩展名的C源文件,比如`program....
    99+
    2023-08-25
    linux
  • Shell脚本中多命令逻辑的执行顺序是什么
    本篇文章给大家分享的是有关Shell脚本中多命令逻辑的执行顺序是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.分号";"command1 ; com...
    99+
    2023-06-09
  • Linux中install命令和cp命令的区别是什么
    这篇文章给大家介绍Linux中install命令和cp命令的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。它们之间的区别主要如下:最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件,而insta...
    99+
    2023-06-12
  • python中的命令行框架是什么
    python中的命令行框架是bullet框架bullet是一个python命令行交互框架,其具有确认表单、输入、是否确认、密码输入框、提示、输入数据类型的验证、滑动提示、和进度条功能。...
    99+
    2024-04-02
  • linux运行文件的命令是什么
    这篇“linux运行文件的命令是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linu...
    99+
    2023-01-30
    linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作