node.js - parse - npm dom
¿Migrar de jsdom a phantomJS?(creación básica de DOM) (1)
Como desea hacer esto desde node.js, debe usar un puente PhantomJS como phantomjs-node (módulo phantom npm).
Cuando no abre una página en PhantomJS, en realidad está trabajando en una página sobre: en blanco, necesita agregar la opción de línea de comando ''--local-a-remote-url-access = yes'' para el proceso PhantomJS subyacente, para que los recursos remotos puedan ser cargados Tal vez --web-security=false
, --ssl-protocol=any
e ignore-ssl-errors=true
pueden ser necesarios.
Para inyectar scripts adicionales en DOM, debe usar injectJs()
para archivos locales e includeJs()
para archivos remotos. Además, no se puede acceder directamente al DOM en PhantomJS, ya que tiene dos contextos. El contexto de la página de espacio aislado ( page.evaluate()
) no tiene acceso a las variables definidas en el exterior, por lo que tendrá que pasarlas explícitamente, si las necesita.
var phantom = require(''phantom'');
var async = require(''async'');
function run(page, ph) {
page.evaluate(function () {
// page context: DOM code here
return document.title;
}, function (title) {
// node code here
console.log(''Page title is '' + title);
ph.exit();
});
}
var remoteScripts = [ "http://d3js.org/d3.v3.min.js" ];
var localScripts = [ "../js/d3.v3.min.js", "../js/jquery-2.1.3.min.js" ];
phantom.create(''--local-to-remote-url-access=yes'', ''--web-security=false'', function (ph) {
ph.createPage(function (page) {
async.series(remoteScripts.map(function(url){
return function(next){
page.includeJs(url, function(){
next();
});
};
}), function(){
async.series(localScripts.map(function(url){
return function(next){
page.injectJs(url, function(){
next();
});
};
}), function(){
run(page, ph);
});
});
});
});
Puede usar async para cargar listas de secuencias de comandos en el DOM. Usé la función de series()
.
M. Bostock señaló que nodejs ''jsdom tiene soporte incompleto para svg y, para mí, no es compatible con getBBox()
. Además, recomendó cambiar a PhantomJS de nodejs. Lo revisé, pero el enfoque es nuevo para mí.
Mi script nodejs + jsdom crea un DOM virtual, con el cual se reproduce mi d3js y es el siguiente:
var jsdom = require(''jsdom'');
jsdom.env( // creates virtual page
"<html><body></body></html>", // create my DOM hook,
[ ''http://d3js.org/d3.v3.min.js'', // add my online dependencies ...
''../js/d3.v3.min.js'', // ... & local ones
''../js/jquery-2.1.3.min.js''],
function (err, window) {
//my normal JS or nodejs code here !
}
);
¿Cómo migrar este nodejs + jsdom a nodejs + PhantomJS?