如何将我的脚本加载到node.js REPL中?
我有一个脚本foo.js
包含我想在REPL中玩的一些function。
有没有办法让节点执行我的脚本,然后用所有声明的全局variables跳转到REPL,就像我可以用python -i foo.py
或ghci foo.hs
?
还没有内置提供您所描述的确切function。 但是,使用替代方法require
它在REPL中使用.load
命令 ,如下所示:
.load foo.js
它一行一行地加载文件,就像在REPL中input一样。 与require
不同的是,这会加载您所使用的命令来污染REPL历史logging。 然而,它具有可重复性的优点,因为它不像require
一样被caching。
哪一个更好,取决于你的用例。
编辑:它适用性有限,因为它不能在严格模式下工作,但三年后,我已经了解到如果你的脚本没有'use strict'
,你可以使用eval
来加载你的脚本而不污染REPL历史logging:
var fs = require('fs'); eval(fs.readFileSync('foo.js').toString())
由于厌倦了重复加载脚本,我创build了replpad 。
只需通过安装它: npm install -g replpad
然后通过运行使用它: replpad
如果您希望它监视当前和所有子目录中的所有文件,并在更改时将它们replpad .
到repl: replpad .
看看网站上的video,以更好地了解它是如何工作的,并了解一些其他不错的function,如:
- 通过添加到每个核心函数(即
fs.readdir.dox()
函数访问repl中的核心模块docs。 - 通过添加到通过npm安装的每个模块的
marked.dox()
函数来访问repl中的用户模块自述文件 ,即marked.dox()
- 访问函数突出显示的源代码 , 定义了哪里函数的信息(文件,linenumber)和函数注释和/或jsdocs在可能的情况下通过添加到每个函数的
src
属性,即express.logger.src
- 对讲机支持 (见
.talk
命令) - 添加命令和键盘快捷键
- vim密钥绑定
- 键映射支持
- parens通过匹配令牌插件匹配
- 通过键盘快捷键或
.append
命令将在repl中input的代码附加到文件中
我做了Vorpal.js ,通过把你的节点添加到交互式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:
目前你不能直接这样做,但你可以在REPL中使用mylib = require('./foo.js')
。 记住方法被导出,而不是声明为全局variables。
replpad
是很酷的,但是为了快速简便的将文件加载到节点中,导入其variables并启动repl,可以将以下代码添加到.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
所有对象以及任何导出的全局variables。 if (require.main === module)
确保如果通过require
语句包含src.js
则不会执行此代码。 事实上,你可以添加任何你想要执行的代码,当你在if
语句里面运行src.js
来进行debugging的时候。
另一个build议,我没有看到这里:尝试这一点点的代码
#!/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
作为一个variables
为什么不把文件加载到交互式节点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进行testing
我总是使用这个命令
node -i -e "$(< yourScript.js)"
在没有任何软件包的情况下就像Python一样工
另一种方法是将这些function定义为全局的。
global.helloWorld = function() { console.log("Hello World"); }
然后在REPL中预载文件:
node -r ./file.js
然后可以直接在REPL中访问函数helloWorld
。