Node.js指南,第3部分:托管,REPL,控制台操作,模块

这是Node.js手册翻译的第三部分。 今天,我们将讨论如何为Node.js项目选择托管,如何在REPL模式下使用Node.js以及如何运行带有参数的脚本,如何与控制台和模块进行交互。




托管Node.js应用程序


托管Node.js应用程序的选择取决于您的需求。 以下是托管选项的简短列表,您可以通过决定部署应用程序并将其公开来进行探索。 首先,考虑一些简单的选项,这些选项的功能是有限的,然后变得更复杂,但功能也更加严重。

hosting最简单的托管选项:本地隧道


即使将动态IP地址分配给您的计算机,或者您位于NAT之后,也可以在其上部署应用程序,并使用本地隧道为它提供用户请求。

此选项适用于快速组织测试,安排产品演示或使极少数人能够访问应用程序。

对于组织许多平台的本地隧道ngrok来说 ,这是一项非常好的服务。

使用ngrok,足以执行ngrok PORT形式的命令,并且您可以从Internet访问指定的端口。 同时,如果您使用服务的免费版本,则您将在ngrok.io域中找到一个地址。 如果决定获得付费订阅,则可以使用自己的域名,此外,还可以提高解决方案的安全性(使用ngrok,可以在Internet上打开对计算机的访问权限)。

可以用来组织本地隧道的另一种工具称为localtunnel

ing用于部署不需要配置的Node.js项目的环境


毛刺


Glitch是用于快速应用程序开发的交互式环境和平台,允许您将它们部署在glitch.com子域中。 该平台尚不支持其自己的用户域,使用该平台存在一些限制 ,但对于处理应用程序原型非常有用。 Glitch的设计看起来很有趣(也许可以写成这个平台的优点),但这并不是某种非常有限的“玩具”环境。 在这里,您将有机会使用Node.js,CDN,用于机密信息的安全存储库,与GitHub交换数据的功能以及更多其他功能。

Glitch项目由FogBugz和Trello(StackOverflow的创建者之一)背后的同一家公司运营。 我经常使用这个平台来演示应用程序。

码笔


Codepen是一个不错的平台,周围形成了一个有趣的社区。 在这里,您可以创建包含许多文件的项目,并使用自己的域来部署它们。

▍无服务器环境


无服务器平台使您无需完全考虑服务器,设置或管理服务器即可发布应用程序。 无服务器计算的范例是应用程序发布为响应对网络端点的调用的函数。 一种类似的应用程序部署方法也称为FAAS(功能即服务,功能即服务)。

以下是该领域的一些流行解决方案:


这两个项目都为开发人员提供了一定程度的抽象,从而允许在各种FAAS平台上发布应用程序,例如Amazon AWS Lambda,Microsoft Azure和Google Cloud。

ASPAAS解决方案


PAAS(平台即服务,平台即服务)是负责许多事情的平台,在正常情况下,应由部署应用程序的开发人员来照顾。

现在时代


Zeit是用于部署应用程序的有趣选项。 使用此平台进行的部署归结为在终端中输入now命令。 有一个免费版本的Zeit,使用它时有一些限制。 该平台还有一个付费的,功能更强大的版本。 使用Zeit,您根本无法考虑您的应用程序需要服务器这一事实。 您只需部署应用程序,其他所有内容均由该平台管理。

纳米盒


Nanobox平台(包括Node.js应用程序的部署)的创建者将其称为PAAS V2。

Heroku


Heroku是另一个用于托管Node.js应用程序的出色平台。 这是一篇关于如何使用它好文章。

微软天蓝色


Azure是Microsoft的云平台。 其文档中有关于Node.js应用程序的部分

Google Cloud Platform


Google Cloud是用于部署Node.js应用程序的绝佳环境。 这是其文档相关部分。

▍VPS主机


提供VPS托管服务的平台很多。 这种平台的一个共同特征是,开发人员可以使用虚拟服务器,可以在其上独立安装操作系统(Linux或Windows),并可以独立部署应用程序。

在提供VPS服务的平台中,有很多,我们可以注意到以下内容,这些是我使用过的,可以推荐给其他人:


