0

我有一个我创建的开源 JavaScript 表单验证库。最近,一位贡献者帮助修改了我的库以支持 AMD。在过去的一两个月里,我一直在重构我的库以增强可维护性、模块化和可读性。本质上,我已将逻辑片段提取到独立的模块中。但是,这些模块都位于主模块内。

在看了 AMD 是怎么做的之后,我觉得如果我能够将这些内部模块拆分到它们自己的单独文件中,那将是有益的。我来自 Java 背景,从这个角度来看,这些单独的模块对我来说就像是类,我想将它们分开。这也将帮助我更好地管理我的依赖关系并实施适当的模块化。我认为从长远来看,这将使代码变得更好。

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

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

4

1 回答 1

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._ = _;
  }
于 2013-03-27T17:50:57.573 回答