2

我需要自定义 REPL 输入/输出流。例如,当某些事件发生时,我需要将一段脚本传递给 REPL,并获取它的输出并对其进行处理。


为了向您更清楚地描述它,我正在开发一个提供 REPL的vscode 插件 (github:源代码) 。就我而言,我有一个vscode WebView并且从那里获得用户输入,然后我想将该输入传递给节点 REPL 并获取其输出并将其显示给用户。

那么,我将如何实现呢?如果您需要更多信息,请告诉我。提前致谢。

编辑1:

const replServer = repl.start({
    input: /* what should be here? */,
    output: /* what should be here? */
});

编辑 2: 谁能解释我上面例子中input/参数的用法?output

4

2 回答 2

1
  1. 要创建一个 repl 服务器,您只需要这样做
const repl = require('repl')
repl.start({prompt: "> ", input: input_stream, output: output_stream");

prompt 是一个字符串,它是提示,stream 是输入。input_stream需要是可读流,output_stream需要是可写流。您可以在此处阅读有关流的更多信息。一旦流工作,你可以做

output_stream.on('data', (chunk) => {                                                                                                                                                            
   14   //whatever you do with the data                                                                                                                                                                     
   15 });                
于 2021-06-20T22:24:14.947 回答
1

这是一个对我有用的解决方案。

const {
    PassThrough
} = require('stream')
const repl = require('repl')


const input = new PassThrough()
const output = new PassThrough()

output.setEncoding('utf-8')



const _repl = repl.start({
    prompt: 'awesomeRepl> ',
    input,
    output
})

_repl.on('exit', function() {
    // Do something when REPL exit
    console.log('Exited REPL...')
})


function evaluate(code) {
    let evaluatedCode = ''
    output.on('data', (chunk) => {
        evaluatedCode += chunk.toString()
        console.log(evaluatedCode)

    })

    input.write(`${code}\n`)
    return result

}

evaluate('2 + 2') // should return 4

注意在函数外部创建了 REPL 实例,evaluate所以我们不会为每次调用创建一个新实例evaluate

于 2021-08-18T14:27:19.100 回答