0

カール0.7.3

ここからAMD/CommonJSアダプターコードを入手しました: CommonJSとAMDの両方をサポートしています

(function (name, definition) {
      if (typeof module != 'undefined') {
        module.exports = definition();
      }
      else if (typeof define == 'function' && typeof define.amd == 'object') {
        define(name, [], definition);
      }
      else {
        this[name] = definition();
      }
    }('modXyz', {
          sayHi:function (name) {
            console.log('Hi ' + name + '!');
          }
        }
    ));

そのコードをCurlで使用して、すべてのコードをAMD/CommonJSと互換性のあるものにしたいと思います。私ができると期待していたのはこれでした:

greeter = curl(['modXyz']); 
greeter.sayHi("Gracie"); 

しかし、curl返されるオブジェクトは、私が期待しているオブジェクトではありません。私が得ることができる最も近いものはこれです:

curl(['modXyz'], function(mod) { window.greeter = mod; }); 
greeter.sayHi("Gracie");

これはAMDの目的を打ち負かすようです。curlはこのようなことを行うことができますか?それを実現するにはrequire.jsを使用する必要がありますか?

4

3 に答える 3

1

CurlJSとRequireJSはどちらもAMDをサポートし、CommonJSは呼び出しパターンを必要とします。

CJSとAMDの違いは、依存関係のリストのラッパーとして配列を使用することです。また、CurlJSの構成で、コードをAMD仕様と完全に互換性のあるものにするためにエイリアスcurlを設定できることにも注意してください。require観察:

CJSには呼び出しパターンが必要です。

var a = require('name')

CurlJS AMDのみが呼び出しパターンを必要とします:

var promise = require(['name'])
promise.then(callbackFunction)

これは通常、次のように短縮できます。

require(['name']).then(callbackFunction)

CurlJSがPromiseオブジェクトを返すことは、AMD仕様の一部ではないことに注意してください。AMDの仕様では、AMDスタイルのrequirecallの戻り値は規定されていないようです。

RequireJSとCurlJSの両方が標準のAMDをサポートし、呼び出しパターンが必要です。

require(['name'], callbackFunction)

繰り返しになりますが、これがAMDスタイルに必要なフラグとしての配列の使用に注意してください。これにより、戻り値に対して異なるロジックがトリガーされます。

CurlJSでコードを希望どおりに機能させるには、コードがCommonJSモジュールであるかのようにラップされたモジュール内にある必要があります。次を使用します。

define(function(require) { ... });

その場合、requireあなたはCommonJSスタイルのように振る舞うと言われていますrequire-同期。実際には、舞台裏で行われるのは、ローダーがファクトリー関数をスキャンして必要なものを探し、それらをその定義の要件のリストに折りたたむことです。次に、工場内で次のことができます。

var greeter = require('modXyz'); 
greeter.sayHi("Gracie");

検出された必要なリソースがプリロードされることが実際に発生するため、「同期」動作は依然として幻想であることに注意してください。

RequireJSでは、グローバルでもrequireCJSスタイルと呼ぶことができます。ただし、以前にロードしたvar resource = require('resource/path')でのみです。

つまり、ファクトリ関数が実行される前に、ロードは常にCurlJSとRequireJSの両方で非同期で行われますが、RequireJSではほとんどどこでも使用できますが、CurlJSでは非常にニッチなシナリオです。

于 2013-02-14T07:33:56.203 に答える
1

ブラウザはリソースから離れているため、それらのリソースをフェッチしている間はメインスレッドをブロックするか、非同期でフェッチする必要があります。メインスレッドをブロックしてはいけないので(事実上ブラウザを応答しなくする)、リソースを非同期にフェッチする必要があります。(AMDローダー、RequireJS、dojoなどでも同じです)

したがって、次のようなものは機能しません。

var foo = require('lib/foo');

まあ、それはあなたがブラウザで慣れているかもしれない通常のグローバルな空間では機能しません。ただし、AMDモジュール内などの制御された環境では機能します

ステップ1:モジュール内にコードを記述します。

ステップ2:アプリを起動するためのブートストラップモジュールを作成します。

<script src="lib/curl/src/curl.js"><script>
<script src="myapp/run.js"><script>

run.jsの内部:

// curl 0.7.x requires a named module here ('myapp/run')
define('myapp/run', ['curl'], function (curl) {
    curl.config(
        baseUrl: '',
        packages: [ /* configure your 3rd-party packages */ ],
        paths: { /* configure any non-package 3rd-party libs here */ },
        preloads: [ /* put modules that *must* be loaded first here (e.g. shims) */ ],
        main: 'myapp/main'
    });
});

「myapp/main」は次のようになります。

define(function (require) {
    var view1 = require('myapp/view1/controller');
    view1.render();
    view1.placeAt('body');
});

メインモジュール(または任意のAMDモジュール)内では、requireあなたが期待しているように動作します。これは特別なAMD署名であることに注意してください。で依存関係を指定して、がこのように動作することdefineを期待することはできません。require依存関係は1つの方法でのみ指定する必要があります。これは機能しません:

define(['myapp/view1'], function (view1) {
    var foo = require('foo');
});

お役に立てれば。

-ジョン

于 2013-02-20T16:20:24.580 に答える
0

curl関数は非同期であり、promiseを返します。したがって、curlに渡すコールバックとして、またはその時点で渡すコールバック(promiseが実行されると呼び出される)のいずれかとしてのみ結果を取得できます。

curl(['dep1', 'dep2', 'dep3' /* etc */], callback);

また

curl(['dep1', 'dep2', 'dep3' /* etc */])
    .then(callback, errorback);
于 2013-02-14T00:50:54.063 に答える