如何使用modulr在浏览器和服务器中重用commonjs模块?

时间:2011-08-08 18:10:52

标签: javascript commonjs

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

这些“共享”模块需要执行以下操作:

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

含义:

  • 如果_作为全局var(浏览器环境)存在,请使用它
  • else加载“下划线”模块(服务器),然后使用它来代替

现在,由于modulr在所有代码中进行静态分析,为了生成最终的js文件而寻找require调用,它将无法构建。

有办法解决这个问题吗?

(例如,如果modulr支持类似--ignore=<module_list>参数的内容,那么一切都会正常运行。)

1 个答案:

答案 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 _变量进行回答。