在像
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
。
如果您正在使用
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))
))
这不是最佳解决方案,但它是这样工作的:
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) )))))
它几乎做同样的事情,但它不会杀死缓冲区并将其擦除。
Node.js 具有良好的 REPL 驱动开发基础。批准它的多个因素:
eval
ClojureScript 项目,如 nbb 使用这种可能性直接在 Node.js 上成功进行 REPL 驱动开发。还存在另一个工具,让 Clojure 感觉像 REPL 驱动的开发,但使用 JavaScript/TypeScript:
node-remote-repl + repl-ns 受 Clojure 启发,允许使用 JavaScript/TypeScript 在 Node.js 中感受 Clojure 的 RDD 方式。顺便说一句,RDD 非常适合 TUI 开发,因为它通常是有状态的。 ytdl-tui - TUI,完全使用上面提到的 RDD 和工具编写,可以随意使用它作为灵感来源。
关于本机 Node.js REPL 的几句话。我认为这是玩具工具,它允许执行小代码片段,但对大型严肃项目没有好处。
我写了 Replete,一个 JavaScript 模块的评估器。它支持导入语句,并在浏览器、Node.js 和 Deno 中评估代码。有一个 Emacs 插件,等等。