Ответы:
По-прежнему нет ничего встроенного, чтобы обеспечить точную функциональность, которую вы описываете. Однако в качестве альтернативы его использованию require
можно использовать .load
команду в REPL, например:
.load foo.js
Он загружает файл построчно, как если бы вы ввели его в REPL. В отличие от require
этого, история REPL засоряется загруженными вами командами. Тем не менее, он имеет то преимущество, что его можно повторять, потому что он не кэшируется, как require
.
Что лучше для вас, будет зависеть от вашего варианта использования.
Изменить: он имеет ограниченную применимость, потому что он не работает в строгом режиме, но три года спустя я узнал, что если в вашем скрипте его нет 'use strict'
, вы можете использовать его eval
для загрузки своего скрипта, не загрязняя историю REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
я всегда использую эту команду
node -i -e "$(< yourScript.js)"
работает точно так же, как в Python без каких-либо пакетов.
Я сделал Vorpal.js , который решает эту проблему, превращая добавление узла в интерактивный интерфейс командной строки. Он поддерживает расширение 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:
Другой способ - определить эти функции как глобальные.
global.helloWorld = function() { console.log("Hello World"); }
Затем предварительно загрузите файл в REPL как:
node -r ./file.js
После этого к функции helloWorld
можно будет получить доступ прямо в REPL.
Я создал replpad, так как устал многократно перезагружать скрипт.
Просто установите его через: npm install -g replpad
Затем используйте его, запустив: replpad
Если вы хотите, чтобы он просматривал все файлы в текущем и всех подкаталогах и передавал их в ответ при изменении, выполните: replpad .
Посмотрите видео на сайте, чтобы лучше понять, как это работает, и узнать о некоторых других приятных функциях, таких как:
dox()
функцию, которая добавляется к каждой основной функции, т.е.fs.readdir.dox()
dox()
функцию, которая добавляется к каждому модулю, установленному через npm, т.е.marked.dox()
src
свойство, которое добавляется к каждой функции, т. е.express.logger.src
.talk
команда).append
командыCXX=clang++ npm install replpad
обойти ошибкуg++: error: unrecognized command line option '-stdlib=libc++'
# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
Почему бы не загрузить файл в интерактивный узел 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",
протестировано с использованием узла v8.1.2
node -i -r "./build/main/index.js"
?
В настоящее время вы не можете сделать это напрямую, но можете mylib = require('./foo.js')
в REPL. Помните, что методы экспортируются, а не объявляются как глобальные.
.load my_work.js
, несмотря на то , что требуются некоторые дополнительные exports.working_var = ...
объявления, потому что REPL блокирует некоторые виды совершенно допустимого javascript, например многострочные комментарии (по крайней мере, с моей readline
конфигурацией).
replpad
это круто, но для быстрого и простого способа загрузить файл в узел, импортировать его переменные и запустить ответ, вы можете добавить следующий код в конец вашего .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
, запускается узел, загружается файл, запускается REPL и копируются все объекты, объявленные как var
на верхнем уровне, а также любые экспортированные глобальные объекты . В if (require.main === module)
гарантирует , что этот код не будет выполняться , если src.js
включен через require
заявление. Фактически, вы можете добавить любой код, который вы хотите исполнять, когда вы работаете в src.js
автономном режиме для целей отладки внутри if
оператора.
Вот версия ответа Джорджа с функцией bash :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Если вы поместите это в свой, ~/.bash_profile
вы можете использовать его как псевдоним, то есть:
noderepl foo.js
Еще одно предложение, которого я здесь не вижу: попробуйте этот небольшой фрагмент кода
#!/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
Затем вы можете просто запустить этот скрипт, и он будет включен foo
в качестве переменной
Старый ответ
type test.js|node -i
Откроет узел REPL и введет все строки из test.js в REPL, но по какой-то причине узел закроется после завершения файла
Другая проблема в том, что функции не будут подняты.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Тогда все глобальные переменные, объявленные без var в test2.js, будут доступны в REPL
не уверен, почему var a в глобальной области не будет доступен