Как загрузить мой script в node.js REPL?
У меня есть script foo.js
, который содержит некоторые функции, с которыми я хочу играть в REPL.
Есть ли способ, чтобы node выполнил мой script, а затем перешел в REPL со всеми объявленными глобальными переменными, например, с помощью python -i foo.py
или ghci foo.hs
?
Ответы
Ответ 1
По-прежнему нет встроенных функций для предоставления точной функциональности, которую вы описываете. Однако вместо использования require
использовать .load
в REPL, например:
.load foo.js
Он загружает файл в строку за строкой так же, как если бы вы ввели его в REPL. В отличие от require
, это загрязняет историю REPL командами, которые вы загрузили. Однако оно имеет то преимущество, что оно повторяемо, поскольку оно не кэшируется как require
.
Что лучше для вас будет зависеть от вашего варианта использования.
Изменить: Он имеет ограниченную применимость, потому что он не работает в строгом режиме, но через три года я узнал, что если ваш script не имеет 'use strict'
, вы можете используйте eval
для загрузки script, не загрязняя историю REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
Ответ 2
Я создал replpad, так как мне надоело повторно перезагружать script.
Просто установите его через: npm install -g replpad
Затем используйте его, запустив: replpad
Если вы хотите, чтобы он просматривал все файлы в текущем и во всех подкаталогах и транслировал их в repl при их изменении: replpad .
Просмотрите видео на сайте, чтобы получить лучшее представление о том, как он работает, и узнайте о других полезных функциях, которые у него есть:
- доступ к основным модулям docs в repl с помощью функции
dox()
, которая добавляется к каждой основной функции, т.е. fs.readdir.dox()
- получить доступ к пользовательским модулям readm в repl с помощью функции
dox()
, которая добавляется к каждому модулю, установленному через npm,
т.е. marked.dox()
- функция доступа выделенный исходный код, информация о , где была определена функция (файл, linenumber) и функция
комментарии и/или jsdocs, где это возможно, через свойство
src
, которое добавляется к каждой функции, т.е. express.logger.src
- scriptie-talkie поддержка (см. команду
.talk
)
- добавляет команды и сочетания клавиш
- привязки клавиш vim
- поддержка ключевых карт
- сопоставление парсеров через плагин token token
- добавляет код, введенный в repl обратно в файл с помощью сочетания клавиш или команды
.append
Ответ 3
Я сделал Vorpal.js, который обрабатывает эту проблему, превратив ваш node add в интерактивный CLI. Он поддерживает расширение REPL, которое превращает вас в REPL в контексте вашего запущенного приложения.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
Затем вы можете запустить приложение, и оно закроется в REPL.
$ node myapp.js repl
myapp> repl:
Ответ 4
В настоящее время вы не можете сделать это напрямую, но вы можете mylib = require('./foo.js')
в REPL. Помните, что методы экспортируются, а не объявляются как глобальные.
Ответ 5
replpad
классно, но для быстрого и простого способа загрузки файла в node, импортируйте его переменные и запустите реплика, вы можете добавить следующий код в конец вашего .js файла
if (require.main === module){
(function() {
var _context = require('repl').start({prompt: '$> '}).context;
var scope = require('lexical-scope')(require('fs').readFileSync(__filename));
for (var name in scope.locals[''] )
_context[scope.locals[''][name]] = eval(scope.locals[''][name]);
for (name in scope.globals.exported)
_context[scope.globals.exported[name]] = eval(scope.globals.exported[name]);
})();
}
Теперь, если ваш файл src.js
, запуск node src.js
запустится node, загрузите файл, запустите REPL и скопируйте все объекты, объявленные как var
на верхнем уровне, а также любые экспортированные глобальные переменные,
if (require.main === module)
гарантирует, что этот код не будет выполнен, если src.js
включен в оператор require
. Фактически, вы можете добавить любой код, который вы хотите исключить, когда вы выполняете автономный src.js
для целей отладки внутри оператора if
.
Ответ 6
Другое предложение, которое я не вижу здесь: попробуйте этот маленький код
#!/usr/bin/env node
'use strict';
const repl = require('repl');
const cli = repl.start({ replMode: repl.REPL_MODE_STRICT });
cli.context.foo = require('./foo'); // injects it into the repl
Затем вы можете просто запустить этот script и он будет включать foo
в качестве переменной
Ответ 7
Я всегда использую эту команду
node -i -e "$(< yourScript.js)"
работает точно так же, как в Python без каких-либо пакетов.
Ответ 8
Почему бы не загрузить файл в интерактивный node repl?
node -h
-e, --eval script evaluate script
-i, --interactive always enter the REPL even if stdin
node -e 'var client = require("./build/main/index.js"); console.log("Use `client` in repl")' -i
Затем вы можете добавить в скрипты package.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
с использованием node v8.1.2
Ответ 9
Другим способом является определение этих функций как глобальных.
global.helloWorld = function() { console.log("Hello World"); }
Затем предварительно загрузите файл в REPL как:
node -r ./file.js
Тогда функцию helloWorld
можно получить непосредственно в REPL.