1

我正在使用modulr在浏览器中使用 commonjs 模块。目标是能够在服务器环境中重用其中一些模块。

这些“共享”模块需要做这样的事情:

var _ = _ || require("underscore");

意义:

  • 如果 _ 作为全局变量(浏览器环境)存在,则使用它
  • 否则加载“下划线”模块(服务器),并改用它

现在,由于 modulr 对所有代码进行静态分析,寻找 require 调用以生成最终的 js 文件,它会导致构建失败。

有没有办法解决这个问题?

(例如,如果 modulr 支持--ignore=<module_list>参数之类的东西,一切都会运行良好。)

4

1 回答 1

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模块将使用全局 _ 变量来回答。

于 2011-08-09T10:29:48.520 回答