试图让一个JavaScript文件可以由node.js文件和浏览器使用

时间:2015-10-16 19:42:13

标签: javascript node.js browserify

我有一个相对简单的JavaScript文件(称之为foo.js),它有3个函数,由浏览器中的第二个JS文件调用。在foo.js中还有一些其他函数,但它们仅在内部使用。

现在foo.js也需要能够在node.js中运行的JS文件使用。同样的事情,只需要访问三个基本功能。

所以我在这三个函数周围添加了module.exports,如下所示:

module.exports = {
    init_foo: function (bar){
        return JSON.parse(bar);
    },
    export_foo: function (foobar){
        return JSON.stringify(foobar);
    },
    switch_foo: function (boofar){
        switch(boofar)
        {
            case 'A':
                return 1;
            case 'B':
                return 2;
            default:
                return 3;
        }
    }
};

所以现在我的node.js文件可以使用

获取代码
var foo = require('./foo.js');

但当然浏览器代码不能再使用它,会出错。在寻找解决方案时,我找到browserify,但我似乎无法让它工作(即使在做了建议的教程时仍然会返回一个空文件,猜测它与该集合有关)我正在使用的系统,只是不确定是什么),似乎它比我需要的更复杂(不想浏览整个浏览器JavaScript代码,但不能浏览器化foo.js,必须制作一个需要foo.js的新JS文件并使用它然后浏览它,有效地添加一个以前不需要的中间人。)

看看我想用node.js和浏览器访问的代码是如何相对简单的,有一个简单的方法吗? (只是编写代码两次不是解决方案,它只是简单的代码,但我只想编辑一次,以便将更改传播到两个位置)。

2 个答案:

答案 0 :(得分:1)

使用像browserify这样的专用数据包可能是最好的,但对于像你这样的小东西,以下可能更适合。 (我在我的primesieve模块中使用它)

var myModule = (function() {
  return {
    init_foo: function (bar){
      return JSON.parse(bar);
    },
    export_foo: function (foobar){
      return JSON.stringify(foobar);
    },
    switch_foo: function (boofar){
      switch(boofar)
      {
        case 'A':
            return 1;
        case 'B':
            return 2;
        default:
            return 3;
      }
    }
  };
})();

if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  module.exports = myModule;
} else {
  if (typeof define === 'function' && define.amd) {
    define([], function() {
        return myModule;
    });
  } else {
    window.myModule = myModule;
  }
}

已经过了一段时间,可能已经有了更好的方法,但它很小而且很简单,对我有用。

答案 1 :(得分:-1)

Welp,你能做的一件事就是只分配'module'的属性(如果存在)。并希望没有其他JavaScript将其作为全局变量引入您的浏览器环境。

(function() {
  var exports
  ...
  if (this.hasOwnProperty('module'))
    module.exports = exports
})()

请注意,this有全局对象。