Node.js 中的 REPL 驱动开发

问题描述 投票:0回答:3

在像

Clojure
Scheme
这样的语言中,我真的很喜欢在 REPL 驱动模式下编写代码,当你在编辑器中编写一段代码时(
Emacs
在我的例子中),将它发送到你的 REPL,玩然后它返回到编辑器,修复发现的问题并再次将代码发送到 REPL。

我尝试对

Node.js
做同样的事情,如果我限制自己只使用
ES5
语法,它就会起作用。但是,如果我使用
ES6
功能,如
const
let
class
,我预计在重新评估我的声明时会出错:

> let foo = 1;
> let foo = 2;
TypeError: Identifier 'foo' has already been declared

是否有任何

Node.js REPL
参数,或者是否有补丁
REPLs
,甚至是一些神奇的
Emacs
模式,当我重新评估我的代码时,它会清除现有的声明?这样我就能够以这种方式编写
Node.js
代码,而无需不断思考我正在使用的语法和/或需要在每次重新评估时手动重新启动
REPL

javascript node.js emacs ecmascript-6 read-eval-print-loop
3个回答
2
投票

如果您正在使用

nodejs-repl
,您可以评估(
M-:
)以下代码:

(with-current-buffer "*nodejs*" 
  (setq kill-buffer-query-functions (delq 'process-kill-buffer-query-function kill-buffer-query-functions))
  (kill-process nil comint-ptyp) 
  (kill-buffer-and-window) 
  (run-with-timer 0.01 nil (lambda () (nodejs-repl))
))

这不是最佳解决方案,但它是这样工作的:

  • 它评估当前缓冲区中的 emacs lisp 代码
  • 它杀死了询问你是否要杀死窗口的函数(在迷你缓冲区中确认)
  • 它停止了允许 nodejs 和 emacs 之间通信的进程,因此它杀死了 nodejs 进程(comint-ptyp)
  • 重播
    nodejs-repl

如果你想用另一个 REPL 运行它,只需将缓冲区名称和命令更改为“重新运行”。

希望有帮助,

致以诚挚的问候


编辑

这是一个更合适的解决方案,将其添加到您的

.emacs
nodejs-repl.el

(defun nodejs-repl-restart ()
  "restart the nodejs REPL"
  (interactive)
  (defvar nodejs-repl-code
    (concat "process.stdout.columns = %d;" "require('repl').start('%s', null, null, true, false)"))
  (with-current-buffer "*nodejs*"
    (kill-process nil comint-ptyp)
    (run-with-timer 0.01 nil (lambda ()
                  (setq nodejs-repl-prompt-re (format nodejs-repl-prompt-re-format nodejs-repl-prompt nodejs-repl-prompt))
                  (with-current-buffer "*nodejs*"
                (apply 'make-comint nodejs-repl-process-name nodejs-repl-command nil `("-e" ,(format nodejs-repl-code (window-width) nodejs-repl-prompt)))
                (nodejs-repl-mode) (erase-buffer) ))))) 

它几乎做同样的事情,但它不会杀死缓冲区并将其擦除。


1
投票

Node.js 具有良好的 REPL 驱动开发基础。批准它的多个因素:

  • JavaScript 是解释型语言,支持
    eval
  • 能够编写有状态程序并以某种方式改变这种状态
  • 能够通过 inspect 协议连接到 Node.js 进程并执行任意代码,这可以改变程序的内部状态

ClojureScript 项目,如 nbb 使用这种可能性直接在 Node.js 上成功进行 REPL 驱动开发。还存在另一个工具,让 Clojure 感觉像 REPL 驱动的开发,但使用 JavaScript/TypeScript:

  • node-remote-repl - 用于通过 inspect 协议在远程(可能是本地主机)Node.js 进程上执行任意文件代码的命令行工具。此命令行工具可以与任何 IDE、提供的 VSCode 示例集成。这个项目的灵感来自 Clojure nREPL。
  • repl-ns - 命名空间的实现,直接受 Clojure 命名空间的启发,允许编写 REPL 驱动的开发友好代码,默认情况下保留程序状态。

node-remote-repl + repl-ns 受 Clojure 启发,允许使用 JavaScript/TypeScript 在 Node.js 中感受 Clojure 的 RDD 方式。顺便说一句,RDD 非常适合 TUI 开发,因为它通常是有状态的。 ytdl-tui - TUI,完全使用上面提到的 RDD 和工具编写,可以随意使用它作为灵感来源。

关于本机 Node.js REPL 的几句话。我认为这是玩具工具,它允许执行小代码片段,但对大型严肃项目没有好处。


0
投票

我写了 Replete,一个 JavaScript 模块的评估器。它支持导入语句,并在浏览器、Node.js 和 Deno 中评估代码。有一个 Emacs 插件,等等。

© www.soinside.com 2019 - 2024. All rights reserved.