我正在使用modulr在浏览器中使用commonjs模块。 目标是能够在服务器环境中重用其中一些模块。
这些“共享”模块需要执行以下操作:
var _ = _ || require("underscore");
含义:
现在,由于modulr在所有代码中进行静态分析,为了生成最终的js文件而寻找require调用,它将无法构建。
有办法解决这个问题吗?
(例如,如果modulr支持类似--ignore=<module_list>
参数的内容,那么一切都会正常运行。)
答案 0 :(得分:0)
显然没有办法以modulr方式解决这个问题,所以我必须创建一个名为 Env 的变通方法模块,如下所示:
// Env.js
var my = {
modules: undefined,
require: require
};
exports.override = function(modules) {
my.modules = modules;
};
exports.require = function(path) {
if (my.modules && my.modules[path]) {
return my.modules[path];
} else {
// my.require(...) is needed instead of simply require(...)
// because simply require(...) will cause a modulr parsing failure
return my.require(path);
}
};
在客户端,有一个特定的初始化程序:
// ClientInitializer.js
Env = require('shared/Env');
Env.override({ underscore: _ });
因此,“共享”模块可以:
// SharedModule.js
var _ = require('shared/Env').require('underscore');
如果服务器中正在运行“共享”模块,则会调用正常的require函数。 如果它在浏览器中运行, Env 模块将使用global _变量进行回答。