Что такое REPL, как он устроен и какие крутые возможности в нём заложены. Поговорим о выполнении кода в REPL и о том как работает автокомплит в динамических языках. Ответим на вопрос что такое vm.runInContext, перехватим парочку промисов, сделаем вывод результатов действительно приятным и даже узнаем как подгрузить нужные модули и не подать виду. В заключение рассмотрим потрясающие возможности, которые даёт нам инфраструктура npm и как это всё можно использовать в работе.
Доклад ориентирован на тех, кому небезынтересен мир Node.js, но будет доступен также и более широкому кругу JS-разработчиков. Надеюсь, для кого-нибудь этот доклад станет очередной ступенькой в изучении любимого языка.
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
REPL в Node.js: улучшаем быт разработчик
1. Frontend Meetup
with ❤ by
REPL в Node.js: улучшаем быт разработчика
Ваня Пухтин
vk.com/it_61
2. 2
Что такое REPL
REPL — это штука, которая позволяет запускать код
покомандно и мгновенно видеть результат его выполнения.
Инструменты разработчика в браузерах:
●
Chrome DevTools
●
Firefox DevTools
●
FireBug
Командные строки многих ЯП:
●
Python
●
PHP (php -a)
●
Node.js
●
Clojure (lein repl)
●
Ruby (irb)
…и десятки других.
5. 5
Вот что делает REPL:
while (noExit())
{
print(eval(read()))
}
Если у языка нет REPL, то его, как правило,
можно реализовать самостоятельно.
(и это довольно просто)
7. 7
Почему это так важно?
В изучении чего-либо очень важна быстрая обратная связь.
Bret Victor — Inventing on Principle
(https://vimeo.com/36579366)
(есть субтитры http://geektimes.ru/post/183394/).
Код ↔ Результат
REPL предоставляет мгновенную обратную связь.
Очень удобен в изучении языка,
в экспериментах с библиотеками,
для всяких вычислений
…ну и просто по фану.
8. 8
REPL в Node.js
Можно:
1. работать с выражениями
2. подгружать модули (require())
3. видеть все global-ы (нодовские: process, JS-ные: setTimeout, eval, Math, …)
4. неплохо форматировать вывод
5. делать автокомплит!
6. korovans.rob()
$ node
9. ?
9
Как что-то изучать:
неинтерактивный режим интерактивный режим (REPL)
$ node test.js
нужно что-то поправить…
$ node test.js
а вот ещё…
$ node test.js
…
$ node
>
скучный бойлерплейт …
начинаем эксперименты…
>
…
10. 10
interactive mode?
$ python -i -c 'x = 1337'
выполняем код
и входим в интерактивный режим
>>> x
1337
…
-i When a script is passed as first argument
or the -c option is used, enter interactive mode
after executing the script or the command.
Это то что нужно!
11. 11
В ноде должно быть что-то подобное!…
А вот и нет.
https://github.com/nodejs/node-v0.x-archive/issues/3985
12. 12
В ноде должно быть что-то подобное…?
issue, конечно, закрыли :)
но дали пару ценных советов
require('repl').start({})
Стандартный нодовский REPL это по сути:
Эту штуку можно неплохо прокачать и добавить
в неё всё, что захочется.
13. 13
Node.js, стандартный модуль REPL
Что можно кастомизировать:
1. prompt
2. потоки 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. 14
repl.js: Попробуем сделать REPL поприятней
Попытка запилить флаг --interactive на произвольном коде
поначалу не удалась (тогда я ещё не знал про vm).
План Б: попытаться решить частный случай этой задачи,
научиться подгружать модули и затем входить в repl.
Парето доволен, 20% усилий дало 80% результата.
$ repl.js path lodash Promise=bluebird ./file.js file=./other_file.js
15. 15
Пару слов про автокомлит
Автокомплит — дело непростое.
> var object = { … }
> object. <Tab> // можно
> object.pr <Tab> // можно
> object.doStuff(). <Tab> // нельзя
> object.prop. <Tab> // «как бы» можно
Object.keys(target),
Object.getOwnPropertyNames(target)
16. 16
Пару слов про автокомлит
Автокомплит — дело непростое.
> var object = { … }
> object.prop. <Tab> // «как бы» можно
// но лучше не надо
Object.defineProperty(object, 'prop', {
get: function () {
console.log('side effects!')
return this._prop
}
})
17. 17
Работаем с промисами
Если выводить промисы в «сыром» виде, то получается белиберда.
Вместо этого нужно дождаться, когда промис разрезолвится
и показать его внутреннее значение.
18. 18
Улучшаем вывод
Для функций можно
показывать их сигнатуры,
вместо [Function].
Можно выводить код
фукции целиком (src).
19. 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. 20
Резюмируя
REPL— это круто и полезно.
Модуль repl можно использовать для создания
интерактивных оболочек своих сервисов.
Модуль vm позволяет запускать код в песочнице
с контролируемым контекстом.
repl.js это совместимый с repl модуль, который позволяет:
1. подгружать модули на старте
2. дожидаться ответа от промисов
3. красиво форматировать
4. показывать сигнатуры и сорцы функций
5. … и всё то же, что и стандартный repl
22. Где мне можно написать:
●
vk.com/StreetStrider
Где можно меня почитать:
●
github.com/StreetStrider
●
habrahabr.ru/users/streetstrider/topics/
Что ещё я веду:
●
vk.com/it.depot
Frontend Meetup
22