如何将我的脚本加载到node.js REPL中?

我有一个脚本foo.js包含我想在REPL中玩的一些function。

有没有办法让节点执行我的脚本,然后用所有声明的全局variables跳转到REPL,就像我可以用python -i foo.pyghci 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