web-dev-qa-db-fra.com

RequireJS - passe les paramètres dans le module pour l'initialisation

Duplicate possible:
Comment charger des modèles démarrés dans Backbone.js avec AMD (require.js)

Je crée actuellement une API RESTful pour l'un de nos projets et souhaitais également fournir une bibliothèque Javascript pour y accéder.

Comme j'aime bien le principe d'AMD et l'utilisation de require.js, je fournirais également un module AMD. Le problème est le suivant: l'initialisation du module nécessiterait des informations telles que la clé API lors de l'initialisation.

Comment puis-je passer de tels paramètres dans un module lors de l'initalisation?

14
Christian Engel

Si vous avez quelque chose comme:

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

    var module = {
        ...
    };

    return module;

});

changez le en:

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

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

    };

    return init;
});

Ensuite, après avoir demandé votre module quelque part, vous pouvez appeler pour l’initialiser. Vous voudrez peut-être également examiner le modèle d’usine si vous avez besoin de quelque chose de plus complexe et retourner l’usine.

require.js ne vous limite pas dans ce que vous retournez. Ce peut être un objet simple, une chaîne, une fonction ...

15
ggozad

Je pense que ce que vous recherchez, c'est la possibilité de définir des variables de configuration qui sont captées par le module. Voici un exemple utilisant require.js

Comment charger des modèles démarrés dans Backbone.js avec AMD (require.js)

6
dlrust

Une autre possibilité qui m'est venue à l'esprit est d'utiliser un script côté serveur pour manipuler la source du module lorsque vous le demandez.

Par exemple, lorsque vous devez passer une clé API dans le module, procédez comme suit:

Avant de faire votre premier appel define (), mettez le code suivant:

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

Cela vous permet simplement de demander à votre API de n’importe où comme ceci:

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

});

Ainsi, le serveur reçoit la demande - le mappe avec mod_rewrite à un script, prend le paramètre GET et le place à la bonne place dans le code source du module, puis renvoie la source personnalisée.

C’est ainsi que j’ai résolu ce problème à présent et cela fonctionne comme un charme, sans qu’il soit nécessaire de changer le comportement des développeurs et il utilise des fonctionnalités déjà intégrées dans les requirejs.

4
Christian Engel

Je ne pense pas que vous puissiez le faire avec require.js, mais avec Frame.js ou une autre bibliothèque de modules. Dans Frame, vous feriez comme ceci:

//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

Est-il possible d'utiliser une variable namespaced, puis de référencer l'objet approprié lorsque vous initialisez la bibliothèque spécifique? Peut-être que je ne comprends pas tout à fait ce que vous voulez, mais il semble que vous appelez ça depuis votre main.js de toute façon, alors je suis sûr que cela fonctionnerait ... Je ne pense pas que vous peut le faire comme <script = "require.js?apiKey=jsdfhjkfklsjkfdjks">

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

require(libData.apiKey); 

mais si vous avez besoin d'envoyer l'apikey dans le paramètre url de la page, vous pouvez utiliser un script comme celui-ci pour obtenir les paramètres:

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

// quelle que soit l'appel que vous ayez à faire, passez la clé api? 

</script>
0
Peter Hanley