【问题标题】:How to reuse commonjs modules in the browser and server using modulr?如何使用 modulr 在浏览器和服务器中重用 commonjs 模块?
【发布时间】:2011-08-08 18:10:51
【问题描述】:

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

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

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

意思:

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

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

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

(例如,如果 modulr 支持 --ignore=<module_list> 参数,一切都会正常运行。)

【问题讨论】:

    标签: javascript commonjs


    【解决方案1】:

    显然没有办法在 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-11-26
      • 2016-07-27
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2011-07-12
      • 2017-02-23
      • 2021-09-09
      • 2016-10-10
      相关资源
      最近更新 更多