将Node.js的REPL返回值从下划线_更改为其他内容?

时间:2012-07-31 20:20:38

标签: javascript node.js underscore.js read-eval-print-loop

相关问题:Using the Underscore module with Node.js

有没有办法更改变量Node.js'REPL将最后一个返回值设置为?如果您可以将其从_更改为__$_,则可以全局化下划线模块,这样您就不必将其设置为每个文件中的变量:{{3 }}

2 个答案:

答案 0 :(得分:3)

我想出了一种使用本机Node repl模块执行此操作的方法。不要只在命令行运行node,而是将其放在console.js之类的内容中,然后运行node console.js

var repl = require('repl')
var vm = require('vm');

var _;

var server = repl.start({
  eval: function (cmd, context, filename, callback) {
    try {
      var match = cmd.match(/^\((.*)\n\)$/);
      var code = match ? match[1] : cmd;
      context._ = _;
      var result = vm.runInThisContext(code, filename);
    } catch (error) {
      console.log(error.stack);
    } finally {
      _ = context._;
      callback(null, result);
    }
  }
}).on('exit', function () {
  process.exit(0);
});

这是一个要点:https://gist.github.com/jasoncrawford/6818650

答案 1 :(得分:1)

除非您想编辑来源,否则我认为您无法更改_。 node.js REPL似乎在lib/repl.js中实现;如果你在图书馆附近徘徊一点,你会看到like this

self.context._ = self.context[cmd] = lib;
self.outputStream.write(self.writer(lib) + '\n');

like this

self.context._ = ret;
self.outputStream.write(self.writer(ret) + '\n');

self.context对象是REPL的全局上下文或命名空间(类似于浏览器中的window),因此self.context._ = ret;等同于从REPL的提示符中说出_ = ret。 / p>

所以_是硬连线的,除非你想破解node.js库,否则你无能为力。