使脚本与浏览器和节点(npm)
我有一个JavaScript库,基本上这是它是如何构造到目前为止:
var Ns = (function(){ var that = {}; // add stuff to 'that' return that; })(); //use Ns.foo() and Ns.bar()
现在的事情是,我想要和node
和npm
一样的lib。 到目前为止,这是我能想到的:
this.Ns = (function(){ //same as previous snippet })() //use Ns.foo() and Ns.bar()
问题是,虽然这在浏览器中工作,但在节点中,我需要这样做:
var Ns = require('ns').Ns
问题:我很想做var Ns = require('ns')
但为了做到这一点,我必须导出this.foo
和this.bar
,这将打破浏览器包含。 想法?
// create local scope. (function () { var myModule = ... // check for node module loader if (typeof module !== "undefined" && typeof require !== "undefined") { module.exports = myModule; } else { window["name"] = myModule; } })();
创build一个范围可能是最好的路线(所以你没有名称冲突的问题),但通过污染全球范围,更简单的方法来做到这一点,看起来像这样:
代替
var x = require('x');
写
var x = (typeof require !== "undefined") ? require('x') : window;
同样,在添加到出口之前,检查该对象是否存在:
if (typeof exports !== "undefined) exports.my_func = my_func;
但是,这样做的后果是,在浏览器版本中,所有东西都被转移到了全局范围内。 而且,它假定浏览器版本将必要的脚本加载到页面中。 容易得到小规模的工作……但我猜测它不会很好地扩展。