2011-08-08 53 views
1

我使用modulr在瀏覽器中使用commonjs模塊。 目標是能夠在服務器環境中重用一些這些模塊。如何在瀏覽器和服務器上使用模塊重用commonjs模塊?

這些 「共享」 模塊需要做這樣的事情:

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

含義:

  • 如果_存在一個全局變量(瀏覽器環境下),用它
  • 其他負載「下劃線」模塊(服務器),並使用它代替

現在,由於模塊執行靜態ana在所有代碼中進行裂解,尋找require調用以生成最終的js文件,這將會使構建失敗。

有沒有辦法解決這個問題?

(例如,如果modulr支持像--ignore=<module_list>參數,一切都運行良好。)

回答

0

顯然沒有辦法在modulr來解決這個問題,所以我不得不創建一個名爲信封一個解決辦法模塊看起來像這樣:

// 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'); 

如果「共享」模塊在服務器上運行,正常需要函數被調用。 如果它正在瀏覽器中運行,則模塊將使用全局變量__應答。

相關問題