1

きちんとラップされた JS ライブラリがあるとします。define('myModule', function(myModule) { return myModule.someObject; });

myModule.someObjectrequirejs やその他のモジュール処理フレームワークを使用せずに、グローバル スコープにバインドするにはどうすればよいですか (理由は聞かないでください。モジュラー プログラミングには、グローバル スコープに何かを配置するよりも多くの利点があります)。

問題は、開発中にrequirejsを使いたいということです。私たちが構築するライブラリは、requirejs (AMD、CommonJS など) を使用する人が含めることができる必要がありますが、window.SomeObjectrequire を使用したくない人でも、私たちのライブラリを使用できるようにするためだけに使用できるようにする必要があります。SomeObject. 開発段階の後、すべてのコードは縮小され、1 つの JS ファイルに難読化されます。

私が見つけることができるのは、requirejsフレンドリーdefine関数にラップされていないコードを含める方法という質問に対する答えだけなので、間違った検索用語でグーグル検索しているだけだと思います。

これに関するアイデアは大歓迎です。ありがとう!

- - 編集 - -

私のファイル(すべてが始まる前)は次のようになりました:

(function(define, global) {
  define([a,b,c],function(theA, theB, theC) {
    return theA + theB + theC; // or something, it doesn't matter
  });
})(define, this);

私はこのようなことを考えています:

(function(define, global) {
  // same as above
})(typeof define === 'function' 
      ? define 
      : function(factory /* need more args? */) { /* solution here */ }, this);

しかし、それを適切に実装する方法がわかりません...

4

3 に答える 3

2

requirejs なしでアクセスできるように、モジュールをラップする必要があると思います。

if ( typeof define === "function" && define.amd ) {
    define( "mymodule", [], function () { 
      // do your logic
      return mystuff; 
    } );
} else {
   // do your logic
   window.mystuff = mystuff;
}

例としてjQueryを見てください。

于 2013-08-13T14:59:40.277 に答える
2

できればモジュールに id を与えることは控えたいと思います。移植性が低下します。jQuery は、パス オプションを設定しなければならないという非常に煩わしいものですがjquery、互換性の理由からそうしました。可能であれば、常に匿名モジュールを優先してください。

jQueryソースから

// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.

James Burke がここでももう少し詳しく説明しています

代わりに、 umdjs リポジトリのより一般的な例を使用します。

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['b'], factory);
    } else {
        // Browser globals
        root.amdWeb = factory(root.b);
    }
}(this, function (b) {
    //use b in some fashion.

    // Just return a value to define the module export.
    // This example returns an object, but the module
    // can return a function as the exported value.
    return {};
}));

CommonJS もサポートする別の例については、reqwest ライブラリを確認してください。

!function (name, context, definition) {
  if (typeof module != 'undefined' && module.exports) module.exports = definition()
  else if (typeof define == 'function' && define.amd) define(definition)
  else context[name] = definition()
}('reqwest', this, function () {

    return {};

});
于 2013-08-13T16:20:43.720 に答える