13

重複の可能性:
AMD (require.js) の使用中に Backbone.js でブートストラップされたモデルを読み込む方法

私は現在、私たちのプロジェクトの 1 つに RESTful API を作成しており、それにアクセスするための Javascript ライブラリも提供したいと考えていました。

私は AMD の原理が好きで、require.js を使用しているので、AMD モジュールも提供します。問題は、モジュールの初期化には、初期化時の API キーなどの情報が必要になることです。

初期化時にそのようなパラメーターをモジュールに渡すにはどうすればよいですか?

4

5 に答える 5

14

次のようなものがある場合:

define(['dep1', 'dep2', 'dep3'], function (dep1, dep2, dep3) {

    var module = {
        ...
    };

    return module;

});

次のように変更します。

define(['dep1', 'dep2', 'dep3'], function (dep1, dep2, dep3) {
    var module = {
        ...
    };

    var init = function (options) {
        // Initialize here
        return module;

    };

    return init;
});

次に、モジュールをどこかで要求した後、それを呼び出して初期化できます。より複雑なものが必要な場合は、ファクトリ パターンを調べて、ファクトリを返すこともできます。

require.js は、返される内容を制限しません。単純なオブジェクト、文字列、関数...

于 2012-04-25T19:11:23.927 に答える
6

あなたが探しているのは、モジュールによって取得される構成変数を設定する機能だと思います。これはrequire.jsを使用した例です

AMD (require.js) の使用中に Backbone.js でブートストラップされたモデルをロードする方法

于 2012-04-25T18:32:21.327 に答える
4

私の頭に浮かんだもう 1 つの可能性は、サーバーサイド スクリプトを使用して、要求時にモジュールのソースを操作することです。

たとえば、API キーをモジュールに渡す必要がある場合は、次のようにします。

最初の define() 呼び出しを行う前に、次のコードを追加します。

require.config({
    paths: {
        api: 'https://api.example.com/api.amd.js?api_key=f615ac61&'
    }
});

これにより、次のようにどこからでも API を簡単に要求できます。

require(['api'], function(api){

});

したがって、サーバーはリクエストを受信します - mod_rewrite を介してスクリプトにマッピングし、GET パラメータを取得してモジュール ソースコードの正しい場所に配置し、カスタム ソースを返します。

これが私が今までに解決した方法であり、開発者の動作を変更する必要なく、requirejs に既に組み込まれている機能を利用して、魅力的に機能します。

于 2012-04-26T07:30:11.797 に答える
1

require.js ではできないと思いますが、Frame.jsやその他のモジュール ライブラリではできます。フレームでは、次のようにします。

//moduleName.js

(function(exports){
    exports.moduleName = function(args){
        // do stuff
    }
})(window.exports);


// in main js file

var exports = {}; // global variable

Frame('moduleName.js');
Frame(function(next){
    var myArgs = { ... settings ... };
    exports.moduleName(myArgs);
    next();
});
Frame.init();
于 2012-04-25T16:32:16.407 に答える
0

名前空間変数を使用して、特定のライブラリを初期化するときに適切なオブジェクトを参照することは可能ですか?require.jsに何をさせたいのか正確にはわからないかもしれませんが、いずれにしてもmain.jsから呼び出しているように見えるので、うまくいくと確信しています...のようにそれを行うことができます <script = "require.js?apiKey=jsdfhjkfklsjkfdjks">

var libData = {
   apiKey: "jsdfhjkfklsjkfdjks",
   otherpram: "userIDorsomething"
}

require(libData.apiKey); 

ただし、ページのurlパラメーターでapikeyを送信する必要がある場合は、次のようなスクリプトを使用してパラメーターを取得できます。

<script>
      function getQueryParams(qs) {
            qs = qs.split("+").join(" ");
            var params = {},
                tokens,
                re = /[?&]?([^=]+)=([^&]*)/g;

            while (tokens = re.exec(qs)) {
                params[decodeURIComponent(tokens[1])]
                    = decodeURIComponent(tokens[2]);
            }

            return params;
        }

// assuming the page is loaded like page.html?apikey=jsdfhjkfklsjkfdjks

     apiKey = getQueryParams(document.location.search).apiKey;

//ただし、requireを呼び出す必要がありますが、APIキーを渡しますか?

</script>
于 2012-04-25T18:16:50.857 に答える