在express.js中使用jsdom.jsdom()我創建了一個包含一些'基礎'佈局標記的文檔,並將一些客戶端庫(如jQuery)附加到它的窗口。jsdom窗口緩存
這將是很好,只需要做一次這個設置。
問題是窗口文檔的DOM將根據請求的url而改變。有沒有一種方法可以讓每個請求從同一個緩存窗口對象開始並對其進行增強,或者是否必須從每個請求開始重新設置?
在express.js中使用jsdom.jsdom()我創建了一個包含一些'基礎'佈局標記的文檔,並將一些客戶端庫(如jQuery)附加到它的窗口。jsdom窗口緩存
這將是很好,只需要做一次這個設置。
問題是窗口文檔的DOM將根據請求的url而改變。有沒有一種方法可以讓每個請求從同一個緩存窗口對象開始並對其進行增強,或者是否必須從每個請求開始重新設置?
我不認爲這是可能的。當您使用jsdom構建器創建新文檔時,您指定的任何自定義選項只會影響當前正在創建的文檔。在此之後創建的任何其他文檔都將依賴於默認功能。
但是,您實際上可以修改這些默認功能 - 我認爲這就是您想要的功能。在創建任何文件之前,可以修改這些默認設置爲未來的所有文件:
require('jsdom').defaultDocumentFeatures = {
FetchExternalResources : ['script'],
ProcessExternalResources : false,
MutationEvents : false,
QuerySelector : false
}
每個選項的解釋可以通過閱讀jsdom的README。
這聽起來像你想要一個簡單的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]);
});
}
Zombie.js在內部使用jsdom,它有一個fork方法。我認爲它被廣告作爲解決與你相同的問題的一種方式,但我不知道它是如何做到的。 –