2

簡単なrequireJSプラグインを作成しました。

ブラウザではうまく機能しますが、nodejsでは機能しません...プラグインはここから入手できます。

モジュールだけでなくプラグインになるための現在のコードは次のとおりです。

if (typeof define !== 'function')
    var define = require('amdefine')(module);

define(function (require, exports, module) {
    var _ = require("underscore"),
        Backbone = require("backbone");

    ...

    var plugin = {
        load:function (name, require, load, config) {
            var resources = this.parseResources(name);
            require(resources, function () {
                var localValidator = global.Validator.extend({});
                _.each(arguments, function (resource) {
                    localValidator.customize(resource);
                }, this);
                var local = _.extend({}, global, {
                    Validator:localValidator,
                    Model:global.Model.extend({
                        Validator:localValidator
                    }),
                    SyncModel:global.SyncModel.extend({
                        Validator:localValidator
                    })
                });
                load(local);
            });
        },
        parseResources:function (name) {
            if (name == "")
                return [];
            return name.split("+");
        }
    };

    var global = {
        version:"1.0.1",
        View:View,
        Aggregator:Aggregator,
        Messenger:Messenger,
        Model:AsyncModel,
        SyncModel:SyncModel,
        Validator:Validator,
        Runner:Runner,
        DependencyResolver:DependencyResolver,
        load:plugin.load.bind(plugin)
    };

    module.exports = global;

});

nodejs jasmineで呼び出して、動作するかどうかを単体テストしようとしましたが、ファイル名が見つからないことが表示されます。

if (typeof define !== 'function') { var define = require('amdefine')(module, require) }
require("./validation"); //works
require("./validation!./basicTests"); //does not work, but the plugin and path is ok...

スタック:

   Message:
     Error: Cannot find module './validation!./basicTests'
   Stacktrace:
     Error: Cannot find module './validation!./basicTests'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at null.<anonymous> (D:\creation\software developer\projects\dev\document root\src\validation.plugin.spec.js:9:17)
    at jasmine.Env.describe (D:\creation\software developer\libs\jasmine-node\lib\jasmine-node/jasmine-2.0.0.rc1.js:791:21)
    at describe (D:\creation\software developer\libs\jasmine-node\lib\jasmine-node/jasmine-2.0.0.rc1.js:575:27)
    at Object.<anonymous> (D:\creation\software developer\projects\dev\document root\src\validation.plugin.spec.js:7:1)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)

どういうわけかそれを動作させることは可能ですか?

編集:

いくつかの進歩を遂げました:

if (typeof define !== 'function')
    var define = require('amdefine')(module, require);

define(function (require, exports, module) {
    var _ = require("underscore"),
        Backbone = require("backbone"),
        global = require("./validation"),
        empty = require("./validation!"),
        local = require("./validation!../src/basicTests");

    describe("validation", function () {
        expect(global).not.toBe(undefined);
        expect(empty).not.toBe(undefined); //fail
        expect(local).not.toBe(undefined); //fail
    });
});

plugin.loadで、ローカルオブジェクトは問題ないようです。loadメソッドに渡しますが、requireでは届きません。少なくともdefineタグでは、commonJSではなくamdefinerequireを呼び出します...

edit2:

私はamdefineサイトでそれを見つけました:

ローダープラグインは、load()コールバックを同期的に呼び出す限りサポートされます。したがって、ネットワーク要求を行うものは機能しません。ただし、テキストなどのプラグインはテキストファイルをローカルにロードできます。

requireが非同期と呼ばれることを知りませんでした。

4

1 に答える 1

2

プラグインを変更して、amdefine同期とブラウザスクリプト非同期でrequireを呼び出すようにしました。

var amdefine = false;
if (typeof define !== 'function')
    var define = require('amdefine')(module, require),
        amdefine = true;

define(function (require, exports, module) {
    var _ = require("underscore"),
        Backbone = require("backbone");


    ...


    var plugin = {
        load:function (name, _require, load, config) {
            var resources = this.parseResources(name);
            var require = amdefine ? function (resources, callback) {
                var modules = [];
                _.each(resources, function (resource) {
                    modules.push(_require(resource));
                });
                callback.apply(null, modules);
            } : _require;
            require(resources, function () {
                var localValidator = global.Validator.extend({});
                _.each(arguments, function (resource) {
                    localValidator.customize(resource);
                }, this);
                var local = _.extend({}, global, {
                    Validator:localValidator,
                    Model:global.Model.extend({
                        Validator:localValidator
                    }),
                    SyncModel:global.SyncModel.extend({
                        Validator:localValidator
                    })
                });
                load(local);
            });
        },
        parseResources:function (name) {
            if (name == "")
                return [];
            return name.split(":");
        }
    };

    ...

});
于 2012-12-27T10:53:44.257 に答える