为AMD(requirejs)和Common.js(Node.js)以及全局范围定义具有依赖关系的模块

时间:2015-12-31 19:00:32

标签: node.js requirejs global amd commonjs

我正在尝试创建一个可以通过AMD,Common.js和全局范围访问的函数。我唯一需要注意的是,它有依赖性。 Require.js和全局范围似乎工作正常,但我无法在Node.js中加载依赖项。

(function(global, factory) {
  // Node.js
  if (typeof exports === 'object' && typeof module !== 'undefined') {
    moment = require('moment');
    return module.exports = factory();

  }
  // require.js
  else if (typeof define === 'function' && define.amd) {
    return define(['moment'], function(moment) {
      global.moment = moment;
      return factory();
    });
  }
  // global
  else {
    return global.formatDate = factory();
  }
})(this, function() {

  var formatDate = function(date, format) {
    if (typeof moment !== 'function' && !moment) {
      console.error('moment is required to format date')
      return date;
    }
   return moment(date).format(format);
  };

  return formatDate;
});

2 个答案:

答案 0 :(得分:1)

不要将依赖项公开为全局变量,而是将它们作为参数传递给工厂。

例如:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        define([ 'module', 'moment' ], function (module, moment) {
            module.exports = factory(moment);
        });
    } else if (typeof module === 'object') {
        module.exports = factory(require('moment'));
    } else {
        root.formatDate = factory(root.moment);
    }
}(this, function (moment) {

}));

https://github.com/umdjs/umd

查看通用模块定义(UMD)配方

答案 1 :(得分:0)

如果有人感兴趣的话,我的结果是:

(function(root, factory) {

  // AMD (require.js)
  if (typeof define === 'function' && define.amd) {
    return define(['moment'], factory);

  // CommonJS (Node.js)
  } else if (typeof module === 'object' && module.exports) {
    return module.exports = factory(require('moment'));

  // Browser Globals
  } else {
    return root.formatDate = factory(root.moment);
  }

})(this, function(moment) {

  var formatDate = function(date, format) {
    return date.format(format);
  };

  return formatDate;
});

我引用了@Ates Goral提到的通用模块定义returnExports