2011-10-19 32 views
14

Sử dụng jsdom.jsdom() trong express.js Tôi tạo một tài liệu với một số đánh dấu bố cục 'cơ sở' và đính kèm một vài thư viện phía máy khách như jQuery vào cửa sổ của nó.jsdom window caching

Sẽ thật tuyệt nếu chỉ phải thực hiện thiết lập này một lần.

Vấn đề là DOM của tài liệu của cửa sổ sẽ thay đổi tùy thuộc vào url được yêu cầu. Có cách nào cho mỗi yêu cầu để bắt đầu từ cùng một đối tượng cửa sổ được lưu trong bộ nhớ cache và tăng cường nó hay nó phải được thiết lập từ đầu trên mọi yêu cầu?

+0

Zombie.js, sử dụng jsdom trong nội bộ, có phương thức ngã ba. Nó được quảng cáo như một cách để giải quyết cùng một loại vấn đề như của bạn, tôi nghĩ, nhưng tôi không biết nó như thế nào. –

Trả lời

0

Tôi không nghĩ điều này là có thể. Khi bạn tạo một tài liệu mới bằng cách sử dụng trình xây dựng jsdom, bất kỳ tùy chọn tùy chỉnh nào bạn chỉ định sẽ chỉ ảnh hưởng đến tài liệu hiện đang được tạo. Mọi tài liệu bổ sung được tạo sau thời điểm này sẽ dựa vào các tính năng mặc định.

Tuy nhiên, bạn thực sự có thể sửa đổi các tính năng mặc định này - đó là những gì bạn đang theo dõi, tôi nghĩ vậy. Trước khi bạn tạo ra bất kỳ tài liệu, bạn có thể sửa đổi các giá trị mặc định cho tất cả các tài liệu trong tương lai:

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

Giải thích về mỗi tùy chọn có sẵn bằng cách đọc jsdom của README.

+1

Câu hỏi không phải là thay đổi các tính năng/tùy chọn của JSDOM. Đó là về nhân bản/bộ nhớ đệm đối tượng cửa sổ được tạo để tái sử dụng. – rkusa

+0

Cảm ơn câu trả lời Jamie, nhưng @ n26 là chính xác. – cjroebuck

1

Có vẻ như bạn muốn băm đối tượng JavaScript đơn giản?

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

Tôi nhớ rằng '" __proto __ "' vẫn là một vấn đề mặc dù – Esailija

+0

Trong các phiên bản V8 cũ hơn, vâng. Nhưng không phải trong tất cả các động cơ khác hoặc phiên bản V8 hiện tại (bao gồm cả phiên bản được sử dụng trong Chrome ổn định). – Domenic