2011-10-19 31 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