REPL в Node.js: улучшаем быт разработчик

23
Frontend Meetup with by REPL в Node.js: улучшаем быт разработчика Ваня Пухтин vk.com/it_61

Transcript of REPL в Node.js: улучшаем быт разработчик

Frontend Meetup

with ❤ by

REPL в Node.js: улучшаем быт разработчика

Ваня Пухтин

vk.com/it_61

2

Что такое REPL

REPL — это штука, которая позволяет запускать код покомандно и мгновенно видеть результат его выполнения.

Инструменты разработчика в браузерах:● Chrome DevTools● Firefox DevTools● FireBug

Командные строки многих ЯП:● Python● PHP (php -a)● Node.js● Clojure (lein repl)● Ruby (irb)

…и десятки других.

3

Chrome Developer Tools Console

4

читаем:Read

выводим:Print

promptReadEvalPrintLoop

выполняем:Eval

…и всё это повторяем:Loop

Chrome Developer Tools Console // explained

5

Вот что делает REPL:

while (noExit()){

print(eval(read()))}

Если у языка нет REPL, то его, как правило,можно реализовать самостоятельно.

(и это довольно просто)

6

Почему это так важно?

s/Perl/любой язык

xkcd #519

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

That's all, folks!

Frontend Meetup