在Node.js中使用REPL驱动开发

8
在像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

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代码
  • 它终止询问您是否要杀死窗口的函数(在minibuffer中进行确认)
  • 它停止允许节点js和emacs之间通信的进程,因此它会终止nodejs进程(comint-ptyp)
  • 重新运行nodejs-repl
如果您想使用另一个REPL运行它,请更改缓冲区名称和“重新运行”命令。
希望有所帮助,
最好的问候,

编辑

以下是更合适的解决方案,请将其添加到您的.emacsnodejs-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协议在远程(可能是localhost)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 插件等。

Demo of Replete


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接