Spec-Zone.ru › Node.js 4 LTS

REPL

Устойчивость: 2 — Стабильно

Цикл «чтение—вычисление—печать—цикл» (REPL) доступен как отдельная программа и легко включается в другие программы. REPL предоставляет способ интерактивного выполнения JavaScript и просмотра результатов. Его можно использовать для отладки, тестирования или просто для экспериментов.

Выполнение node без каких-либо аргументов из командной строки переведет вас в REPL. Он имеет простую редактирование строк в стиле emacs.

$ node
Type '.help' for options.
> a = [1, 2, 3];
[ 1, 2, 3 ]
> a.forEach((v) => {
...   console.log(v);
...   });
1
2
3

Для расширенных редакторов строк запустите Node.js с переменной среды NODE_NO_READLINE=1. Это запустит основной и отладочный REPL в стандартных терминальных настройках, которые позволят вам использовать rlwrap.

Например, вы можете добавить это в свой файл bashrc:

alias node="env NODE_NO_READLINE=1 rlwrap node"

Параметры переменных среды

Встроенный repl (вызываемый запуском node или node -i) может управляться с помощью следующих переменных среды:

  • NODE_REPL_HISTORY — При указании допустимого пути, постоянная история REPL будет сохранена в указанном файле, а не в .node_repl_history в домашнем каталоге пользователя. Установка этого значения в "" отключит постоянную историю REPL. Пробелы будут удалены из значения.
  • NODE_REPL_HISTORY_SIZE — По умолчанию 1000. Управляет тем, сколько строк истории будет сохранено, если история доступна. Должно быть положительным числом.
  • NODE_REPL_MODE — Может быть любым из sloppy, strict, или magic. По умолчанию magic, что автоматически выполнит операторы «только строгий режим» в строгом режиме.

Постоянная история

По умолчанию REPL сохранит историю между сессиями REPL, сохраняя ее в .node_repl_history файле в домашнем каталоге пользователя. Это можно отключить, установив переменную среды NODE_REPL_HISTORY="".

NODE_REPL_HISTORY_FILE

Устойчивость: 0 — Устаревший: Используйте NODE_REPL_HISTORY вместо этого.

Ранее в Node.js/io.js v2.x история REPL управлялась с помощью переменной среды NODE_REPL_HISTORY_FILE, а история сохранялась в формате JSON. Эта переменная теперь устарела, и ваша история REPL будет автоматически преобразована в использование простого текста. Новый файл будет сохранен либо в домашнем каталоге, либо в каталоге, определенном переменной NODE_REPL_HISTORY, как описано здесь.

Функции REPL

Внутри REPL сочетание клавиш Ctrl+D завершит работу. Можно вводить многострочные выражения. Поддерживается автодополнение ввода как для глобальных, так и для локальных переменных.

Ядра модулей будут загружаться по требованию в среду. Например, обращение к fs приведет к require() модулю fs как global.fs.

Специальная переменная _ (нижнее подчеркивание) содержит результат последнего выражения.

> [ 'a', 'b', 'c' ]
[ 'a', 'b', 'c' ]
> _.length
3
> _ += 1
4

REPL предоставляет доступ к любым переменным в глобальной области видимости. Вы можете явно предоставить переменную в REPL, присвоив ее объекту context, связанному с каждым REPLServer. Например:

// repl_test.js
const repl = require('repl');
var msg = 'message';

repl.start('> ').context.m = msg;

Элементы в объекте context отображаются как локальные в REPL:

$ node repl_test.js
> m
'message'

Существует несколько специальных команд REPL:

  • .break — При вводе многострочного выражения иногда вы запутались или просто не заботитесь о его завершении. .break перезапустит процесс.
  • .clear — Сбрасывает объект context до пустого объекта и очищает любое многострочное выражение.
  • .exit — Закрыть поток ввода-вывода, что приведет к выходу из REPL.
  • .help — Отобразить этот список специальных команд.
  • .save — Сохранить текущую сессию REPL в файл .save ./file/to/save.js
  • .load — Загрузить файл в текущую сессию REPL. .load ./file/to/load.js

Следующие сочетания клавиш в REPL имеют следующие специальные эффекты:

  • <ctrl>C — Аналогично ключевому слову .break. Прерывает выполнение текущей команды. Дважды нажмите на пустую строку, чтобы принудительно выйти.
  • <ctrl>D — Аналогично ключевому слову .exit.
  • <tab> — Отобразить как глобальные, так и локальные (область видимости) переменные

Настройка отображения объектов в REPL

Модуль REPL внутренне использует util.inspect() при печати значений. Однако util.inspect делегирует вызов функции inspect() объекта, если она есть. Вы можете узнать больше об этой делегации здесь.

Например, если вы определили функцию inspect() для объекта, как показано ниже:

> var obj = {foo: 'this will not show up in the inspect() output'};
undefined
> obj.inspect = () => {
...   return {bar: 'baz'};
... };
[Function]

и попробуете напечатать obj в REPL, она вызовет пользовательскую функцию inspect():

> obj
{bar: 'baz'}

Класс: REPLServer

Добавлен в: v0.1.91

Наследуется от Интерфейса чтения строк с следующими событиями:

Событие: 'exit'

Добавлен в: v0.7.7

function () {}

Выдается, когда пользователь выходит из REPL любым из определенных способов. А именно, ввод .exit в repl, двойное нажатие клавиш Ctrl+C для сигнализации SIGINT, или нажатие Ctrl+D для сигнализации 'end' по потоку input.

Пример прослушивания exit:

replServer.on('exit', () => {
  console.log('Got "exit" event from repl!');
  process.exit();
});

Событие: 'reset'

