Respostas:
Ainda não há nada incorporado para fornecer a funcionalidade exata que você descreve. No entanto, uma alternativa para usá- require
lo para usar o .load
comando no REPL, como:
.load foo.js
Carrega o arquivo linha por linha, como se você o tivesse digitado no REPL. Diferente require
disso, polui o histórico do REPL com os comandos que você carregou. No entanto, tem a vantagem de ser repetível porque não é armazenado em cache comorequire
.
O que é melhor para você dependerá do seu caso de uso.
Edit: Ele tem aplicabilidade limitada, porque ele não funciona no modo estrito, mas três anos depois eu aprendi que se o seu script não tem 'use strict'
, você pode usar eval
para carregar seu script sem poluir a história REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
eu sempre uso esse comando
node -i -e "$(< yourScript.js)"
funciona exatamente como no Python sem nenhum pacote.
Eu criei o Vorpal.js , que lida com esse problema, transformando o seu nó em uma CLI interativa. Ele suporta uma extensão REPL, que o leva a um REPL dentro do contexto do seu aplicativo em execução.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
Em seguida, você pode executar o aplicativo e ele cairá em um REPL.
$ node myapp.js repl
myapp> repl:
Outra maneira é definir essas funções como globais.
global.helloWorld = function() { console.log("Hello World"); }
Em seguida, pré-carregue o arquivo no REPL como:
node -r ./file.js
Em seguida, a função helloWorld
pode ser acessada diretamente no REPL.
Criei o replpad desde que me cansei de recarregar o script repetidamente.
Basta instalá-lo via: npm install -g replpad
Em seguida, use-o executando: replpad
Se você deseja que ele assista todos os arquivos nos subdiretórios atual e todos e inclua-os na repl quando eles mudarem: replpad .
Confira os vídeos no site para ter uma idéia melhor de como funciona e aprenda sobre alguns outros recursos interessantes que possui:
dox()
função que é adicionada a todas as funções principais, ou seja,fs.readdir.dox()
dox()
função que é adicionada a todos os módulos instalados via npm, ou seja,marked.dox()
src
propriedade adicionada a cada função, por exemploexpress.logger.src
.talk
comando).append
comando do tecladoConsulte: https://github.com/thlorenz/replpad
CXX=clang++ npm install replpad
trabalhar em torno o errog++: 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
Por que não carregar o arquivo em uma repl de nó interativo?
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
Em seguida, você pode adicionar aos scripts package.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
testado usando o nó v8.1.2
node -i -r "./build/main/index.js"
?
Atualmente, você não pode fazer isso diretamente, mas mylib = require('./foo.js')
no REPL. Lembre-se de que os métodos são exportados, não declarados como globais.
.load my_work.js
, apesar de exigir algumas exports.working_var = ...
declarações adicionais , porque o REPL vomita em alguns tipos de javascript perfeitamente válidos, como comentários de várias linhas (pelo menos com a minha readline
configuração).
replpad
é legal, mas para uma maneira rápida e fácil de carregar um arquivo no nó, importar suas variáveis e iniciar uma substituição, você pode adicionar o seguinte código ao final do seu arquivo .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]);
})();
}
Agora, se o seu arquivo estiver src.js
, a execução node src.js
iniciará o nó, carregará o arquivo, iniciará um REPL e copiará todos os objetos declarados var
no nível superior, bem como quaisquer globais exportados. Os if (require.main === module)
garante que este código não será executado se src.js
está incluído através de um require
comunicado. Na verdade, você pode adicionar qualquer código que você deseja que seja excedido quando estiver executando o src.js
autônomo para fins de depuração dentro da if
instrução.
Aqui está uma versão da função bash da resposta de George :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Se você colocar isso no seu, ~/.bash_profile
poderá usá-lo como um pseudônimo, ou seja:
noderepl foo.js
Outra sugestão que não vejo aqui: experimente este pouco de código
#!/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
Então você pode simplesmente executar este script e ele incluirá foo
como uma variável
Resposta antiga
type test.js|node -i
Irá abrir o nó REPL e digitar todas as linhas de test.js no REPL, mas por alguma razão o nó será encerrado após o término do arquivo
Outro problema é que as funções não serão içadas.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Em seguida, todas as globais declaradas sem var no test2.js estarão disponíveis no REPL
não sei por que var a no escopo global não estará disponível