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

IT技术 javascript node.js read-eval-print-loop
2021-03-12 22:38:47

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

有没有办法让节点执行我的脚本,然后像我可以使用python -i foo.py那样使用所有声明的全局变量跳转到 REPL 中ghci foo.hs

6个回答

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

.load foo.js

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

哪个更适合您将取决于您的用例。


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

var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
@Chet 您可以使用 (async()=>{ more code })(); 加载另一个文件;它将共享相同的全局变量。
2021-04-23 22:38:47
@Chet 如果您的问题与现有问题不匹配,请编写一个新的 StackOverflow 问题:-)
2021-04-27 22:38:47
如果我想进入异步回调中的 repl 怎么办?
2021-04-28 22:38:47
如果您使用的是 macOS(也许其他人也是如此),请提示。您可以在 REPL 中键入“.load”(注意空格),然后将文件从 Finder 拖/放到终端中,以将正确的路径添加到您的命令中。如果您正在处理的文件向下几个级别,这将很方便。
2021-05-02 22:38:47
我需要声明__dirname才能使它工作。另外,我将代码写入了 shell 脚本(为了可重用性)。否则,很好的解决方案!
2021-05-10 22:38:47

我总是使用这个命令

node -i -e "$(< yourScript.js)"

与 Python 完全一样,没有任何包。

@Sharpiro:如果你安装了 Git,那么你可以选择在你的 Windows PC 中安装一个 mini-UNIX。我的意思是 Git 的 Windows 正态分布。
2021-04-21 22:38:47
令人讨厌的一件事是 Node.js 将打印 repl 提示,然后运行您的脚本,因此任何输出都会在提示后卡住。stackoverflow.com/a/45893494/3538165没有这个问题,但为此解决方案函数必须显式分配给变量以结束在 repl 命名空间中,所以也不是很好。
2021-04-22 22:38:47
有谁知道如何在 Windows cmd 中使用它?我让它在 bash 中工作,但不是在 Windows 中。
2021-05-13 22:38:47

我制作了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: 

另一种方法是将这些函数定义为全局函数。

global.helloWorld = function() { console.log("Hello World"); }

然后将 REPL 中的文件预加载为:

node -r ./file.js

然后helloWorld可以直接在 REPL 中访问该函数

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

只需通过以下方式安装: npm install -g replpad

然后通过运行使用它: replpad

如果您希望它查看当前和所有子目录中的所有文件,并在它们更改时将它们通过管道传输到 repl,请执行以下操作: replpad .

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

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

见:https : //github.com/thlorenz/replpad

但是当我运行它时它失败了 # # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
2021-04-22 22:38:47
我不得不CXX=clang++ npm install replpad解决这个错误g++: error: unrecognized command line option '-stdlib=libc++'
2021-04-23 22:38:47