我们自己补充说, RUVDS还提供VPS托管服务。 我们已获得FSTEC的许可,我们的客户已获得AIG的保险,我们在不同国家/地区拥有四个数据中心。 在莫斯科地区科罗廖夫市拥有自己的数据中心RUCLOUD TIER 3,在数据中心Deltalis(瑞士)伦敦Equinix LD8(英国)MMTS-9 (俄罗斯莫斯科)中有压力区。 所有密闭区的可靠性至少达到TIER 3级。

该公司的合作伙伴是FINAM JSC,BCS金融集团,国家结算存管所(莫斯科交易所),VTsIOM JSC,Gars-Telecom公司,Gett出租车运营商,Delivery Club交付运营商等。


▍普通服务器


另一个托管解决方案是购买(或租用,例如,使用Vultr Bare Metal服务 )常规服务器,在其上安装Linux和其他软件,将其连接到Internet并在其上托管Node.js应用程序。

托管是一个巨大的主题,但是希望本节中的材料将使您能够准确选择所需的内容。 现在,我们来谈谈在REPL模式下使用Node.js的故事。

在REPL模式下使用Node.js


缩写REPL代表Read-Evaluate-Print-Loop(循环“读取-计算-输出”)。 使用REPL是快速探索Node.js功能的好方法。

如您所知, node命令用于在Node.js中运行脚本,如下所示:

 node script.js 

如果您输入相同的命令,但未指定文件名,则将以REPL模式启动Node.js:

 node 

如果您现在尝试在终端中输入这样的命令,那么您将看到类似以下内容:

 > node > 

Node.js现在处于待机模式。 系统希望我们在将要执行的命令行上输入一些JavaScript代码。

首先,让我们尝试一些非常简单的方法:

 > console.log('test') test undefined > 

在这里,我们建议Node.js执行用于将数据输出到控制台的命令。 第一个值testconsole.log('test') 。 第二个值undefinedconsole.log()函数返回的值。

命令完成后,将显示REPL提示符,这意味着我们可以在此处输入新命令。

using使用Tab键完成命令


REPL是一个交互式环境。 如果在编写代码时按键盘上的Tab键,REPL将尝试通过选择(例如)已声明的变量的合适名称或标准对象的名称来自动完成输入。

JavaScript探索JavaScript对象


在命令行中输入一些标准JavaScript对象的名称,例如Number ,在其后添加一个点,然后按Tab

REPL将列出开发人员可以与之交互的对象的属性和方法:


检查数字对象

global探索全局对象


要找出可以使用的全局Node.js对象,请在terminal中输入global.命令global. 然后按Tab


全球对象研究

▍特殊变量_


变量_ (下划线)存储上一次执行的操作的结果。 此变量可以用作输入到控制台的命令的一部分。

with以句点开头的命令


在REPL模式下,可以使用一些以句点开头的特殊命令。 它们是:

  • .help命令显示以.help命令的参考信息。
  • .editor命令.editor系统置于编辑器模式,这使输入多行JavaScript代码变得容易。 进入此模式后,输入所需的所有内容,使用Ctrl+D命令运行代码Ctrl+D
  • .break命令允许.break中止多行表达式输入。 它的用法类似于键盘快捷键Ctrl+C的用法Ctrl+C
  • .clear命令清除REPL上下文,并中断多行表达式的输入。
  • .load命令将代码从JavaScript文件加载到当前会话中。
  • .save命令会将在REPL会话期间输入的所有内容保存到文件中。
  • .exit命令允许.exit退出REPL会话;它的行为就像Ctrl+C组合键的两个连续击键一样。

应该注意的是,即使不使用.editor ,REPL也会识别多行表达式的输入。

例如,我们开始输入迭代器代码:

 [1, 2, 3].forEach(num => { 

如果在输入花括号后,按Enter键,则REPL将转到新行,提示中的内容将类似于三个点。 这表明我们可以输入相应块的代码。 看起来像这样:

 ... console.log(num) ... }) 

Enter最后一个括号后按Enter将执行表达式。 如果在此模式下输入.break ,则输入将被中止,并且表达式将不被执行。

REPL模式是Node.js的有用功能,但其范围仅限于小型实验。 除了对执行几个命令的能力之外,我们对其他事情还感兴趣。 因此,我们继续以普通模式使用Node.js。 即,让我们谈谈Node.js脚本如何接受命令行参数。

在Node.js脚本中使用命令行参数


