Download - REPL в Node.js: улучшаем быт разработчик
2
Что такое REPL
REPL — это штука, которая позволяет запускать код покомандно и мгновенно видеть результат его выполнения.
Инструменты разработчика в браузерах:● Chrome DevTools● Firefox DevTools● FireBug
Командные строки многих ЯП:● Python● PHP (php -a)● Node.js● Clojure (lein repl)● Ruby (irb)
…и десятки других.
4
читаем:Read
выводим:Print
promptReadEvalPrintLoop
выполняем:Eval
…и всё это повторяем:Loop
Chrome Developer Tools Console // explained
5
Вот что делает REPL:
while (noExit()){
print(eval(read()))}
Если у языка нет REPL, то его, как правило,можно реализовать самостоятельно.
(и это довольно просто)
7
Почему это так важно?
В изучении чего-либо очень важна быстрая обратная связь.
Bret Victor — Inventing on Principle(https://vimeo.com/36579366)(есть субтитры http://geektimes.ru/post/183394/).
Код ↔ Результат
REPL предоставляет мгновенную обратную связь.
Очень удобен в изучении языка,в экспериментах с библиотеками,
для всяких вычислений…ну и просто по фану.
8
REPL в Node.js
Можно:1. работать с выражениями2. подгружать модули (require())3. видеть все global-ы (нодовские: process, JS-ные: setTimeout, eval, Math, …)4. неплохо форматировать вывод5. делать автокомплит!6. korovans.rob()
$ node
?9
Как что-то изучать:
неинтерактивный режим интерактивный режим (REPL)
$ node test.jsнужно что-то поправить…
$ node test.jsа вот ещё…
$ node test.js…
$ node>
скучный бойлерплейт …начинаем эксперименты…
> …
10
interactive mode?
$ python -i -c 'x = 1337'выполняем коди входим в интерактивный режим
>>> x1337…
-i When a script is passed as first argumentor the -c option is used, enter interactive modeafter executing the script or the command.
Это то что нужно!
11
В ноде должно быть что-то подобное!…
А вот и нет.
https://github.com/nodejs/node-v0.x-archive/issues/3985
12
В ноде должно быть что-то подобное…?
issue, конечно, закрыли :)
но дали пару ценных советов
require('repl').start({})
Стандартный нодовский REPL это по сути:
Эту штуку можно неплохо прокачать и добавитьв неё всё, что захочется.
13
Node.js, стандартный модуль REPL
Что можно кастомизировать:1. prompt2. потоки input/output (нодовские Stream)3. evaler (eval)4. writer (print)5. будет ли repl крутиться в global-е
https://nodejs.org/api/repl.html
Из коробки есть все фичи, как и при запуске node без параметров.
В документации есть интересный пример как можно(благодаря потокам ;)) слушать Unix-сокет и подключатьсяк repl работающей ноды.
(в Эрланг такое есть для любого сервиса: $ ./erlang_app attach)
14
repl.js: Попробуем сделать REPL поприятней
Попытка запилить флаг --interactive на произвольном кодепоначалу не удалась (тогда я ещё не знал про vm).План Б: попытаться решить частный случай этой задачи,научиться подгружать модули и затем входить в repl.
Парето доволен, 20% усилий дало 80% результата.
$ repl.js path lodash Promise=bluebird ./file.js file=./other_file.js
15
Пару слов про автокомлит
Автокомплит — дело непростое.> var object = { … }> object. <Tab> // можно> object.pr <Tab> // можно> object.doStuff(). <Tab> // нельзя> object.prop. <Tab> // «как бы» можно
Object.keys(target),Object.getOwnPropertyNames(target)
16
Пару слов про автокомлит
Автокомплит — дело непростое.> var object = { … }> object.prop. <Tab> // «как бы» можно// но лучше не надо
Object.defineProperty(object, 'prop', { get: function () { console.log('side effects!') return this._prop }})
17
Работаем с промисами
Если выводить промисы в «сыром» виде, то получается белиберда.Вместо этого нужно дождаться, когда промис разрезолвитсяи показать его внутреннее значение.
18
Улучшаем вывод
Для функций можнопоказывать их сигнатуры,вместо [Function].
Можно выводить кодфукции целиком (src).
19
Node.js, стандартный модуль vm
https://nodejs.org/api/vm.html
Позволяет запускать код в контролируемом окружении.
var sandbox = vm.createContext(target) // target global в песочнице→
vm.runInContext(code, sandbox) // code — строка с кодом на JS
Можно использовать для пользовательского скриптинга,когда источник кода ненадёжен. Позволяет контролироватьконтекст выполнения кода, чего не может старый-добрый eval().
20
Резюмируя
REPL — это круто и полезно.
Модуль repl можно использовать для создания интерактивных оболочек своих сервисов.Модуль vm позволяет запускать код в песочницес контролируемым контекстом.
repl.js это совместимый с repl модуль, который позволяет:1. подгружать модули на старте2. дожидаться ответа от промисов3. красиво форматировать4. показывать сигнатуры и сорцы функций5. … и всё то же, что и стандартный repl
21
Ссылки
● github.com/StreetStrider/repl.js● repl.it — коллекция REPLов● tonicdev.com — Node.js REPL с графиками● vimeo.com/36579366 — Inventing on Principle● github.com/StreetStrider/console-ultimate● fredkschott.com/post/2014/06/require-and-the-module-system● nodejs.org/api/repl.html — node repl● nodejs.org/api/vm.html — node vm● nodejs.org/api/modules.html — node Modules
Где мне можно написать:● vk.com/StreetStrider
Где можно меня почитать:● github.com/StreetStrider● habrahabr.ru/users/streetstrider/topics/
Что ещё я веду:● vk.com/it.depot
Frontend Meetup
22