在这里回答我自己的问题。经过了很长一段时间,我看不到任何方式来加载Requirejs代码或加载后立即调用模块。所以我最终写了一些代码来暂时覆盖require
和declare
方法。它适用于我的用例,但如果其他人需要它可能需要更改。我相信它可以比现在更优化,但它可以工作。
你可以找到代码on GitHub,我会尽量保持。
此时的代码如下所示:
(function() {
var self = {},
originalDefine = window.define,
originalRequire = window.require,
modules = [];
var define = function (id, deps, fn) {
if (id !== 'requireLib' && id !== 'text') {
modules.push({"id": id, "deps": deps, "fn": fn});
}
};
var require = function (deps, fn) {
var sortedModules = [],
unsortedModules = [],
resolvedDeps = {},
maxAttempts = 1000,
module,
dep,
depList,
canAdd,
i,
j;
unsortedModules = ([]).concat(modules);
while (unsortedModules.length > 0 && --maxAttempts > 0) {
for (i = unsortedModules.length - 1; i >= 0; i--) {
canAdd = true;
module = unsortedModules[i];
for (j = 0; j < module.deps.length; j++) {
dep = module.deps[j];
if (resolvedDeps[dep] === undefined) {
canAdd = false;
break;
}
}
if (canAdd) {
resolvedDeps[module.id] = module;
sortedModules.push(unsortedModules.splice(i,1)[0]);
}
}
}
for (i = 0; i < sortedModules.length; i++) {
module = sortedModules[i];
depList = [];
for (j = 0; j < module.deps.length; j++) {
depList.push(resolvedDeps[module.deps[j]]);
}
resolvedDeps[module.id] = module.fn.apply(this, depList);
}
depList = [];
for (i = 0; i < deps.length; i++) {
depList.push(resolvedDeps[deps[i]]);
}
fn.apply(this, depList);
window.define = originalDefine || function() {};
window.require = originalRequire || function() {};
};
window.define = define;
window.require = require;
window.require.config = function() {};
return self;
}());
太糟糕了,它不能按预期同步工作:http://plnkr.co/edit/ErIS1MCgS9vcxEnw9AKt?p=preview –
要求使用AMD语法来加载模块,而不是Common.js语法。有关使用信息,请参阅[文档](http://requirejs.org/docs/api.html)。除非你正在使用AMD项目,否则我不建议开始使用它:common.js几乎赢得了模块大战。 – Andrew
你知道任何可以使用commonjs加载模块的库,但是(!)是同步的吗? –