【问题标题】:Make a script work nice with the browser and node (npm)使脚本与浏览器和节点(npm)一起工作
【发布时间】:2013-05-02 08:20:18
【问题描述】:

我有一个 javascript 库,基本上到目前为止它的结构是这样的:

var Ns = (function(){
  var that = {};

  // add stuff to 'that'

  return that;
})();

//use Ns.foo() and Ns.bar()

问题是现在,我希望 nodenpm 可以使用相同的库。到目前为止,这是我能想到的:

this.Ns = (function(){ //same as previous snippet })()

//use Ns.foo() and Ns.bar()

问题是,虽然这在浏览器中有效,但在节点中我需要这样做:

var Ns = require('ns').Ns

问题:我希望能够做到var Ns = require('ns'),但为了做到这一点,我必须导出this.foothis.bar,这将破坏浏览器的包含。想法?

【问题讨论】:

    标签: node.js package npm


    【解决方案1】:
    // 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;
      }
    
    })();
    

    【讨论】:

      【解决方案2】:

      创建一个范围可能是最好的方法(因此您不会遇到名称冲突问题),但更简单的方法是污染全局范围,如下所示:

      而不是

      var x = require('x');
      

      var x = (typeof require !== "undefined") ? require('x') : window;
      

      同样,在添加到导出之前,检查该对象是否存在:

      if (typeof exports !== "undefined)
        exports.my_func = my_func;
      

      但是,这样做的后果是,在浏览器版本中,所有内容都被转储到全局范围内。此外,它假定浏览器版本将必要的脚本加载到页面中。很容易在小规模上工作......但我猜它不会很好地扩展。

      【讨论】:

        猜你喜欢
        • 2019-04-28
        • 1970-01-01
        • 2021-05-24
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 2016-11-01
        相关资源
        最近更新 更多