2012-09-24 155 views
18

我创建了一个节点模块,它基本上只是一些有用的JS,也可以用于客户端。我知道require.js可以加载common.js组件,但我不一定要制定一个使用我的模块客户端的每个人都需要require或common.js或其他东西的任务。我也不想强迫他们删除文件底部的module.exports = ...。其他人如何解决这个问题?你只是创建2个版本,或2个“编译”版本? module.exports工作到处吗?module.exports客户端端

+2

关于这个问题我知道的最好的博览会是http://www.2ality.com/2011/11/module-gap.html。作者讨论了优势/劣势和开发/部署模式。 –

回答

16

这是underscore.js做:

if (typeof exports !== 'undefined') { 
    if (typeof module !== 'undefined' && module.exports) { 
    exports = module.exports = _; 
    } 
    exports._ = _; 
} else { 
    root['_'] = _; 
} 
+0

啊,这很酷! – Parris

+0

我不知道如何测试这部分代码来检查它是否成功导出。 – Jun

4

这对我(的CoffeeScript)工作。假设“命名空间”就是你要索赔的window范围内为客户

(module ? {}).exports = @Namespace = 
    my: 'cool' 
    module: '!' 

然后你就可以在浏览器中使用Node.js的require('namespace').my === 'cool'Namespace.my === 'cool'什么。这转化为JS作为

(typeof module !== "undefined" && module !== null ? module : {}).exports = this.Namespace = { 
    my: 'cool', 
    module: '!' 
}; 
1

我觉得这是简单的:

try { 
    module.exports = exports = MyModule; 
} catch (e) {} 

这个文件可以包含在浏览器和node.js中都