2015-12-22 3 views
7

У меня есть webfontloader, прекрасно работающий в контексте браузера. Теперь я пытаюсь понять, могу ли я заставить его работать в контексте node.js + jsdom, особенно потому, что webfontloader доступен как npm module.Получение webfontloader для работы с node.js и jsdom

У меня есть узел + jsdom для обеспечения разумного вывода, поэтому я знаю, что эта часть работает. Но когда я пытаюсь интегрировать webfontloader, чтобы включить веб-шрифты, я отключаюсь.

В основном я использую модуль webfontloader как описано в README, который:

var WebFont = require('webfontloader'); 

WebFont.load({ 
    google: { 
    families: ['Droid Sans', 'Droid Serif'] 
    } 
}); 

Но попробуйте, как я могу, я получаю следующее сообщение об ошибке:

ReferenceError: window is not defined

я могу получить window объект от jsdom:

  // Get the document and window 
      var doc = jsdom.jsdom('<!doctype html><html><body><div id="container"></div></body></html>'), 
       win = doc.defaultView; 

Но как пройти win в webfontloader для использования как window в этом контексте?

Возможно, я показываю свою наивность и прошу невозможного.

+0

вы пробовали загрузку WebFont в jsdom.env (....) контекст? –

+0

Вы попробовали ответ ниже? – cviejo

+0

Пока нет. Извините, еще не было шанса. Однако это выглядит вполне правдоподобно, и я действительно с нетерпением жду, чтобы он пошел. Спасибо за подробный ответ. – drmrbrewer

ответ

1

Если у вас есть уважительная причина не делать этого, я предпочел бы рекомендовать вам загрузку webfontloader в jsdom с jsdom.env или jsdom.jsdom, либо с помощью version, размещенного на Google Hosted библиотеки или хостинг это самостоятельно. Использование jsdom.env это будет выглядеть следующим образом:

var jsdom = require("jsdom"); 

jsdom.env( 
    '<!doctype html><html><body></body></html>', 
    ['https://ajax.googleapis.com/ajax/libs/webfont/1.5.18/webfont.js'], 
    function(err, win) { 

     var WebFont = win.WebFont; 

     WebFont.load({ 
      google: { 
       families: ['Droid Sans', 'Droid Serif'] 
      } 
     }); 
    } 
); 

Если вам действительно нужно требовать webfontloader от nodejs контекста, насколько я могу сказать webfontloader не может быть передано окно в качестве параметра, но вы можете обойти это легко добавив пару строк в библиотеку.

  1. Запуск npm install webfontloader
  2. Открыть "node_modules/webfontloader/webfontloader.js"
  3. Enclose содержание "webfontloader.js" в module.exports функции, которая принимает window объект в качестве параметра.

Файл может выглядеть примерно так (не вставляя весь источник библиотеки webfontloader):

module.exports = function(window){ 

    var exportsBackup = module.exports; 

    /* Web Font Loader v1.6.16 - (c) Adobe Systems, Google. License: Apache 2.0 */ 
    (function(){function aa(a,b,c){r ... 

    var loaderObject = module.exports; 
    module.exports = exportsBackup; 

    return loaderObject; 
}; 

Я временно хранить module.exports в переменной, чтобы гарантировать, что мы можем требовать модуль таким образом несколько раз , так как библиотека webfontloader заменит объект module.exports.

Вы можете потребовать библиотеки, как это без каких-либо ошибок:

var jsdom = require("jsdom"); 

jsdom.env("https://nodejs.org/", [], function(err, win) { 

    var WebFont = require('webfontloader')(win); 

    WebFont.load({ 
     google: { 
      families: ['Droid Sans', 'Droid Serif'] 
     } 
    }); 

}); 
+0

Использование хитрого предложения по редактированию 'webfontloader.js', чтобы включить передачу 'window' в качестве параметра, теперь я могу дойти до фактического вызова функции' WebFont.load() 'без ошибки Reference. Но теперь я получаю точно такую ​​же проблему, как описано здесь: http://stackoverflow.com/q/34163339/4070848 - другими словами, попытка загрузки webfont всегда достигает ветки 'inactive' и никогда не загружается успешно , Вы можете загрузить webfont с помощью 'jsdom'? И я попробовал передать пользовательский 'userAgent' в' jsdom', чтобы попробовать и обмануть webfontloader, но безрезультатно. – drmrbrewer

+0

Хорошо, я рассмотрю. Но сначала, с новым годом! – cviejo

+0

С Новым годом (почти!), А также ... некоторые в новом году, другие не совсем! – drmrbrewer

Смежные вопросы