REPL¶
Стабильность: 2 – Стабильная
АПИ является удовлетворительным. Совместимость с NPM имеет высший приоритет и не будет нарушена кроме случаев явной необходимости.
Модуль node:repl
предоставляет реализацию Read-Eval-Print-Loop (REPL), которая доступна как отдельная программа или может быть включена в другие приложения. Доступ к нему можно получить, используя:
1 |
|
Дизайн и особенности¶
Модуль node:repl
экспортирует класс repl.REPLServer
. Во время работы экземпляры repl.REPLServer
будут принимать отдельные строки пользовательского ввода, оценивать их в соответствии с заданной пользователем функцией оценки, а затем выводить результат. Вход и выход могут быть из stdin
и stdout
, соответственно, или могут быть подключены к любому Node.js stream.
Экземпляры repl.REPLServer
поддерживают автоматическое завершение ввода, предварительный просмотр завершения, упрощенное редактирование строк в стиле Emacs, многострочный ввод, ZSH-подобный reverse-i-search, ZSH-подобный substring-based history search, вывод в стиле ANSI, сохранение и восстановление текущего состояния сессии REPL, восстановление ошибок и настраиваемые функции оценки. Терминалы, не поддерживающие стили ANSI и редактирование строк в стиле Emacs, автоматически возвращаются к ограниченному набору функций.
Команды и специальные клавиши¶
Следующие специальные команды поддерживаются всеми экземплярами REPL:
.break
: В процессе ввода многострочного выражения введите команду.break
(или нажмите Ctrl+C), чтобы прервать дальнейший ввод или обработку этого выражения..clear
: Сбрасывает REPLcontext
на пустой объект и очищает любое вводимое многострочное выражение..exit
: Закрывает поток ввода/вывода, вызывая выход из REPL..help
: Показать список специальных команд..save
: Сохранить текущую сессию REPL в файл:> .save ./file/to/save.js
..load
: Загрузить файл в текущий сеанс REPL.> .load ./file/to/load.js
..editor
: Войти в режим редактора (Ctrl+D для завершения, Ctrl+C для отмены).
1 2 3 4 5 6 7 8 9 10 11 |
|
Следующие комбинации клавиш в REPL имеют такие специальные эффекты:
- Ctrl+C: При однократном нажатии имеет тот же эффект, что и команда
.break
. При двойном нажатии на пустой строке имеет тот же эффект, что и команда.exit
. - Ctrl+D: имеет тот же эффект, что и команда
.exit
. - Tab: При нажатии на пустой строке отображает глобальные и локальные (область видимости) переменные. При нажатии во время ввода других данных отображает соответствующие опции автозавершения.
Связки клавиш, связанные с обратным поиском, см. в reverse-i-search
. Обо всех остальных привязках клавиш см. в TTY keybindings.
Оценка по умолчанию¶
По умолчанию все экземпляры repl.REPLServer
используют функцию оценки, которая оценивает выражения JavaScript и предоставляет доступ к встроенным модулям Node.js. Это поведение по умолчанию можно отменить, передав альтернативную функцию оценки при создании экземпляра repl.REPLServer
.
Выражения JavaScript¶
Оценщик по умолчанию поддерживает прямую оценку выражений JavaScript:
1 2 3 4 5 6 |
|
Если в блоках или функциях нет другой области видимости, переменные, объявленные неявно или с помощью ключевых слов const
, let
или var
, объявляются в глобальной области видимости.
Глобальная и локальная область видимости¶
Оценщик по умолчанию предоставляет доступ к любым переменным, существующим в глобальной области видимости. Можно явно объявить переменную в REPL, присвоив ее объекту context
, связанному с каждым REPLServer
:
1 2 3 4 |
|
Свойства в объекте context
отображаются как локальные в REPL:
1 2 3 |
|
Контекстные свойства по умолчанию не предназначены только для чтения. Чтобы указать глобальные объекты, доступные только для чтения, свойства контекста должны быть определены с помощью Object.defineProperty()
:
1 2 3 4 5 6 7 8 9 |
|
Доступ к основным модулям Node.js¶
Оценщик по умолчанию будет автоматически загружать основные модули Node.js в среду REPL при использовании. Например, если иное не объявлено как глобальная или скопированная переменная, входной fs
будет оцениваться по требованию как global.fs = require('node:fs')
.
1 |
|
Глобальные не пойманные исключения¶
В REPL используется модуль domain
для перехвата всех неперехваченных исключений для этой сессии REPL.
Использование модуля domain
в REPL имеет следующие побочные эффекты:
-
Не пойманные исключения вызывают событие
'uncaughtException'
только в автономном REPL. Добавление слушателя этого события в REPL в другой программе Node.js приводит кERR_INVALID_REPL_INPUT
.1 2 3 4 5 6 7 8 9 10
const r = repl.start(); r.write( 'process.on("uncaughtException", () => console.log("Foobar"));\n' ); // Выходной поток включает: // TypeError [ERR_INVALID_REPL_INPUT]: Слушатели для `uncaughtException` // не могут быть использованы в REPL r.close();
-
Попытка использовать
process.setUncaughtExceptionCaptureCallback()
бросает ошибкуERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE
.
Присвоение переменной _
(подчеркивание).¶
Оценщик по умолчанию присваивает результат последнего вычисленного выражения специальной переменной _
(подчеркивание). Явная установка _
в значение отключает это поведение.
1 2 3 4 5 6 7 8 9 10 11 |
|
Аналогично, _error
будет ссылаться на последнюю замеченную ошибку, если таковая имела место. Явная установка _error
в значение отключит это поведение.
1 2 3 4 |
|
Ключевое слово await
¶
Поддержка ключевого слова await
включена на верхнем уровне.
1 2 3 4 5 6 7 8 9 10 |
|
Одно известное ограничение использования ключевого слова await
в REPL заключается в том, что оно делает недействительным лексическое описание ключевых слов const
и let
.
Например:
1 2 3 4 5 6 7 8 |
|
--no-experimental-repl-await
должен отключить ожидание на верхнем уровне в REPL.
Reverse-i-search¶
REPL поддерживает двунаправленный обратный поиск, подобный ZSH. Он запускается с помощью Ctrl+R для поиска назад и Ctrl+S для поиска вперед.
Дублирующиеся записи истории будут пропущены.
Записи будут приняты, как только будет нажата любая клавиша, не соответствующая обратному поиску. Отмена возможна при нажатии Esc или Ctrl+C.
При изменении направления поиск следующей записи осуществляется в ожидаемом направлении, начиная с текущей позиции.
Пользовательские функции оценки¶
Когда создается новый repl.REPLServer
, может быть предоставлена пользовательская функция оценки. Это может быть использовано, например, для реализации полностью специализированных приложений REPL.
Ниже показан гипотетический пример REPL, выполняющего перевод текста с одного языка на другой:
1 2 3 4 5 6 7 8 9 10 |
|
Восстанавливаемые ошибки¶
В подсказке REPL нажатие Enter отправляет текущую строку ввода в функцию eval
. Для поддержки многострочного ввода функция eval
может возвращать экземпляр repl.Recoverable
в предоставленную функцию обратного вызова:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Настройка вывода REPL¶
По умолчанию экземпляры repl.REPLServer
форматируют вывод с помощью метода util.inspect()
перед записью вывода в предоставленный поток Writable
(по умолчанию process.stdout
). Опция проверки showProxy
по умолчанию установлена в true, а опция colors
устанавливается в true в зависимости от опции REPL useColors
.
Булева опция useColors
может быть указана при построении, чтобы указать писателю по умолчанию использовать коды стиля ANSI для окраски вывода метода util.inspect()
.
Если REPL запускается как автономная программа, можно также изменить параметры REPL inspection defaults внутри REPL с помощью свойства inspect.replDefaults
, которое отражает defaultOptions
из util.inspect()
.
1 2 3 4 5 6 7 |
|
Для полной настройки вывода экземпляра repl.REPLServer
передайте новую функцию для опции writer
при построении. Следующий пример, например, просто преобразует любой входной текст в верхний регистр:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Класс: REPLServer
¶
options
{Object|string} См.repl.start()
- Расширяет: {readline.Interface}
Экземпляры repl.REPLServer
создаются с помощью метода repl.start()
или непосредственно с помощью ключевого слова JavaScript new
.
1 2 3 4 5 6 |
|
Событие: 'exit'
¶
Событие 'exit'
генерируется, когда REPL завершается либо при получении команды .exit
на вход, либо при нажатии пользователем Ctrl+C дважды для сигнала SIGINT
, либо при нажатии Ctrl+D для сигнала 'end'
на входном потоке. Обратный вызов слушателя вызывается без аргументов.
1 2 3 4 |
|
Событие: reset
¶
Событие reset
возникает, когда контекст REPL сбрасывается. Это происходит всякий раз, когда команда .clear
поступает на вход, если REPL не использует оценщик по умолчанию и экземплярrepl.REPLServer
был создан с опциейuseGlobal
, установленной в true
. Обратный вызов слушателя будет вызван со ссылкой на объект context
в качестве единственного аргумента.
Это можно использовать в основном для повторной инициализации контекста REPL в некоторое заранее определенное состояние:
1 2 3 4 5 6 7 8 9 10 |
|
Когда этот код выполняется, глобальная переменная 'm'
может быть изменена, но затем возвращена к исходному значению с помощью команды .clear
:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
replServer.defineCommand(keyword, cmd)
¶
ключевое слово
<string>
Ключевое слово команды (без ведущего символа.
).cmd
{Object|Function} Функция, вызываемая при обработке команды.
Метод replServer.defineCommand()
используется для добавления новых команд с префиксом .
в экземпляр REPL. Такие команды вызываются путем ввода символа .
, за которым следует ключевое слово
. Команда cmd
является либо функцией
, либо объектом
со следующими свойствами:
help
<string>
Текст справки, который будет отображаться при вводе.help
(необязательно).action
<Function>
Функция для выполнения, по желанию принимающая один строковый аргумент.
В следующем примере показаны две новые команды, добавленные в экземпляр REPL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Затем новые команды можно использовать из экземпляра REPL:
1 2 3 4 |
|
replServer.displayPrompt([preserveCursor])
¶
preserveCursor
<boolean>
Метод replServer.displayPrompt()
готовит экземпляр REPL к вводу данных пользователем, печатая настроенный prompt
на новой строке в output
и возобновляя input
для приема нового ввода.
Если вводится многострочный ввод, вместо "подсказки" печатается многоточие.
Когда preserveCursor
имеет значение true
, размещение курсора не будет сброшено на 0
.
Метод replServer.displayPrompt
предназначен в основном для вызова из функции действия для команд, зарегистрированных с помощью метода replServer.defineCommand()
.
replServer.clearBufferedCommand()
.¶
Метод replServer.clearBufferedCommand()
очищает любую команду, которая была забуферизирована, но еще не выполнена. Этот метод предназначен для вызова из функции действия для команд, зарегистрированных с помощью метода replServer.defineCommand()
.
replServer.parseREPLKeyword(keyword[, rest])
.¶
Стабильность: 0 – устарело или набрало много негативных отзывов
Утратил актуальность.
ключевое слово
<string>
потенциальное ключевое слово для разбора и выполненияrest
<any>
любые параметры команды ключевого слова.- Возвращает:
<boolean>
Внутренний метод, используемый для разбора и выполнения ключевых слов REPLServer
. Возвращает true
, если keyword
является правильным ключевым словом, иначе false
.
replServer.setupHistory(historyPath, callback)
.¶
historyPath
<string>
путь к файлу историиcallback
<Function>
вызывается, когда запись истории готова или при ошибкеerr
<Error>
repl
{repl.REPLServer}
Инициализирует файл журнала истории для экземпляра REPL. При выполнении бинарного файла Node.js и использовании командной строки REPL файл истории инициализируется по умолчанию. Однако при создании REPL программным способом это не так. Используйте этот метод для инициализации файла журнала истории при программной работе с экземплярами REPL.
repl.builtinModules
¶
Список имен всех модулей Node.js, например, 'http'
.
repl.start([options])
¶
options
{Object|string}prompt
<string>
Вводная подсказка для отображения. По умолчанию:'>
(с пробелом).input
<stream.Readable>
ПотокReadable
, из которого будет считываться ввод REPL. По умолчанию:process.stdin
.output
<stream.Writable>
ПотокWritable
, в который будет записываться вывод REPL. По умолчанию:process.stdout
.terminal
<boolean>
Еслиtrue
, указывает, чтовывод
должен рассматриваться как TTY-терминал. По умолчанию: проверка значения свойстваisTTY
для потокаoutput
при инстанцировании.eval
<Function>
Функция, которая будет использоваться при оценке каждой заданной строки ввода. По умолчанию: асинхронная обертка для функции JavaScripteval()
. Функцияeval
может ошибаться сrepl.Recoverable
, чтобы указать, что ввод был неполным, и запросить дополнительные строки.useColors
<boolean>
Еслиtrue
, указывает, что функция по умолчаниюwriter
должна включать в REPL стилизацию цветов ANSI.
1 2 3 4 5 6 7 8 9 |
|
- Возвращает: {repl.REPLServer}
Метод repl.start()
создает и запускает экземпляр repl.REPLServer
.
Если options
- строка, то она задает приглашение к вводу:
1 2 3 4 |
|
Node.js REPL¶
Сам Node.js использует модуль node:repl
для предоставления своего собственного интерактивного интерфейса для выполнения JavaScript. Его можно использовать, выполнив двоичный файл Node.js без передачи каких-либо аргументов (или передав аргумент -i
):
1 2 3 4 5 6 7 8 9 10 11 |
|
Параметры переменных окружения¶
Различные поведения Node.js REPL могут быть настроены с помощью следующих переменных окружения:
NODE_REPL_HISTORY
: Когда указан правильный путь, постоянная история REPL будет сохраняться в указанном файле, а не в.node_repl_history
в домашнем каталоге пользователя. Установка этого значения в''
'' (пустая строка) отключает постоянную историю REPL. Пробелы будут обрезаны из значения. На платформах Windows переменные окружения с пустыми значениями недействительны, поэтому установите в этой переменной один или несколько пробелов, чтобы отключить постоянную историю REPL.NODE_REPL_HISTORY_SIZE
: Определяет, сколько строк истории будет сохранено, если история доступна. Должно быть положительным числом. По умолчанию:1000
.NODE_REPL_MODE
: Может быть либо'sloppy'
, либо'strict'
. По умолчанию:'sloppy'
, что позволит выполнять код в нестрогом режиме.
Постоянная история¶
По умолчанию Node.js REPL будет сохранять историю между сессиями node
REPL, сохраняя вводимые данные в файл .node_repl_history
, расположенный в домашнем каталоге пользователя. Это можно отключить, установив переменную окружения NODE_REPL_HISTORY=''
.
Использование Node.js REPL с продвинутыми линейными редакторами¶
Для продвинутых линейных редакторов запустите Node.js с переменной окружения NODE_NO_READLINE=1
. Это запустит основной и отладочный REPL в канонических настройках терминала, что позволит использовать rlwrap
.
Например, в файл .bashrc
можно добавить следующее:
1 |
|
Запуск нескольких экземпляров REPL на одном работающем экземпляре¶
Можно создать и запустить несколько экземпляров REPL на одном запущенном экземпляре Node.js, которые используют один объект global
, но имеют отдельные интерфейсы ввода-вывода.
Например, следующий пример предоставляет отдельные REPL на stdin
, сокете Unix и сокете TCP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
Запуск этого приложения из командной строки запустит REPL на stdin. Другие клиенты REPL могут подключаться через сокет Unix или сокет TCP. Например, telnet
полезен для подключения к сокетам TCP, а socat
можно использовать для подключения как к сокетам Unix, так и к сокетам TCP.
Запуская REPL с сервера на основе сокетов Unix вместо stdin, можно подключиться к давно запущенному процессу Node.js, не перезапуская его.
Пример запуска "полнофункционального" (терминального
) REPL над экземпляром net.Server
и net.Socket
, см: https://gist.github.com/TooTallNate/2209310.
Пример запуска экземпляра REPL над curl(1)
, см: https://gist.github.com/TooTallNate/2053342.