运行Node.js脚本时,可以将参数传递给它们。 这是一个常规的脚本调用:

 node app.js 

传递给脚本的参数可以是独立值或键值构造。 在第一种情况下,运行脚本如下所示:

 node app.js flavio 

在第二个-像这样:

 node app.js name=flavio 

传递参数的方法用于确定如何在脚本代码中使用它们。

因此,为了访问命令行参数,使用了标准的Node.js process对象。 它具有argv属性,该属性是一个数组,其中包含启动时传递给脚本的参数。

argv数组的第一个元素包含在命令行上输入node命令时执行的文件的完整路径。

第二个元素是脚本可执行文件的路径。

从第三个数组开始,数组的所有其他元素都包含运行时传递给脚本的内容。

可以使用forEach循环来组织argv可用的参数的枚举(这包括node的路径和脚本的可执行文件的路径):

 process.argv.forEach((val, index) => { console.log(`${index}: ${val}`) }) 

如果您对前两个参数不感兴趣,则可以基于argv创建一个新数组,该数组将包含argv除前两个元素以外的所有内容:

 const args = process.argv.slice(2) 

假设在运行脚本时,仅一个参数以独立值的形式传递给它:

 node app.js flavio 

您可以像这样访问此参数:

 const args = process.argv.slice(2) args[0] 

现在,让我们尝试使用键值类型构造:

 node app.js name=flavio 

通过这种方法,在形成args数组之后,字符串name=flavioargs[0] 。 在使用参数之前,必须先解析此字符串。 最方便的方法是使用minimist库,该库旨在简化命令行参数的使用:

 const args = require('minimist')(process.argv.slice(2)) args['name'] //flavio 

现在考虑输出到控制台。

使用控制台模块将数据输出到控制台


标准的Node.js 控制台模块为开发人员提供了很多在程序执行过程中与命令行进行交互的机会。 通常,这与基于浏览器的JavaScript中使用的console对象相同。 console模块最简单,使用最广泛的方法可能是console.log() ,它用于将字符串数据输出到控制台。 此外,如果将对象传递给它,则该对象在输出之前将转换为它的字符串表示形式。

console.log()方法可以传递几个值:

 const x = 'x' const y = 'y' console.log(x, y) 

执行此指令序列后, x值和y值都将到达控制台。

要形成复杂的字符串, console.log()命令支持使用通配符,通配​​符在输出数据时会按优先级顺序用其对应的值替换。

例如,这是一个显示文本My cat has 2 years

 console.log('My %s has %d years', 'cat', 2) 

请考虑通配符的功能:

  • %s将值格式化为字符串。
  • %d%i将值格式化为整数。
  • %f将值格式化为浮点数。
  • %O用于显示对象的字符串表示形式。

这是使用通配符的另一个示例:

 console.log('%O', Number) 

▍清洁控制台


要清除控制台,请使用console.clear()命令(其在不同终端中的行为可能有所不同)。

▍计数元素


现在我们来看一下有用的console.count()方法。 看一下这段代码:

 const x = 1 const y = 2 const z = 3 console.count( 'The value of x is ' + x + ' and has been checked .. how many times?' ) console.count( 'The value of x is ' + x + ' and has been checked .. how many times?' ) console.count( 'The value of y is ' + y + ' and has been checked .. how many times?' ) 

count()方法对行输出的数量进行计数,并在其旁边显示结果。
在以下示例中,使用此方法,您可以计算苹果和橙子:

 const oranges = ['orange', 'orange'] const apples = ['just one apple'] oranges.forEach(fruit => { console.count(fruit) }) apples.forEach(fruit => { console.count(fruit) }) 

stack将堆栈跟踪结果显示到控制台


有时将功能堆栈的痕迹打印到控制台很有用。 例如,为了回答我们如何到达程序中的某个位置的问题。 您可以使用以下命令执行此操作:

 console.trace() 

这是一个用法示例:

 const function2 = () => console.trace() const function1 = () => function2() function1() 

这是我在REPL模式下运行此代码时发生的情况:

 Trace   at function2 (repl:1:33)   at function1 (repl:1:25)   at repl:1:1   at ContextifyScript.Script.runInThisContext (vm.js:44:33)   at REPLServer.defaultEval (repl.js:239:29)   at bound (domain.js:301:14)   at REPLServer.runBound [as eval] (domain.js:314:12)   at REPLServer.onLine (repl.js:440:10)   at emitOne (events.js:120:20)   at REPLServer.emit (events.js:210:7) 

