69 votes

Erreur de syntaxe Uglify : Unxpected token : punc ())

J'essaie d'utiliser gulp afin de réduire un dossier contenant des fichiers JS. Cependant, l'un des fichiers présente l'erreur ci-dessus, ce qui l'empêche d'être réduit.

J'ai réussi à attraper et à imprimer l'erreur, que j'ai partiellement imprimée ici :

JS_Parse_Error {
 message: 'SyntaxError: Unexpected token: punc ())',
 filename: 'ex.js',
 line: 189,
 col: 25,
 pos: 6482,
 stack: Error\n    at new JS_Parse_Error (eval at <anonymous> ... ) 
 plugin: 'gulp-uglify',
 fileName: '.../js/ex.js',
 showStack: false
}

Le fichier en question contient le texte suivant, abrégé :

function() {
  ...
  $.confirm({
    buttons: {
        confirm: function() {
            $.post('/ajax-handler', {
                    ...
                })
                .done( function(response) {
                    var data = filterResponse(response);
                    if (data['status'] == 'success') {
                        sleep(1000).then(() => {
                    *       ...
                        });
                        sleep(5000).then(() => {
                            ...  
                        });

                    } else {
                        console.log('Oops!');
                    }
                })
                .fail( function(err, status, response) {
                    ...
            });
        },
        cancel: function() {}
    }
 });
  ...
}

J'ai ajouté le "*" ci-dessus afin d'indiquer la position exacte listée par JS_Parse_Error.

8 votes

Il semble que vous ne convertissiez pas le code en ES5 avant de le réduire, ce qui fait que uglify ne comprend pas ce qu'il faut faire. () => {} signifie. Si vous le changez en sleep(1000).then(function() { ... }) cela devrait fonctionner, sauf s'il y a d'autres erreurs

0 votes

D'accord, j'ai dû résoudre quelques autres erreurs, mais ça a vraiment aidé et tout fonctionne maintenant. Pour l'anecdote, puisque je l'ai beaucoup entendu parler, savez-vous quelle est la différence entre ES5 et ES6 ?

1 votes

Vous pouvez vérifier es6-features.org . Il y a beaucoup de différences

64voto

Qwerty Points 1165

// Mise à jour

Dans les commentaires ~ @imolit

 v2.0.0 (2018-09-14) - MODIFICATIONS IMPORTANTES (lien)

Revenir à uglify-js (uglify-es est abandonné, si vous avez besoin d'uglifier du code ES6, veuillez utiliser terser-webpack-plugin ).


Réponse originale avant la mise à jour...

J'espère que vous pourrez vous inspirer de cette solution qui fonctionne avec webpack. (lien ci-dessous)

Enseigner simplement UglifyJS ES6

Il existe deux versions de UglifyJS - ES5 y ES6 (Harmony), voir sur git
La version ES5 est fournie par défaut avec tous les plugins, mais si vous installez explicitement une version Harmony, ces plugins l'utiliseront à la place.

paquet.json

"uglify-js": "git+https://github.com/mishoo/UglifyJS2.git#harmony"

o

npm install --save uglify-js@github:mishoo/UglifyJS2#harmony

yarn add git://github.com/mishoo/UglifyJS2#harmony --dev

Webpack

Pour l'utiliser avec webpack installez aussi le plugin webpack

npm install uglifyjs-webpack-plugin --save-dev

yarn add uglifyjs-webpack-plugin --dev

puis importez le plugin installé manuellement

var UglifyJSPlugin = require('uglifyjs-webpack-plugin');

et le remplacer par le code

-  new webpack.optimize.UglifyJsPlugin({ ... })
+  new UglifyJSPlugin({ ... })

Pour plus d'informations sur webpack (Installation/Utilisation), voir https://github.com/webpack-contrib/uglifyjs-webpack-plugin#install

0 votes

Bonjour, comment l'utiliser dans webpack ? J'ai ceci dans mon pipeline de production new webpack.optimize.UglifyJsPlugin() et après avoir installé la version harmony, j'obtiens toujours les erreurs "punct()". ta

0 votes

@SkorunkaFrantišek Vous remplacez new webpack.optimize.UglifyJsPlugin() con new UglifyJSPlugin() . N'oubliez pas d'importer var UglifyJSPlugin = require('uglifyjs-webpack-plugin'); Le plugin inclus de webpack est l'ancien, c'est ainsi que vous indiquez explicitement d'utiliser celui que vous avez installé.

0 votes

Oui, ça a aidé ! Merci.

17voto

WOW Points 643

npm install uglifyjs-webpack-plugin --save-dev n'est pas suffisant

Le principal problème est "uglifyjs-webpack-plugin": "^0.4.6" en le paquet.json de webpack

Selon semestre , ^0.4.6 := >=0.4.6 <0.5.0 . À cause du zéro initial, webpack n'utilisera jamais le 1.0.0-beta.2 .

Donc, après avoir exécuté npm i -D uglifyjs-webpack-plugin@beta vous devez faire une étape de plus qui est rm -rf node_modules/webpack/node_modules/uglifyjs-webpack-plugin . Ensuite, webpack récupérera la version de node_modules/uglifyjs-webpack-plugin au lieu de node_modules/webpack/node_modules/uglifyjs-webpack-plugin

Mise à jour le 2018-04-18 : webpack v4 n'a pas ce problème.

0 votes

Ou rimraf node_modules \webpack\node_modules\uglify -js dans mon cas. Superbe ajout WooD

2 votes

J'utilise webpack v4.12.0 et ceci était nécessaire

0 votes

En utilisant "@symfony/webpack-encore" : "^0.20.0" J'ai dû faire cela aussi.

8voto

Qing Points 836

Ajouter le babel-preset-es2015 dépendance pour résoudre ce problème.

Et ajoutez également 'es2015' en .babelrc fichier.

json
{
    "presets": ["es2015"]
}

1 votes

En 2018, c'est ce qui a fonctionné pour moi : "presets": ["env"]

5voto

Hamza Khan Points 113

J'ai le même problème, j'ai trouvé une bonne réponse. aquí qui m'a permis d'atteindre le fichier qui causait l'erreur.

Allez dans la console Rails et collez :

JS_PATH = "app/assets/javascripts/**/*.js";
Dir[JS_PATH].each do |file_name|
  puts "\n#{file_name}"
  puts Uglifier.compile(File.read(file_name))
end

J'espère que cela aidera quelqu'un !

1 votes

Super utile en effet. Merci, Hamza !

3voto

spaceemotion Points 498

Pour moi, cela n'avait rien à voir avec le fait qu'Uglify ne fonctionne pas correctement, mais plutôt avec une dépendance (dans ce cas, empty-promise) qui n'a pas encore été compilée vers ES5. Comme nous venons d'importer le fichier source brut, mais que babel ne transpile que les fichiers en dehors des node_modules, uglify a été perturbé par la syntaxe ES6.

Vérifiez simplement si une dépendance que vous avez récemment ajoutée ne dispose pas d'une version "dist".

0 votes

Comment vérifier si une dépendance a une dist-build ?

0 votes

@PeterRader les paquets ont généralement un dist (ou quelque chose de similaire) sous leur répertoire dans le dossier node_modules . Il suffit de regarder si le fichier d'index dans leur package.json pointe vers un répertoire de sources compilées. Si ce n'est pas le cas, vous devez les ajouter à votre configuration babel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X