gpt4 book ai didi

javascript - phantomjs 可以与 node.js 一起使用吗?

转载 作者:IT老高 更新时间:2023-10-28 22:00:12 26 4
gpt4 key购买 nike

我想在我的 node.js 脚本中使用 phantomjs。有一个phantomjs-node图书馆..但不幸的是作者使用这个奇怪的 CoffeeScript 代码来解释他在做什么:

phantom = require 'phantom'

phantom.create (ph) ->
ph.createPage (page) ->
page.open "http://www.google.com", (status) ->
console.log "opened google? ", status
page.evaluate (-> document.title), (result) ->
console.log 'Page title is ' + result
ph.exit()

现在如果我直接在 javascript 中使用 phantomjs,它看起来像 this :

var page = require('webpage').create();
page.open(url, function (status) {
var title = page.evaluate(function () {
return document.title;
});
console.log('Page title is ' + title);
});

所以基本上我正在尝试用普通的 javascript 编写与上面第一个代码片段等效的代码(通过阅读 CoffeeScript documentation ..这就是我所做的:

// file name: phantomTest.js

var phantom = require('phantom');

phantom.create(function(ph) {
ph.createPage(function(page) {
page.open('http://www.google.com', function(status) {
console.log('opened google?', status);
var title = page.evaluate(function() {
return document.title;
});
console.log('page title is ' + title);
});
});
ph.exit();
});

不幸的是,它不起作用!如果我跑

node phantomTest.js

在 shell 上,什么都没有发生.. 没有任何返回,过程也没有停止.. 有什么想法吗?

更新:

我刚刚在 phantomjs faq 中读到了这个:

Q: Why is PhantomJS not written as Node.js module?

A: The short answer: "No one can serve two masters."

A longer explanation is as follows.

As of now, it is technically very challenging to do so.

Every Node.js module is essentially "a slave" to the core of Node.js, i.e. "the master". In its current state, PhantomJS (and its included WebKit) needs to have the full control (in a synchronous matter) over everything: event loop, network stack, and JavaScript execution.

If the intention is just about using PhantomJS right from a script running within Node.js, such a "loose binding" can be achieved by launching a PhantomJS process and interact with it.

嗯..这可能与它有关吗?但是那样整个库就没有意义了!

更新 2:

我在 web 中找到了此代码做同样的事情:

var phantom = require('phantom');
phantom.create(function(ph) {
return ph.createPage(function(page) {
return page.open("http://www.google.com", function(status) {
console.log("opened google? ", status);
return page.evaluate((function() {
return document.title;
}), function(result) {
console.log('Page title is ' + result);
return ph.exit();
});
});
});
});

不幸的是,这也不起作用..结果相同!

最佳答案

phantomjs-node 不是官方支持的 phantomjs 的 npm 包。相反,它通过创建一个使用 websockets 作为 Node 和 phantom 之间的 IPC channel 的 web 服务器,在 node 和 phantom 之间实现了一个“非常聪明的桥梁”。 I'm not making this up :

So we communicate with PhantomJS by spinning up an instance of ExpressJS, opening Phantom in a subprocess, and pointing it at a special webpage that turns socket.io messages into alert() calls. Those alert() calls are picked up by Phantom and there you go!

因此,如果 phantomjs-node 工作、不工作、静默失败或严重失败,我不会感到惊讶。我也不希望除了 phantomjs-node 的作者之外的任何人都能够解决 phantomjs-node 的问题。

您最初问题的答案是 phantomjs 常见问题的答案:不。Phantom 和 Node 具有不可调和的差异。两者都希望完全控制基本的低级功能,例如事件循环、网络堆栈和 JS 执行,因此它们不能在同一个进程中协作。

关于javascript - phantomjs 可以与 node.js 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15745394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com