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

hug*_*omg 121 javascript node.js read-eval-print-loop

我有一个脚本foo.js,其中包含我想在REPL中使用的一些函数.

有没有办法让节点执行我的脚本,然后跳转到一个包含所有声明的全局变量的REPL,就像我可以使用python -i foo.pyghci foo.hs

vos*_*d01 164

仍然没有任何内置功能可以提供您描述的确切功能.但是,使用require它在REPL中使用.load命令的替代方法,如:

.load foo.js
Run Code Online (Sandbox Code Playgroud)

它逐行加载文件,就像您在REPL中键入它一样.与require此不同的是,使用您加载的命令污染REPL历史记录.但是,它具有可重复性的优点,因为它不像缓存那样require.

哪个更好,取决于您的使用案例.


编辑:它的适用性有限,因为它不能在严格模式下工作,但三年后我了解到如果您的脚本没有'use strict',您可以使用eval加载脚本而不会污染REPL历史记录:

var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
Run Code Online (Sandbox Code Playgroud)

  • @Chet如果您的问题与现有问题不匹配,则写下一个新的StackOverflow问题:-) (2认同)

Geo*_*ili 27

我总是使用这个命令

node -i -e "$(< yourScript.js)"
Run Code Online (Sandbox Code Playgroud)

与没有任何软件包的Python完全一样.

  • 有谁知道如何在 Windows cmd 中使其工作?我在 bash 中可以运行,但在 Windows 中不行。 (2认同)

dth*_*ree 9

我创建了Vorpal.js,它通过将您的节点添加到交互式CLI来处理此问题.它支持REPL扩展,在您运行的应用程序的上下文中将其转换为REPL.

var vorpal = require('vorpal')();
var repl = require('vorpal-repl');

vorpal
  .delimiter('myapp>')
  .use(repl)
  .show()
  .parse(process.argv); 
Run Code Online (Sandbox Code Playgroud)

然后你可以运行应用程序,它将进入REPL.

$ node myapp.js repl
myapp> repl: 
Run Code Online (Sandbox Code Playgroud)


Ash*_*ary 8

另一种方法是将这些功能定义为全局功能。

global.helloWorld = function() { console.log("Hello World"); }
Run Code Online (Sandbox Code Playgroud)

然后以以下方式将文件预加载到REPL中:

node -r ./file.js
Run Code Online (Sandbox Code Playgroud)

然后helloWorld可以在REPL中直接访问该功能。


Tho*_*enz 7

我创建了replpad因为我厌倦了重复重新加载脚本.

只需安装它: npm install -g replpad

然后通过运行使用它: replpad

如果您希望它在当前和所有子目录中观察所有文件,并在更改时将它们传递到repl: replpad .

查看网站上的视频,以更好地了解它的工作原理,并了解其中一些其他不错的功能:

  • 通过dox()添加到每个核心功能的函数访问repl中的核心模块文档,即fs.readdir.dox()
  • 通过dox()添加到通过npm安装的每个模块的函数访问repl中的用户模块自述文件,即marked.dox()
  • 访问函数的突出显示的源代码,函数定义的位置信息(文件,亚麻)和函数注释和/或jsdocs尽可能通过src添加到每个函数的属性,即express.logger.src
  • scriptie-talkie支持 (参见.talk命令)
  • 添加命令和键盘快捷键
  • vim键绑定
  • 关键地图支持
  • 通过匹配令牌插件匹配的parens
  • 通过键盘快捷键或.append命令将在repl中输入的代码追加回文件


Eli*_*iot 6

这是乔治回答的 bash 函数版本 :

noderepl() {
    FILE_CONTENTS="$(< $1 )"
    node -i -e "$FILE_CONTENTS"
}
Run Code Online (Sandbox Code Playgroud)

如果你把它放在你的~/.bash_profile你可以像别名一样使用它,即:

noderepl foo.js
Run Code Online (Sandbox Code Playgroud)

  • 我已经使用它几个月了,在过渡到新的 shell 环境时,我丢失了一些设置,不得不再次追踪它。所以既然我在这里,我想我会感谢你这个非常有用的功能。 (2认同)

Ric*_*asi 5

目前你不能直接这样做,但你可以mylib = require('./foo.js')在 REPL 中。记住方法是导出的,而不是声明为全局变量。


lfe*_*445 5

为什么不将文件加载到交互式节点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
Run Code Online (Sandbox Code Playgroud)

然后您可以添加到package.json脚本

"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
Run Code Online (Sandbox Code Playgroud)

使用节点v8.1.2进行了测试

  • 为什么不只是`node -i -r“ ./build/main/index.js”`? (2认同)