试图让一个 JavaScript 文件既可以被 node.js 文件使用,也可以在浏览器中使用

Trying to get one JavaScript file to be usable both by a node.js file and in a browser

我有一个相对简单的 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 和浏览器访问的代码相对简单,有没有简单的方法可以做到这一点? (只写两次代码不是解决方案,它是简单的代码,但我想只需要编辑一次就可以将更改传播到两个位置)。

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

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

注意this里面是全局对象。

最好使用像 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;
  }
}

从那以后已经过去了一段时间,可能会出现更好的方法,但它又小又简单,对我有用。