▍衡量完成一项动作所花费的时间


您可以使用console.time()console.timeEnd()方法来衡量执行某个函数所需的时间。 看起来像这样:

 const doSomething = () => console.log('test') const measureDoingSomething = () => { console.time('doSomething()') //    ,     doSomething() console.timeEnd('doSomething()') } measureDoingSomething() 

with使用stdout和stderr


如我们所见, console.log()命令非常适合将消息输出到控制台。 使用它时,将使用所谓的标准输出流或stdout

console.error()命令将数据转储到标准错误流stderr 。 发送到stderr数据将到达控制台,尽管例如,输出到此流的内容可以重定向到错误日志文件。

color将数据输出到控制台时使用颜色


为了使控制台中显示的文本着色,可以使用标识颜色的转义序列:

 console.log('\x1b[33m%s\x1b[0m', 'hi!') 

例如,如果在REPL模式下执行此命令,则文本hi将以黄色显示。
但是,这种方法不是特别方便。 使用专门的库(例如粉笔)在控制台中显示彩色文本会很方便。 该库除了可以对文本进行颜色格式化外,还支持其他样式样式。 例如,在其帮助下,可以将文本设置为粗体,斜体或带下划线的字体。

要从npm安装它,请使用以下命令:

 npm install chalk 

您可以像这样使用它:

 const chalk = require('chalk') console.log(chalk.yellow('hi!')) 

使用chalk.yellow()

要了解有关粉笔的更多信息,请查看GitHub上的此库页面

▍创建进度条


进度栏在不同情况下可能很有用。 您可以使用进度包来创建在控制台中运行的进度指示器。 您可以这样安装:

 npm install progress 

下面是一个代码示例,其中创建了一个指示符,该指示符可用于显示有关由10个步骤组成的任务的信息。 在我们的情况下,完成每个步骤需要100毫秒。 指示器满后,将clearItnerval()命令,程序结束。

 const ProgressBar = require('progress') const bar = new ProgressBar(':bar', { total: 10 }) const timer = setInterval(() => { bar.tick() if (bar.complete) {   clearInterval(timer) } }, 100) 

from从命令行接收用户输入


如何使为Node.js平台编写的命令行应用程序具有交互性? 从版本7开始,Node.js包含一个readline模块,该模块允许您从可读取的流(例如从process.stdin接收数据。 在Node.js程序执行期间,该线程就是在终端中输入的线程。 一次输入一行数据。

考虑以下代码片段:

 const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout }) readline.question(`What's your name?`, (name) => { console.log(`Hi ${name}!`) readline.close() }) 

在这里,我们询问用户他的名字,然后输入文本并按键盘上的Enter键,然后显示问候语。

question()方法将传递给它的内容作为第一个参数(即,向用户询问的问题)显示出来,并等待输入完成。 按下Enter它将调用第二个参数中传递给它的回调并处理输入的内容。 在同一回调中,我们关闭readline接口。

readline , , .

, , , , , , — * .

, readline-sync , , readline , .

, . inquirer . :

 npm install inquirer 

:

 const inquirer = require('inquirer') var questions = [{ type: 'input', name: 'name', message: "What's your name?", }] inquirer.prompt(questions).then(answers => { console.log(`Hi ${answers['name']}!`) }) 

inquirer . , .

Node.js. readline , readline-sync inquirer. , , .

Node.js, exports


, API module.exports , . Node.js , . , require , :

 const library = require('./library') 

library.js , , , .

, , - , . , , . , API module.exports , .

.

module.exports , , . :

 const car = { brand: 'Ford', model: 'Fiesta' } module.exports = car //..   const car = require('./car') 

, exports . , , — :

 const car = { brand: 'Ford', model: 'Fiesta' } exports.car = car 

:

 exports.car = { brand: 'Ford', model: 'Fiesta' } 

, , :

 const items = require('./items') items.car 

:

 const car = require('./items').car 

module.exports exports ?

, module.exports . .


Node.js-, REPL, , Node.js. npm, , , package.json package-lock.json .

亲爱的读者们! Node.js-?

Source: https://habr.com/ru/post/zh-CN423701/


All Articles