Collez du JavaScript et copiez une version obscurcie qui donne le même résultat : noms locaux renommés, chaînes échappées, accès entre crochets, commentaires supprimés.
Fonctionne localement dans votre navigateurCollez du JavaScript : l’outil renvoie le même programme avec les noms locaux renommés, les chaînes réécrites en échappements \xNN et \uNNNN, les accès par point convertis en crochets et les commentaires supprimés. Le code s’exécute toujours avec le même résultat ; tout est traité dans cet onglet, rien n’est envoyé.
Il s’agit d’obscurcissement contre la lecture occasionnelle, pas de chiffrement. La logique reste présente : ne comptez pas dessus pour masquer des clés d’API ou des règles métier, et gardez l’original lisible — déboguer la sortie à la main est pénible.
Les commentaires sont supprimés mais les retours à la ligne restent, donc effacer une note // n’avale jamais la ligne suivante. Les identifiants déclarés dans l’extrait — variables, fonctions, paramètres, classes, liaisons catch — sont renommés en noms courts générés via la chaîne de portées ; les noms venus de l’extérieur, y compris les globales, ne changent pas.
Les chaînes sont réécrites caractère par caractère en échappements \xNN ou \uNNNN, et la directive "use strict" reste telle quelle. L’accès par point devient un accès par crochets : console.log devient console["\x6c\x6f\x67"], et le chaînage optionnel suit la même règle (a?.b devient a?.["b"]). Après new et import la syntaxe est laissée intacte, et les champs #privés ne sont pas touchés.
Ni chiffrement ni minification. Les chaînes obscurcies sont plus longues, pas plus courtes, et un lecteur déterminé peut encore suivre la logique : le but est de décourager la copie et la lecture rapide, pas de rendre la reconstruction impossible.
Une seule passe sur le code, pas un bundler : les imports ne sont pas résolus, la syntaxe moderne n’est pas transpilée, rien ne change dans le chargement du fichier. Coller deux fois le même script donne deux sorties différentes, car les noms générés dépendent du contenu ; pratique pour diffuser, inutile pour comparer des builds.
La sortie est testée pour renvoyer les mêmes valeurs que l’entrée : classes, fonctions fléchées, gabarits avec expressions ${} imbriquées, async/await, spread, chaînage optionnel, coalescence nulle et littéraux regex passent. Le code de module conserve ses noms import et export et se charge toujours comme module.
Les scripts qui utilisent eval ou with ne sont pas renommés — ne pas renommer est le seul choix sûr dans ce cas — mais l’échappement et la conversion en crochets s’appliquent quand même. Un fichier d’environ 80 Ko est traité en quelques dizaines de millisecondes ; un script déjà obscurci peut l’être de nouveau.