让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.env
或jsdom.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不能通过一个窗口作为参数,但是您可以轻松地通过向库中添加几行来绕开这个问题。
- 运行
npm install webfontloader
- 打开“node_modules / webfontloader / webfontloader.js”
- 将“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'] } }); });