web-dev-qa-db-ja.com

RequireJS-初期化のためにパラメータをモジュールに渡します

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

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

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

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

13
Christian Engel

あなたが次のようなものを持っている場合:

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;
});

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

require.jsは、返されるものを制限しません。単純なオブジェクト、文字列、関数などがあります。

14
ggozad

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

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

6
dlrust

私が思いついたもう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にすでに組み込まれている機能を利用します。

4
Christian Engel

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();
1
BishopZ

名前空間変数を使用して、特定のライブラリを初期化するときに適切なオブジェクトを参照することは可能ですか? 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>
0
Peter Hanley