2011-10-19 26 views
14

在express.js中使用jsdom.jsdom()我创建了一个包含一些'基础'布局标记的文档,并将一些客户端库(如jQuery)附加到它的窗口。jsdom窗口缓存

这将是很好,只需要做一次这个设置。

问题是窗口文档的DOM将根据请求的url而改变。有没有一种方法可以让每个请求从同一个缓存窗口对象开始并对其进行增强,或者是否必须从每个请求开始重新设置?

+0

Zombie.js在内部使用jsdom,它有一个fork方法。我认为它被广告作为解决与你相同的问题的一种方式,但我不知道它是如何做到的。 –

回答

0

我不认为这是可能的。当您使用jsdom构建器创建新文档时,您指定的任何自定义选项只会影响当前正在创建的文档。在此之后创建的任何其他文档都将依赖于默认功能。

但是,您实际上可以修改这些默认功能 - 我认为这就是您想要的功能。在创建任何文件之前,可以修改这些默认设置为未来的所有文件:

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

每个选项的解释可以通过阅读jsdom的README

+1

问题不在于更改JSDOM功能/选项。这是关于克隆/缓存创建的窗口对象以供重用。 – rkusa

+0

谢谢你的答案杰米,但@ n26是正确的。 – cjroebuck

1

这听起来像你想要一个简单的JavaScript对象哈希?

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

我记得''__proto __“'仍然是一个问题,虽然 – Esailija

+0

在旧版本的V8中,是的。但不是所有其他引擎或V8的当前版本(包括稳定版Chrome中使用的版本)。 – Domenic