0

私が作成したオープンソースの JavaScript フォーム検証ライブラリがあります。最近、寄稿者が私のライブラリを AMD をサポートするように変更してくれました。この 1 か月か 2 か月の間、私は自分のライブラリをリファクタリングして、保守性、モジュール性、および読みやすさを向上させてきました。基本的に、ロジックの断片を自己完結型のモジュールに抽出しました。ただし、これらのモジュールはすべてメイン モジュール内にあります。

AMDがどのように物事を行うかを見た後、これらの内部モジュールを独自の個別のファイルに分割できれば有益であると感じています. 私は Java のバックグラウンドを持っており、その観点からすると、これらの個々のモジュールはクラスのように見え、それらを分離したいと考えています。これは、依存関係をより適切に管理し、適切なモジュール性を強化するのにも役立ちます。長期的には、これによりコードがはるかに優れたものになると思います。

RequireJS には、すべての依存関係を 1 つのファイルにまとめて最小化する「最適化」機能があることを知っています。

私の質問はこれです: この縮小されたファイルも AMD と互換性がありますか? つまり、ファイルはそれ自体を AMD モジュールとして公開しますか? プロジェクト自体が持つ依存関係はすべて内部的なものであり、個別に公開したくありません。ただし、開発者が私のライブラリを自己完結型モジュールとしてインポートできるようにしたいと考えています。

4

1 に答える 1

1

この縮小されたファイルも AMD と互換性がありますか? つまり、ファイルはそれ自体を AMD モジュールとして公開しますか?

Require.js は AMD 互換モジュールを生成する必要はありません。ライブラリを AMD 互換にする必要があります。mainファイルで発生するはずです。やり方はローダッシュから学べます。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 に答える