使用RequireJS和AMD分发包含内部依赖项的项目

时间:2013-03-27 17:37:26

标签: javascript requirejs amd

我有一个我创建的开源JavaScript表单验证库。最近,一位撰稿人帮助修改了我的库以支持AMD。在过去的一两个月里,我一直在重构我的库,以增强可维护性,模块化和可读性。基本上我已经将各种逻辑提取到自包含的模块中。但是,这些模块都位于主模块内。

在研究了AMD的工作原理之后,我觉得如果我能够将这些内部模块拆分成各自独立的文件,那将是有益的。我来自Java背景,从这个角度来看,这些单独的模块看起来像是我的课程,我想将它们分开。这也将帮助我更好地管理我的依赖关系,并强制执行适当的模块化。我认为从长远来看,这将使代码更好。

我知道RequireJS有一个“优化”功能,它将所有依赖项合并到一个文件中并将其最小化。

我的问题是:这个缩小的文件也会兼容AMD吗?也就是说,该文件是否会将自己暴露为AMD模块?项目本身具有的依赖项都是内部的,我不想单独公开它们。但是,我仍然希望开发人员能够将我的库作为一个独立的模块导入。

1 个答案:

答案 0 :(得分:1)

  

这个缩小的文件也会兼容AMD吗?也就是说,该文件   将自己暴露为AMD模块?

Require.js不需要生成AMD兼容模块。您必须使您的库与AMD兼容。它应该发生在您的main文件中。您可以从lowdash了解如何操作。他们创建了与Node和Require.js兼容的库。他们基本上寻找全局变量来检测Node和Require。

/** Detect free variable `exports` */
  var freeExports = typeof exports == 'object' && exports;

  /** Detect free variable `module` */
  var freeModule = typeof module == 'object' && module && module.exports == freeExports && module;

  /** Detect free variable `global` and use it as `window` */
  var freeGlobal = typeof global == 'object' && global;
  if (freeGlobal.global === freeGlobal) {
    window = freeGlobal;
  }

最后:

    // if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
    // Expose Lo-Dash to the global object even when an AMD loader is present in
    // case Lo-Dash was injected by a third-party script and not intended to be
    // loaded as a module. The global assignment can be reverted in the Lo-Dash
    // module via its `noConflict()` method.
    window._ = _;

    // define as an anonymous module so, through path mapping, it can be
    // referenced as the "underscore" module
    define(function() {
      return _;
    });
  }
  // check for `exports` after `define` in case a build optimizer adds an `exports` object
  else if (freeExports && !freeExports.nodeType) {
    // in Node.js or RingoJS v0.8.0+
    if (freeModule) {
      (freeModule.exports = _)._ = _;
    }
    // in Narwhal or RingoJS v0.7.0-
    else {
      freeExports._ = _;
    }
  }
  else {
    // in a browser or Rhino
    window._ = _;
  }