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

Using RequireJS and AMD to distribute a project that contains internal dependencies

本文关键字:依赖 内部 项目 布包含 RequireJS AMD 使用      更新时间:2023-09-26

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

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

我知道RequireJS有一个"优化"特性,它可以将所有的依赖组合到一个文件中,并将其最小化。

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

这个缩小的文件是否也与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._ = _;
  }