让webfontloader与node.js和jsdom一起工作

我有webfontloader在浏览器上下文中很好地工作。 现在我试图看看是否可以在node.js + jsdom上下文中工作,特别是因为webfontloader可用作npm模块 。

我有node + jsdom工作提供合理的输出,所以我知道这部分工作。 但是,当我尝试整合webfontloader,以启用网页字体,我来解体。

基本上我使用的是自述文件中的webfontloader模块,它是:

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

但是,尽可能地尝试,我得到以下错误:

ReferenceError:窗口没有定义

我可以从jsdom获得一个window对象:

  // 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使用?

也许我正在performance出我的天真,并问不可能。

除非你有充分的理由不这样做,我宁愿推荐你使用jsdom.envjsdom.jsdom将webfontloader加载到jsdom.jsdom ,或者使用托pipe在Google jsdom.jsdom的版本或者自己托pipe它。 使用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'] } }); } ); 

如果您确实需要从nodejs上下文中需要webfontloader,据我所知可以告诉webfontloader不能通过一个窗口作为参数,但是您可以轻松地通过向库中添加几行来绕开这个问题。

  1. 运行npm install webfontloader
  2. 打开“node_modules / webfontloader / webfontloader.js”
  3. 将“webfontloader.js”的内容包含在一个以window对象作为参数的module.exports函数中。

该文件可能看起来类似于(不粘贴整个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存储在variables中,以确保我们可以多次以这种方式要求模块,因为webfontloader库将replacemodule.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'] } }); });