2011-10-19 14 views
14

Uso de jsdom.jsdom() en express.js Creo un documento con algunas marcas de diseño 'base' y adjunto unas pocas bibliotecas del lado del cliente como jQuery a su ventana.caché de ventana jsdom

Sería bueno tener que hacer esta configuración solo una vez.

El problema es que el DOM del documento de la ventana cambiará según la URL solicitada. ¿Hay alguna manera para que cada solicitud comience desde el mismo objeto de la ventana en caché y mejorarla o tiene que configurarse desde cero en cada solicitud?

+0

Zombie.js, que utiliza jsdom internamente, tiene un método de horquilla. Se anuncia como una forma de resolver el mismo tipo de problema que el suyo, creo, pero no sé cómo lo hace. –

Respuesta

0

No creo que esto sea posible. Cuando crea un nuevo documento utilizando el constructor jsdom, las opciones personalizadas que especifique solo afectarán al documento que se está creando actualmente. Cualquier documento adicional creado después de este punto se basará en las características predeterminadas.

Sin embargo, puede modificar estas características predeterminadas, que es lo que está buscando, creo. Antes de crear cualquier documento, puede modificar estos valores por defecto para todos los documentos futuros:

require('jsdom').defaultDocumentFeatures = { 
    FetchExternalResources : ['script'], 
    ProcessExternalResources : false, 
    MutationEvents   : false, 
    QuerySelector   : false 
} 

una explicación de cada opción está disponible mediante la lectura de jsdom README.

+1

La pregunta no es sobre cambiar las características/opciones de JSDOM. Se trata de clonar/almacenar en caché el objeto de ventana creado para su reutilización. – rkusa

+0

Gracias por la respuesta Jamie, pero @ n26 es correcto. – cjroebuck

1

Parece que quiere un hash de objetos de JavaScript simple?

var cache = Object.create(null); // avoids spurious entries for `hasOwnProperty` etc. 

// Incoming request happens, assume `req.url` is available... 

if (req.url in cache) { 
    processDom(cache[req.url]); 
} else { 
    jsdom.env(req.url, function (err, window) { 
     if (err) { 
      // handle error 
      return; 
     } 
     cache[req.url] = window; 
     processDom(cache[req.url]); 
    }); 
} 
+0

Recuerdo que '" __proto __ "' sigue siendo un problema aunque – Esailija

+0

En versiones anteriores de V8, sí. Pero no en todos los otros motores, o versiones actuales de V8 (incluido el que se usa en Chrome estable). – Domenic