【问题标题】:Running jsdom in Nashorn在 Nashorn 中运行 jsdom
【发布时间】:2016-05-24 23:09:10
【问题描述】:

我想在服务器上渲染 d3 图表。我有 3 个选项:Node、Phantom 和 Nashorn。

我更喜欢 Nashorn,因为我的 API 是 Scala Play,我不想管理其他进程。 (部署、加载、队列等)

所以现在我需要让 JSDom 在 Nashorn 中工作,以便 D3 可以渲染。

到目前为止这有效,但我不知道如何添加 jsdom

class Application @Inject() (val messagesApi: MessagesApi) extends api.ApiController {

  def test = ApiAction { implicit request =>
    ok("The API is ready")
  }

  def pptx = Action { implicit request =>
    val manager: ScriptEngineManager = new ScriptEngineManager
    val engine: ScriptEngine = manager.getEngineByName("nashorn")
    engine.eval(new FileReader(Play.getFile("/ext/lodash.js")))
    val output = engine.eval("function hello(){return _.join('Hello world nashorn does this thing'.split(' '), '-');} hello();")
    Ok(output.toString)
  }
}

【问题讨论】:

  • 你遇到了什么问题? jsdom 有很多依赖项,而且那些可能也有依赖项,所以你可能需要手动添加所有这些。我不确定,但是像 browserify 或 webpack 这样的工具可能会有所帮助(将模块转换为基本上单个 js)...
  • 好吧 - 首先获得 jsdom.js。没有下载链接。
  • 我找到了第四个选项,typesafehub/webdriver 使用 rhino 和 htmlunit。

标签: javascript scala d3.js playframework nashorn


【解决方案1】:

我正在 nashorn 中加载 domino 的分支来运行 d3。 Domino 是基于 Mozilla 的 dom.js 的服务器端 DOM 实现。我使用 require.js 中的 r.js 加载它。您可以使用 nashorn 中缺少的 this readfully 函数来让 require.js 正常工作。

【讨论】:

  • 嘿@EricHartford,你能分享你的最终解决方案吗?你是怎么“需要”多米诺骨牌的?
  • 我使用 webpack 或 browserify 来打包我的依赖项,然后我将输出加载到 nashorn 中。
【解决方案2】:

您可以使用无头浏览器 selenium Chrome 驱动程序。

public class Test {
    public static void main(String args[]) {
        System.setProperty("webdriver.chrome.driver", "D:\\Program-Files\\chromedriver_win32\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless");

        WebDriver driver = new ChromeDriver(options);
        try {
           // String html_content = "<html><head></head><body><div>Hello World</div></body></html>";
            //driver.get("data:text/html;charset=utf-8," + html_content);
            driver.get("D:\\Projects\\Selenium1\\inputfile.html");
            JavascriptExecutor js = (JavascriptExecutor) driver;
            String html1 = (String) js.executeScript("return document.head.innerHTML;");
            System.out.println(html1);
            String html = (String) js.executeScript("return document.body.innerHTML;");
            System.out.println(html);
        } finally {
            driver.quit();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 1970-01-01
    • 2020-11-20
    • 2014-06-14
    • 2014-09-11
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多