Voici l'affaire, Nous avons une Big JS Bibliothèque que nous voulons compresser, mais yui compresseur n'est pas complètement Compressez le code s'il trouve une déclaration «eval», par peur qu'elle brisera autre chose. C'est génial et tout, mais nous savons exactement ce qui devient EVAL'D, donc nous ne voulons donc pas qu'il soit conservateur car il y a une déclaration d'évaluation dans MSON.Decode
SO TELIALEMENT LA QUESTION EST: Peut-être créatif) une manière d'écrire une expression qui renvoie la fonction EVAL?
J'ai essayé quelques-uns, mais pas de dés: p> aucune idée?
Thx p> p>
7 Réponses :
var e = "e"; window[e+"val"](stuff);
Cela ne fonctionne pas, les choses courent dans la portée mondiale. Ne semble pas non plus être portable, des problèmes WebKit
fenêtre.eval === fenêtre ['eval'] === fenêtre ['E' + 'Val'] code> Donc, pas de dés .. Stuff Gets Evaliter dans la lunette de la fenêtre qui n'est pas ce que nous avons besoin
Si possible, vous voudrez peut-être essayer l'une des autres bibliothèques de compression depuis que YUI n'est plus le seul jeu en ville. P>
Voici quelques articles sur les autres outils de compression disponibles. p>
Microsoft et Google semblent faire un meilleur travail que Yui de toute façon. P>
Merci pour les suggestions. J'ai joué avec la fermeture de Google, mais il est trop agressif pour nous, renomme trop de choses et casse le code. Nécessiterait un certain temps pour adapter le code juste pour que cela fonctionne et introduirait probablement de nouveaux bugs. Et ce serait bien de vérifier les trucs MS, mais nous sommes une boutique Java / OSX
L'astuce avec la fermeture de Google est de simplement utiliser la compression simple et si cela échoue, utilisez simplement l'espace blanche. C'est une alternative sûre et élimine simplement toutes les espaces blanchisseuses, ce qui vaut mieux que rien.
Cela fonctionne aussi avec YUI aussi, il miniie et tout cela, mais il ne remplace pas de longs noms de variables avec des plus courtes à cause des devales
pourrait refroidir les appels Evalir sur une fonction de cale externe qui ne fait pas partie du fichier compressé? p>
Je ne sais pas si je vous ai compris, mais vous pouvez appliquer une fonction à une portée locale (this) spécifique: Cette alerte 10 AS F est appliquée avec A.Ce P > p>
Est-ce que je manque quelque chose? Vérifiez-le http: // www.jsfiddle.net/ngl79/ avec les cadres sous forme de scopes d'évaluation différents. P> et spécifique à MOTOOLS: P> var noteval = window["ev"+"al"].create({
bind: this
});
Merci pour les idées, du moins maintenant, je comprends pourquoi cela ne fonctionnait pas. Jetez un coup d'œil à ma propre réponse
Merci pour toutes les idées, j'ai fini par faire un remplacement de texte dans le script de construction qui génère le JS, remplaçant essentiellement $ EVAL $ avec EVAL, après que tout ait été comprimé. J'espérais une manière purement JS, mais avec tant de mises en œuvre différentes de navigateur d'évaluation, il est probablement préférable de laisser simplement être évalué seul
mais basé sur la réponse de Dimitar et certains tripes, voici ce que j'ai trouvé.
On dirait que la raison pour laquelle cela ['eval'] ne fonctionnait pas, c'est parce que l'endroit où il se passe, dans motools json.decode, est également une intérieure de hachage: p> Toutefois, si je stocke la portée locale "Top Niveau" (tout le code, y compris mooTools, fonctionne à l'intérieur d'une fonction anonyme), alors cela fonctionne: P> var TOP = this;
var JSON = new Hash({
// snip snip
decode: function(string, secure) {
if ($type(string) != 'string' || !string.length) return null;
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
return TOP.eval('(' + string + ')'); // All good, things run within the desired scope.
}
});
De cette façon a besoin de jQuery.
function NotEval(code, callBack) { $.ajax({ url: 'data:application/javascript;charset=utf-8,' + encodeURIComponent(code), cache:true, success: function (r) { if (typeof callBack === "function") { callBack() } }, error: function (r) { console.log("Eval error"); console.log(r) } }) }
Vous êtes vissé parce que
eval code> n'est pas considéré comme une fonction ordinaire. Vous risquez de déjouer le compresseur YUI, mais vous rencontrerez des navigateurs qui ne vous laissez pas appeler
eval code> par n'importe quel autre nom.