7

私はwebfontloaderをブラウザのコンテキスト内でうまく動作させています。特にwebfontloaderがnpmモジュールとして利用可能であるため、 node.js + jsdomコンテキストで動作させることができるかどうかを確認しようとしています。

適切な出力を提供するために node + jsdom が機能しているので、その部分が機能していることがわかります。しかし、webfontloader を統合して Web フォントを有効にしようとすると、動けなくなります。

基本的に、README に記載されている webfontloader モジュールを使用しています。

var WebFont = require('webfontloader');

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

しかし、できる限り試してみると、次のエラーが表示されます。

ReferenceError: ウィンドウが定義されていません

windowjsdom からオブジェクトを取得できます。

            // 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

多分私は私の素朴さを示し、不可能を求めています.

4

1 に答える 1

1

そうしない正当な理由がない限り、Google Hosted Libraries でホストされているバージョンを使用するか、自分でホストするかのいずれかで、またはを使用してwebfontloaderjsdomにロードすることをお勧めします。それを使用すると、次のようになります。jsdom.envjsdom.jsdomjsdom.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」の内容をオブジェクトをパラメータとする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.exportswebfontloader ライブラリがオブジェクトを置き換えるため、この方法でモジュールを複数回要求できるように、一時的に変数に格納し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']
        }
    });

});
于 2015-12-28T01:01:52.890 に答える