2011-10-19 15 views
14

express.js में jsdom.jsdom() का उपयोग करके मैं कुछ 'बेस' लेआउट मार्कअप के साथ एक दस्तावेज़ बनाता हूं और कुछ क्लाइंट साइड लाइब्रेरीज़ को अपनी विंडो में jQuery जैसे संलग्न करता हूं।jsdom विंडो कैशिंग

यह केवल एक बार यह सेटअप करना अच्छा होगा।

समस्या यह है कि विंडो के दस्तावेज़ का डीओएम अनुरोधित यूआरएल के आधार पर बदल जाएगा। क्या प्रत्येक अनुरोध के लिए एक ही कैश किए गए विंडो ऑब्जेक्ट से शुरू करने और इसे बढ़ाने के लिए कोई तरीका है या क्या इसे प्रत्येक अनुरोध पर स्क्रैच से सेटअप करना है?

+0

Zombie.js, जो आंतरिक रूप से jsdom का उपयोग करता है, में कांटा विधि है। यह आपकी तरह की समस्या को हल करने के तरीके के रूप में विज्ञापित है, मुझे लगता है, लेकिन मुझे नहीं पता कि यह कैसे करता है। –

उत्तर

0

मुझे नहीं लगता कि यह संभव है। जब आप jsdom builder का उपयोग करके एक नया दस्तावेज़ बनाते हैं, तो निर्दिष्ट कोई भी कस्टम विकल्प केवल उस दस्तावेज़ को प्रभावित करेगा जो वर्तमान में बनाया जा रहा है। इस बिंदु के बाद बनाए गए कोई भी अतिरिक्त दस्तावेज़ डिफ़ॉल्ट सुविधाओं पर भरोसा करेंगे।

हालांकि, आप वास्तव में इन डिफ़ॉल्ट सुविधाओं को संशोधित कर सकते हैं - जो मुझे लगता है, जो मुझे लगता है। इससे पहले कि आप किसी भी दस्तावेज़ बनाने, आप भविष्य सभी दस्तावेजों के लिए इन सामान्य को संशोधित कर सकते हैं:

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

प्रत्येक विकल्प की एक व्याख्या jsdom के README पढ़कर उपलब्ध है।

+1

सवाल JSDOM सुविधाओं/विकल्पों को बदलने के बारे में नहीं है। यह पुन: उपयोग के लिए बनाई गई विंडो ऑब्जेक्ट को क्लोनिंग/कैशिंग करने के बारे में है। – rkusa

+0

उत्तर जेमी के लिए धन्यवाद, लेकिन @ n26 सही है। – cjroebuck

1

ऐसा लगता है कि आप एक साधारण जावास्क्रिप्ट ऑब्जेक्ट हैश चाहते हैं?

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

वी 8 के पुराने संस्करणों में, हाँ। लेकिन अन्य सभी इंजनों, या वी 8 के मौजूदा संस्करणों में नहीं (जिसमें स्थिर क्रोम में इस्तेमाल किया गया एक भी शामिल है)। – Domenic

संबंधित मुद्दे