J'ai actuellement une application Web qui fonctionne à partir d'une API globale basée sur le Javascript, et qui est initialisée comme suit :
var Api = {
someVar: "test",
someFunction: function() {
return "foo";
}
}
Cette API est partagée par de nombreux "Widgets" qui vivent dans l'application Web, et ils doivent tous fonctionner à partir de cette seule API. Api
afin qu'ils puissent se transmettre des données.
AJAX est actuellement utilisé pour charger ces widgets, par exemple dans widgets/mywidget.html, et il est placé dans, disons, <div id='widget_<random number>'>...</div>
D'autres parties du code peuvent choisir d'ajouter plus de fonctionnalités à la fonction Api
et c'est actuellement le cas :
Api.myExtension = {
myNewFunction: function() {
return "bar";
}
}
Toutefois, ce type d'utilisation pose certains problèmes :
Premier problème : Que se passe-t-il si un widget (qui peut être fourni par des tiers) décide de cacher du code à l'intérieur, et fait quelque chose de similaire à Api = {}
La Commission européenne a décidé de mettre en place un système d'alerte précoce, détruisant ainsi le système mondial d'alerte précoce. Api
var tout continue, et briser l'ensemble de l'application ? Est-il possible de protéger cette Api
d'être écrasée de l'extérieur ? Seule l'"extension" est autorisée (ajout de nouvelles choses), mais la "suppression/modification" ne l'est pas :
Api.foo = { test: "bar" } // allowed
Api.someVar = "changing the existing someVar"; // not allowed
Le code suivant se trouve "à l'intérieur" Api
par exemple :
var Api = {
Debug: {
Messages = new Array,
Write: function() {
Api.Debug.Messages.push("test"); // allowed
}
}
}
Api.Debug.Messages.push("test 2"); // not allowed
Solutions probables auxquelles j'ai pensé :
-
Supposons que nous utilisions simplement des cadres pour résoudre ce problème. Les
Api
sont désormais distincts l'un de l'autre. Cependant, il y a une surcharge supplémentaire lors du chargement deApi
encore et encore si j'ai beaucoup deWidget
et qu'ils ne peuvent plus communiquer avec l'"hôte" des widgets (la page où résident les cadres), par exemple, je peux vouloir dire à l'hôte d'afficher une notification :Api.Notify.Show("Test")
mais il ne peut pas le faire parce que cetteApi
est complètement indépendant des autres instances et ne peut pas communiquer avec l'"hôte" -
En utilisant quelque chose comme une fonction "getter" et "setter" pour que l'Api soit lue et écrite. Je ne suis pas sûr de la façon de mettre cela en œuvre, donc toute aide sur la façon de mettre cela en œuvre est la bienvenue !
-
Un mélange de 1/2 ?