1

ブラウザで commonjs モジュールを使用するために modulr を使用しています目標は、これらのモジュールの一部をサーバー環境でも再利用できるようにすることです。

これらの「共有」モジュールは、次のようにする必要があります。

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

意味:

  • _ がグローバル var (ブラウザ環境) として存在する場合は、それを使用します
  • それ以外の場合は、「アンダースコア」モジュール (サーバー) をロードし、代わりにそれを使用します

ここで、modulr はすべてのコードで静的分析を行い、最終的な 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モジュールは global _ 変数で応答します。

于 2011-08-09T10:29:48.520 に答える