Окно кэширования JSDOM - PullRequest
       9

Окно кэширования JSDOM

14 голосов
/ 20 октября 2011

Используя jsdom.jsdom () в express.js, я создаю документ с некоторой «базовой» разметкой макета и присоединяю к его окну несколько библиотек на стороне клиента, таких как jQuery.

Было бы неплохо выполнить эту настройку только один раз.

Проблема в том, что DOM документа окна будет меняться в зависимости от запрошенного URL. Есть ли способ для каждого запроса запускаться с одного и того же объекта кэшированного окна и улучшать его, или он должен быть настроен с нуля для каждого запроса?

Ответы [ 2 ]

1 голос
/ 10 сентября 2013

Похоже, вы хотите простой хеш объекта 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 голосов
/ 10 апреля 2012

Я не думаю, что это возможно. Когда вы создаете новый документ с помощью компоновщика jsdom, любые пользовательские параметры, указанные вами , будут влиять только на документ, который в данный момент создается . Любые дополнительные документы, созданные после этой точки, будут использовать функции по умолчанию.

Однако вы можете изменить эти функции по умолчанию - я думаю, это то, что вам нужно. Прежде чем создавать какие-либо документы, вы можете изменить эти значения по умолчанию для всех будущих документов:

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

Объяснение каждой опции доступно, прочитав jsdom's README .

...