Respuestas:
Todavía no hay nada incorporado para proporcionar la funcionalidad exacta que describe. Sin embargo, una alternativa a usarlo require
para usar el .load
comando dentro de REPL, como tal:
.load foo.js
Carga el archivo en línea por línea como si lo hubiera escrito en REPL. A diferencia de require
esto contamina la historia REPL con los comandos que ha cargado. Sin embargo, tiene la ventaja de ser repetible porque no se almacena en caché como require
.
Lo que sea mejor para usted dependerá de su caso de uso.
Editar: tiene una aplicabilidad limitada porque no funciona en modo estricto, pero tres años después supe que si su script no tiene 'use strict'
, puede usarlo eval
para cargar su script sin contaminar el historial REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
siempre uso este comando
node -i -e "$(< yourScript.js)"
funciona exactamente como en Python sin ningún paquete.
Hice Vorpal.js , que maneja este problema al convertir su nodo en una CLI interactiva. Admite una extensión REPL, que lo coloca en un REPL dentro del contexto de su aplicación en ejecución.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
Luego puede ejecutar la aplicación y se colocará en una REPL.
$ node myapp.js repl
myapp> repl:
Otra forma es definir esas funciones como globales.
global.helloWorld = function() { console.log("Hello World"); }
Luego precargue el archivo en REPL como:
node -r ./file.js
Entonces helloWorld
se puede acceder a la función directamente en REPL.
He creado replpad ya me cansé de volver a cargar el script de forma repetida.
Simplemente instálelo a través de: npm install -g replpad
Luego úselo ejecutando: replpad
Si desea ver todos los archivos en el actual y todos los subdirectorios y canalizarlos en la respuesta cuando cambian, haga lo siguiente: replpad .
Echa un vistazo a los videos en el sitio para tener una mejor idea de cómo funciona y conocer algunas otras características interesantes que tiene como estas:
dox()
función que se agrega a cada función principal, es decirfs.readdir.dox()
dox()
función que se agrega a cada módulo instalado a través de npm, es decirmarked.dox()
src
propiedad que se agrega a cada función, es decirexpress.logger.src
.talk
comandos).append
comandoCXX=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
¿Por qué no cargar el archivo en un nodo interactivo 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
Luego puede agregar a los scripts package.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
probado usando el nodo v8.1.2
node -i -r "./build/main/index.js"
?
Actualmente no puede hacerlo directamente, pero puede hacerlo mylib = require('./foo.js')
en REPL. Recuerde que los métodos se exportan, no se declaran como globales.
.load my_work.js
, a pesar de requerir algunas exports.working_var = ...
declaraciones adicionales , porque REPL no acepta algunos tipos de javascript perfectamente válidos, como comentarios de varias líneas (al menos con mi readline
configuración).
replpad
es genial, pero para una manera rápida y fácil de cargar un archivo en el nodo, importar sus variables e iniciar una respuesta, puede agregar el siguiente código al final de su archivo .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]);
})();
}
Ahora, si su archivo está en src.js
ejecución, node src.js
se iniciará el nodo, cargará el archivo, iniciará un REPL y copiará todos los objetos declarados como var
en el nivel superior, así como cualquier global exportado. Esto if (require.main === module)
asegura que este código no se ejecutará si src.js
se incluye a través de una require
declaración. De hecho, puede agregar cualquier código que desee que se ejecute cuando se ejecuta de forma src.js
independiente con fines de depuración dentro de la if
declaración.
Aquí hay una versión de la función bash de la respuesta de George :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Si pone esto en su ~/.bash_profile
puede usarlo como un alias, es decir:
noderepl foo.js
Otra sugerencia que no veo aquí: prueba este pequeño 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
Luego, simplemente puede ejecutar este script e incluirá foo
como una variable
Vieja respuesta
type test.js|node -i
Abrirá el nodo REPL y escribirá todas las líneas de test.js en REPL, pero por alguna razón el nodo se cerrará cuando finalice el archivo
Otro problema es que las funciones no se izarán.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Entonces, todos los globales declarados sin var dentro de test2.js estarán disponibles en el REPL
no estoy seguro de por qué var a en el ámbito global no estará disponible