簡単な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が非同期と呼ばれることを知りませんでした。