16

是否有人使用现有的 node.js REPL 为自己设置了类似的东西?我没有想到一个快速的方法来做到这一点。

我今天这样做的方式是使用 emacs,这个: https ://github.com/ivan4th/swank-js

该模块由以下部分组成:

  1. Emacs 的 SLIME-js 插件,与 js2-mode 结合使用,您可以简单地在函数 def 的某处发出 CMx - 然后关闭函数的字符串到 ..

  2. 用 Node.js 编写的 Swank-js 服务器(是的,您可以从本地计算机直接评估到远程进程) - 它接收您评估过的函数的字符串并实际评估它

  3. 一个完整的部分,可让您使用 BROWSER 连接到该服务器上的另一个端口,然后让您在该浏览器上操作 DOM(这非常棒但不相关)

我的解决方案在 emacs 端使用 SLIME-js,并且我在 app.js 文件中需要('swank-js')

现在..关于我的解决方案或其他可能的问题,我有几个问题和疑问:

Q1:这是不是太过分了?有人有什么秘密方法可以将 nano 中的东西评估到他的实时过程中吗?

Q2:我不得不改变 swank-js 的 EVALing 方式。它使用了某种黑魔法,如下所示:


var Script = process.binding('evals').Script;
var evalcx = Script.runInContext;
....
this.context = Script.createContext();
for (var i in global) this.context[i] = global[i];
this.context.module = module;
this.context.require = require;
...
r = evalcx("CODECODE", this.context, "repl");

据我了解,它只是将全局变量复制到新的上下文中,并且在 eval 时,不会更改原始函数定义 - SOOO .. 我只是使用普通的“eval”并且它可以工作。

您对此有何评论?

Q3:为了重新评估一个函数,它需要是一个 GLOBAL 函数 - 将所有函数定义为全局(类似clojure)是不好的做法吗?你认为还有另一种方法可以做到这一点吗?

4

3 回答 3

2

看看这个http://nodejs.org/api/vm.html

var util = require('util'),
vm = require('vm'),
sandbox = {
  animal: 'cat',
  count: 2
};

vm.runInNewContext('count += 1; name = "kitty"', sandbox, 'myfile.vm');
console.log(util.inspect(sandbox));

// { animal: 'cat', count: 3, name: 'kitty' }

应该对你有很大帮助,节点的所有沙箱都使用它:)但你可以直接使用它:)

于 2012-05-30T11:35:09.230 回答
2

实际上,swank.js 变得更好了,现在使用 NPM 在您的项目中设置 swank js 变得更加容易。我现在正在编写文档,但功能就在那里!

于 2012-03-05T19:57:12.500 回答
0

您可以查看 jsapp.us,它在沙箱中运行 JS,然后将其作为快速的小型测试服务器向世界公开。这是jsapp.us github 存储库

另外,请停下来#node.js并提出问题以获得更快的响应:)

于 2011-03-30T04:03:39.120 回答