Ответы:
По-прежнему нет ничего встроенного, чтобы обеспечить точную функциональность, которую вы описываете. Однако в качестве альтернативы его использованию 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 в глобальной области не будет доступен