如果我做
repl = require 'repl'
repl.start {useGlobal: true}
它启动一个节点 repl。如何改为启动 CoffeeScript repl?
谢谢
如果我做
repl = require 'repl'
repl.start {useGlobal: true}
它启动一个节点 repl。如何改为启动 CoffeeScript repl?
谢谢
Nesh 是一个尝试让它变得更容易和可扩展的项目:
http://danielgtaylor.github.com/nesh/
它提供了一种嵌入 REPL 的方法,支持多种语言,如 CoffeeScript 以及提供异步插件架构,支持在启动时在 REPL 的上下文中执行代码等。例如:
nesh = require 'nesh'
nesh.loadLanguage 'coffee'
nesh.start (err, repl) ->
nesh.log.error err if err
它还支持一系列带有默认插件的选项,并公开了一些内置的便利功能:
opts =
welcome: 'Welcome to my interpreter!'
prompt: '> '
evalData: CoffeeScript.compile 'hello = (name="world") -> "Hello, #{world}!"', {bare: true}
nesh.start opts, (err, repl) ->
nesh.log.error err if err
我认为该coffee-script
模块不会像 Noderepl
模块那样导出要以编程方式使用的 REPL 功能。但是 CoffeeScript 有一个repl.coffee
可以使用的文件,即使它没有在主coffee-script
模块中导出。从(运行命令时执行的文件)得到提示,command.coffee
coffee
我们可以看到 REPL 仅通过请求repl
文件即可工作。所以,运行这个脚本应该会启动一个 CoffeeScript REPL:
require 'coffee-script/lib/coffee-script/repl'
然而,这种方法是相当 hacky的。最重要的缺陷是它在很大程度上取决于coffee-script
模块内部的工作方式和组织方式。没有什么可以阻止repl.coffee
文件从 中移出coffee-script/lib/coffee-script
或更改其工作方式。
一种更好的方法可能是coffee
不带参数调用命令,就像从命令行从 Node 执行的操作一样:
{spawn} = require 'child_process'
spawn 'coffee', [], stdio: 'inherit'
该stdio: 'inherit'
选项使生成的命令从标准输入读取并写入当前进程的标准输出。