Добавлен в: v0.11.0

function (context) {}

Выдается, когда контекст REPL сброшен. Это происходит при вводе .clear. Если вы запускаете repl с { useGlobal: true }, это событие никогда не будет выдано.

Пример прослушивания reset:

// Extend the initial repl context.
var replServer = repl.start({ options ... });
someExtension.extend(r.context);

// When a new context is created extend it as well.
replServer.on('reset', (context) => {
  console.log('repl has a new context');
  someExtension.extend(context);
});

replServer.defineCommand(keyword, cmd)

Добавлен в: v0.3.0
  • keyword <Строка>
  • cmd <Объект> | <Функция>

Делает команду доступной в REPL. Команда вызывается вводом . за которым следует ключевое слово. cmd — это объект со следующими значениями:

  • help — текстовая справка, которая отображается при вводе .help (необязательно).
  • action — функция для выполнения, потенциально принимающая строковый аргумент, при вызове команды, привязанной к экземпляру REPLServer (обязательно).

Если для cmd предоставлена функция вместо объекта, она обрабатывается как action.

Пример определения команды:

// repl_test.js
const repl = require('repl');

var replServer = repl.start();
replServer.defineCommand('sayhello', {
  help: 'Say hello',
  action: function(name) {
    this.write(`Hello, ${name}!\n`);
    this.displayPrompt();
  }
});

Пример вызова этой команды из REPL:

> .sayhello Node.js User
Hello, Node.js User!

replServer.displayPrompt([preserveCursor])

Добавлен в: v0.1.91
  • preserveCursor <Булево значение>

Как readline.prompt, но также добавляет отступы с многоточием, когда находится внутри блоков. Аргумент preserveCursor передается в readline.prompt. Это используется в основном с defineCommand . Также используется внутренне для рендеринга каждой строки приглашения.

repl.start(options)

Возвращает и запускает экземпляр REPLServer, который наследуется от Интерфейса чтения строк. Принимает объект «options», который принимает следующие значения:

  • prompt — приглашение и stream для всех операций ввода-вывода. По умолчанию >.

  • input — поток для чтения, за которым нужно следить. По умолчанию process.stdin.

  • output — поток для записи данных readline. По умолчанию process.stdout.

  • terminal — передайте true если stream должен обрабатываться как терминал TTY и к нему должны передаваться коды ANSI/VT100. По умолчанию проверяется isTTY в потоке output при создании экземпляра.

  • eval — функция, которая будет использоваться для вычисления каждой вводимой строки. По умолчанию асинхронная оболочка для eval(). См. пример пользовательской функции eval ниже.

  • useColors — булево значение, определяющее, должен ли вывод функции writer отображать цвета. Если установлена другая функция writer , это не имеет значения. По умолчанию значение terminal repl.

  • useGlobal — если установлено в true, repl будет использовать объект global, а не выполнять скрипты в отдельном контексте. По умолчанию false.

  • ignoreUndefined — если установлено в true, repl не будет выводить результат команды, если он undefined. По умолчанию false.

  • writer — функция, которая вызывается для каждой обрабатываемой команды и возвращает форматирование (включая цветовое выделение) для отображения. По умолчанию util.inspect.

  • replMode — управляет тем, выполняются ли все команды repl в строгом режиме, в обычном режиме или в смешанном режиме (режиме «магии»). Допустимые значения:

    • repl.REPL_MODE_SLOPPY — выполнение команд в нестрогом режиме.
    • repl.REPL_MODE_STRICT — выполнение команд в строгом режиме. Это эквивалентно предложению каждой инструкции repl со 'use strict'.
    • repl.REPL_MODE_MAGIC — попытка выполнения команд в обычном режиме. Если они не распознаются, повторите попытку в строгом режиме.

Вы можете использовать собственную функцию eval , если она имеет следующий вид:

function eval(cmd, context, filename, callback) {
  callback(null, result);
}

При автодополнении eval будет вызываться со строкой ввода .scope в качестве входных данных. Ожидается, что она вернет массив имен областей видимости, используемых для автодополнения.

Несколько REPL могут быть запущены на одной работающей инстанции Node.js. Все они будут использовать один и тот же глобальный объект, но будут иметь уникальные вводы/выводы.

Вот пример запуска REPL на stdin, Unix-сокете и TCP-сокете:

const net = require('net');
const repl = require('repl');
var connections = 0;

repl.start({
  prompt: 'Node.js via stdin> ',
  input: process.stdin,
  output: process.stdout
});

net.createServer((socket) => {
  connections += 1;
  repl.start({
    prompt: 'Node.js via Unix socket> ',
    input: socket,
    output: socket
  }).on('exit', () => {
    socket.end();
  })
}).listen('/tmp/node-repl-sock');

net.createServer((socket) => {
  connections += 1;
  repl.start({
    prompt: 'Node.js via TCP socket> ',
    input: socket,
    output: socket
  }).on('exit', () => {
    socket.end();
  });
}).listen(5001);

Запуск этой программы из командной строки запустит REPL на stdin. Другие клиенты REPL могут подключиться через Unix-сокет или TCP-сокет. telnet полезно для подключения к TCP-сокетам, а socat можно использовать для подключения к Unix- и TCP-сокетам.

Запустив REPL из сервера на основе Unix-сокетa вместо stdin, вы можете подключиться к долго работающему процессу Node.js без его перезапуска.

Для примера запуска «полнофункционального» (terminal) REPL через net.Server и net.Socket инстанцию, см.: https://gist.github.com/2209310

Для примера запуска инстанции REPL через curl(1), см.: https://gist.github.com/2053342

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v4.x/docs/api/repl.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API