【问题标题】:Determine if Javascript (NodeJS) code is running in a REPL确定 Javascript (NodeJS) 代码是否在 REPL 中运行
【发布时间】:2019-10-17 14:03:28
【问题描述】:

我希望在使用 IJavascript 内核的 Jupyter 笔记本中创建一个 NodeJS 源文件,以便我可以快速调试我的代码。一旦它运行起来,我就可以使用 Jupyter 的“下载为...”功能将笔记本保存为 NodeJS 脚本文件。

我希望能够选择性地忽略/包含在我运行生成的 NodeJS 脚本文件时不会执行的笔记本源代码。

我已经解决了这个问题,因为我可以确定代码是否在交互式会话中运行(IPython [REPL])。我通过在 Python 中使用这个函数来实现这一点:

def is_interactive():
    import __main__ as main
    return not hasattr(main, '__file__')

(感谢Tell if Python is in interactive mode

有没有办法为 NodeJS 做类似的事情?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    我不知道这是否是正确的方法,但找不到其他任何东西 基本上如果你

    try {
       const repl = __dirname
    } catch (err) {
      //code run if repl
    }
    

    感觉有点老套,但可以用¯\_(ツ)_/¯

    【讨论】:

    • 这不是一个好主意,因为它依赖于使用 CommonJS 的 REPL,在未来的 NodeJS 版本中可能会改变。更不用说 CommonJS 是未明确标记为 EJS 模块的脚本的默认执行环境。所以这可能会非常频繁地引发误报。
    • 我认为如果你把它放在一个js文件中是行不通的。
    【解决方案2】:

    最快和最可靠的方法就是查询进程参数。仅从 NodeJS 可执行文件,就有两种方法可以启动 REPL。在调用节点之后,您可以在没有任何脚本的情况下执行 this 之类的操作。

    node --experimental-modules ...
    

    或者您使用 interactive mode 强制节点进入 REPL。

    node -i ...
    

    v6.11.0 中添加的选项结束参数-- 永远不会将参数附加到process.argv 数组中,除非它在脚本模式下执行;通过FILE-p-e。用于 NodeJS 的任何参数都将被过滤到随附的 process.execArgv 变量中,因此 process.argv 数组中唯一剩下的应该是 process.execPath。在这种情况下,我们可以将查询简化为下面的解决方案。

    const isREPL = process.execArgv.includes("-i") || process.argv.length === 1;
    
    console.log(isREPL ? "You're in the REPL" : "You're running a script m8");
    

    这不是最可靠的方法,因为任何用户都可以从启动器脚本中实例化 REPL,您的代码可以由该脚本运行。为此,我很确定您可以使用人为错误来抓取回溯并查找 REPL 条目。虽然我目前没有时间实施和确保该解决方案。

    【讨论】:

    • 如果我这样做是行不通的。使用 babel-nodeisREPL 然后为我返回 false。
    • 我把它改成了const isREPL = !!require("repl").repl; 不确定这是否总是可靠的。
    • @jtompl,我得看看那个,看看能不能找到解决方法,我还没玩过babel-node。我只是在独立 node 的上下文中回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2021-10-31
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多