您可以做的是实现一个瘦 RequireJS shim 以在缩小的构建中使用。取决于你想使用多少 RequireJS API,你可以用很少的东西来解决问题。为简单起见,您还可以使用命名模块。
比如说,在开发过程中,您使用 RequireJS 来加载您的模块。当您想要进行缩小构建时,您可以简单地在缩小文件中包含一个简单的加载程序。
如果您有文件 app.js、foo.js 和 bar.js,如下所示:
//from app.js
define("app", ["foo", "bar"], function(foo, bar) {
return {
run: function() { alert(foo + bar); }
}
});
//from foo.js
define("foo", [], function() {
return "Hello ";
});
//from bar.js
define("bar", [], function() {
return "World!";
});
假设您将所有这些文件一起缩小。在文件的顶部,您包含以下 shim:
//from your-require-shim.js
(function(exports) {
var modules = {};
var define = function(name, dependencies, func) {
modules[name] = {
name:name,
dependencies:dependencies,
func:func,
result:undefined
};
};
var require = function(name) {
var module = modules[name];
//if we have cached result -> return
if(module.result) { return module.result; }
var deps = [];
//resolve all dependencies
for(var i=0,len=module.dependencies.length;i<len;i++) {
var depName = module.dependencies[i];
var dep = modules[depName];
if(!dep.result) {
//resolve dependency
require(depName);
}
deps.push(dep.result);
}
module.result = module.func.apply(this, deps );
return module.result;
};
exports.require = require;
exports.define = define;
}(window));
并执行 app.js 中定义的模块
require("app").run();
就像在这个小提琴中一样。
当然,这是一个粗略的 PoC,但我相信你明白其中的意思。