试图使一个JavaScript文件在node.js文件和浏览器中都可用

试图使一个JavaScript文件在node.js文件和浏览器中都可用,javascript,node.js,browserify,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);

我有一个相对简单的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');
但是,当然浏览器代码不能再使用它了,这是一个错误。在寻找解决方案时,我发现了一个解决方案,但我似乎无法使其正常工作。即使在执行建议的教程时,也会不断返回一个空文件,猜测这与我使用的系统设置有关,只是不确定是什么,而且似乎比我需要的更复杂。无论如何,我不想浏览整个浏览器JavaScript代码,但是不能浏览foo.js,必须创建一个需要foo.js的新js文件并使用它,然后浏览,有效地添加一个以前不需要的中间人


我想通过node.js和浏览器访问的代码相对简单,有没有简单的方法?只需编写两次代码并不是一个解决方案,这是一个简单的代码,但我只需要编辑一次代码,就可以将更改传播到两个位置。

Welp,您可以做的一件事是只分配“module”的属性(如果存在)。希望没有其他JavaScript将其作为全局变量引入到您的浏览器环境中

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

请注意,这是全局对象。

可能最好使用专门的数据包,如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;
  }
}

从那以后已经过了一段时间,更好的方法可能已经发展起来了,但它又小又简单,对我来说很有用。

可能是一个输入错误modeule.exports而不是module.exports只是文章中的一个输入错误,而不是实际的代码中的一个输入错误。好吧,我看到第一个if基本上是检查是否是node.js运行它。那么else是用于浏览器的,但是else语句中嵌套的if/else检查的是什么呢?包括模块的方法过去有很多,现在仍然有很多,define的内容与AMD和window.myModule有关。myModule是纯浏览器。有一个非常广泛的解释可能有助于理解。似乎不太有效,如果我将当前模块中的所有内容都放在模块内。将括号导出到myModule括号中,我会在包含的函数的括号中得到一个意外的标记错误-init_foo:function您必须返回函数,查看我编辑的postOk,这很有帮助。我现在可以从node.js调用中使用它了。不喜欢从浏览器中调用它,但在从另一个JS文件调用它时得到“init_foo未定义”,但希望这对我来说不会太难理解。谢谢