2011-10-19 11 views
14

express.jsでjsdom.jsdom()を使用する私はいくつかの '基本'レイアウトマークアップを持つドキュメントを作成し、そのウィンドウにjQueryなどのクライアントサイドライブラリをいくつか添付します。jsdom windowキャッシング

この設定を1回行うだけでいいです。

問題は、ウィンドウのドキュメントのDOMが要求されたURLによって変化することです。各リクエストが同じキャッシュされたウィンドウオブジェクトから開始して強化する方法はありますか、それともすべての要求に対してゼロからセットアップする必要がありますか?

+0

jsdomを内部的に使用するZombie.jsには、forkメソッドがあります。それはあなたと同じ種類の問題を解決する手段として広告されていると私は思うが、それがどういうものか分からない。 –

答えて

0

私はこれが可能ではないと思います。 jsdom Builderを使用して新しい文書を作成すると、というカスタムオプションは、現在作成されている文書にのみ影響します。この時点以降に作成された追加のドキュメントは、デフォルトの機能に依存します。

しかし、実際にはこれらのデフォルト機能を変更することができます。これはあなたの後ろのものです。あなたが任意の文書を作成する前に、将来のすべての文書のためのこれらのデフォルトを変更できます。

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

各オプションの説明は、jsdomのREADMEを読むことによって提供されています。

+1

問題は、JSDOMの機能/オプションを変更することではありません。作成したウィンドウオブジェクトを再利用するためにクローン作成/キャッシュすることです。 – rkusa

+0

答えJamieに感謝しますが、@ 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