在Java上从Rhino启动jsdom
我正在跟进这个答案 :
我设法在Java上运行Rhino Engine的简单JavaScript
代码。
但是当谈到D3.js时 ,例如:
var svg = d3.select("body").append("svg")
正如您所见, d3
要求DOM首先可用。
所以,出于这个原因, JSDOM应该是解决方案。
但是JSDOM
恰好依赖于requirejs
来自RequireJs
网站:
r.js文件允许您运行优化器以及在Node, Rhino或xpcshell中运行模块。
然后我的Java Rhino代码如下所示:
FileReader fr1 = new FileReader("lib/r.js"); FileReader fr2 = new FileReader("lib/jsdom.js"); engine.eval(fr1); engine.eval(fr2);
但是现在我最终出现了这样的错误:
ReferenceError:未定义“arguments”。
然后我找到了这个很好的答案 :
然后我的代码看起来像这样:
cx.evaluateReader(sharedScope, new FileReader("lib/r.js"), "require", 1, null); cx.evaluateReader(sharedScope, new FileReader("lib/loader.js"), "loader", 1, null); cx.evaluateReader(sharedScope, new FileReader("lib/jsdom.js"), "loader", 1, null);
错误:尚未加载模块名称“fs”
这基本上意味着jsdom.js
本身引用:
var fs = require('fs'); var path = require('path'); var URL = require('url');
所以,似乎我只需要下载所有这些。
但是fs – 是关于文件系统的 。 这意味着它依赖于NodeJs的本机实现。 这对我在普通java和普通js方面的尝试不利 。
更新:
现在我正朝这个方向做研究:
https://github.com/nodyn/jvm-npm http://nodyn.io/
问题是:如何将JSDOM加载到Rhino以让D3.js生成我的SVG?
再一次: Java Rhino – > D3.JS – > JSDOME – > RequireJS – > FS => SVG?
“或” : Mozilla Rhino如何使用nodejs“fs”模块?
我知道我可以使用PhantomJS ,但我正在寻找具有Java粘性的东西。 更轻巧,无需外部处理启动。
JsDom
可能是一个糟糕的选择,因为它依赖于Node和Google的V8 JavaScript引擎的许多内部function。 Env.JS应该是一个更好的选择,但如果它不起作用,那么你可能运气不好。 它可能不起作用,因为它本质上是2010年最后一个版本的冻结项目。您必须在Node或Phantom中运行JavaScript,或者使用基于Java的解决方案(如Apache Batik)生成SVG。
顺便说一句,JsDom中的require
与require.js不同,而是内置的Node.js函数 。
另一种方法是使用Domino作为DOM环境。 请看这里( http://jazdw.net/content/server-side-svg-generation-using-d3js )了解详情。 阅读评论部分也会有所帮助