UglifyJS, node_modules ile beklenmeyen token: keyword (const) atıyor


90

Başladığım küçük bir proje , constdeğişkenleri bildiren bir düğüm modülü ( npm aracılığıyla kurulan ) kullanıyor . Bu projeyi çalıştırmak ve test etmek iyi, ancak UglifyJS yürütüldüğünde tarayıcı doğrulaması başarısız oluyor.

Beklenmeyen belirteç: anahtar kelime (const)

İşte bu sorun olmadan (yani o belirli düğüm modülü olmadan) birkaç başka geçmiş projede başarıyla kullandığım genel bir Gulp dosyası.

gulpfile.js

'use strict';

const browserify = require('browserify');
const gulp = require('gulp');
const source = require('vinyl-source-stream');
const derequire = require('gulp-derequire');
const buffer = require('vinyl-buffer');
const uglify = require('gulp-uglify');
const sourcemaps = require('gulp-sourcemaps');
const gutil = require('gulp-util');
const path = require('path');
const pkg = require('./package');
const upperCamelCase = require('uppercamelcase');

const SRC_PATH = path.dirname(pkg.main);
const DIST_PATH = path.dirname(pkg.browser);

const INPUT_FILE = path.basename(pkg.main);
const OUTPUT_FILE = path.basename(pkg.browser);

const MODULE_NAME = upperCamelCase(pkg.name);


gulp.task('default', () => {
  // set up the browserify instance on a task basis
  var b = browserify({
    entries: INPUT_FILE,
    basedir: SRC_PATH,
    transform: ['babelify'],
    standalone: MODULE_NAME,
    debug: true
  });

  return b.bundle()
    .pipe(source(OUTPUT_FILE))
    .pipe(buffer())
    .pipe(derequire())
    .pipe(sourcemaps.init({loadMaps: true}))
    .pipe(uglify())
    .on('error', gutil.log)
    .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest(DIST_PATH))
  ;
});

Ben hepsini yerine bu sabitleme çalıştık constiçin varo npm yüklenmiş modülünde ve her şey yolunda. Yani başarısızlığı anlamıyorum.

Neyin var const? Birisi IE10 kullanmadıkça, tüm büyük tarayıcılar bu sözdizimini destekler.

Bu düğüm modülünde bir değişiklik gerektirmeden bunu düzeltmenin bir yolu var mı?

Güncelleme

UglifyJS'yi geçici (veya kalıcı olarak) Butternut ile değiştirdim ve çalışıyor gibi görünüyorum.


Düğüm sürümüyle ilgili bir sorun değil mi? constKullanılabilir olması için 8+ düğümüne ihtiyacınız yok mu? (ne zaman tanıtıldığından emin değilim)
laurent

constV4.0'dan beri kullanıyorum . Ve şu anda 8.9.1 LTS kullanıyorum.
Yanick Rochon

Tamam o zaman bu garip. Gördüğünüz hata mesajı nedir?
laurent

@ this.lau_ başlıkta olduğu gibi aynı hata mesajı, ancak netlik açısından soruya da ekledim.
Yanick Rochon

Bunun 'sabit' ile ilgili olması gerekmez. İhtiyaç duyduğunuz modüllerden biri olabilir.
James

Yanıtlar:


92

As ChrisR bahsettiğimde , UglifyJS hiç ES6 desteklememektedir.

ES6 için terser-webpack-eklentisini kullanmanız gerekir (webpack @ 5 bu eklentiyi çirkinleştirme için kullanacaktır)

npm install terser-webpack-plugin --save-dev

Ardından pluginsdizinizde tanımlayın

const TerserPlugin = require('terser-webpack-plugin')

  new TerserPlugin({
    parallel: true,
    terserOptions: {
      ecma: 6,
    },
  }),

Kaynak


1
Belki de önermelisin npm install --save-dev terser-webpack-plugin.
Rafa

2
Bu cevaba gerçekten minnettarım çünkü bana altında kullanılan terserlib'i hatırlattı terser-webpack-plugin. Diğerleri için not: terseraynen olduğu gibi bağımsız olarak kullanılabilir uglify-js(yani web paketi bir gereklilik değildir), bu tam olarak ihtiyacım olan şeydi.
John Lee

1
ama bu çözümü kullanmak için webpack kullanmamız gerekiyor?
Enrique

@enrique ne yapmak istediğinize bağlıdır, gerçek iş ihtiyaçlarına uygun bir web sitesi oluşturmak için kesinlikle webpack'i denemelisiniz. Web paketi topluluğunda bu sorunu yaşadık, bu nedenle cevabım iyi derecelendirildi ancak teknik olarak ES6 kodunu oluşturmak için web paketine ihtiyacınız yok
Ser

Terser içinde webpack @ 4'e kiraz seçildi github.com/webpack/webpack/pull/8392
Trivikram

39

UglifyJS, es6'yı desteklemez. constbir es6 bildirimi olduğundan bir hata atar.

İşin tuhafı, kullandığınız paketin dosyalarını herhangi bir yerde kullanılmak üzere es5'e aktarmamasıdır.

Hala UglifyJS'yi kullanmak istiyorsanız (örneğin, yapılandırmayı yeniden kullanmak için) ES6 + uyumlu sürümü, uglify- es'i kullanın . ( Uyarı : uglify-esolduğu şu anda terk edilmiş ).

Ve Ser'in bahsettiği gibi , şimdi kullanmalısınız terser-webpack-plugin.


3
Ayrıca değiştirebilirsiniz gulp-uglifytarafından gulp-uglify-es: npmjs.com/package/gulp-uglify-es
ChrisR

3
UglifyJS does not support es6 . Teşekkür ederim! O bilgiyi hiçbir yerde bulamadım.
Karl Pokus

web gulp-terserpaketine geçiş bütçenizi aşıyorsa kullanın .
Riki137

7

Aynı sorunu yaşadım ve gulp eklentisi gulp-uglify-es sorunu çözdü.

Bunun en basit karar olduğunu düşünüyorum.

Sadece kurun:

npm i gulp-uglify-es --save-dev

bundan sonra kodunuzda sadece bu satırı değiştirin

const uglify = require('gulp-uglify');

buna:

const uglify = require('gulp-uglify-es').default;

NB özelliği .default çok önemlidir, aksi takdirde çirkinleştirmenin bir işlev olmadığına dair bir hata alırsınız.

Yukarıda bahsedildiği gibi ve ES6 const operatörünün bir parçası olduğu için yalnızca daha modern es6 gulp eklentisi "gulp-uglify-es" ile işlenebilir.

Kodunuzun geri kalanının değiştirilmesine gerek yoktur.

Saygılarımla!


"node: v12.14", "gulp cli v2.2.1", "gulp local v4.0.2" ile test edilmiş ve çalışmaktadır.
ioojimooi

2

Bu sorunu henüz yeniden düzenlediğim bir Gulp projesiyle yaşadım ve nedense resmi Terser Gulp eklentisiyle sorun yaşıyordum. Bu (gulp-terser) hiçbir sorun olmadan çalıştı.


0

Uglify-es-webpack-eklentisini kullanmak daha iyidir

    const UglifyEsPlugin = require('uglify-es-webpack-plugin')



    module.exports = {
    plugins: [
            new UglifyEsPlugin({
                compress:{
                    drop_console: true
                }
            }),
    ] 
    }

7
Bu bir fikirdir, lütfen neden daha iyi olduğunu açıklayın.
ChrisR

0

Ben yerini almıştır UglifyJSile YUI Compressor JS.. Şimdi işler PhpStorm ait GUI içinde.


0

Bu yaklaşımın gerçekten iyi olduğunu düşünmüyorum, ama benim durumumda bunu bir kez yapmam ve bunu unutmam gerekiyordu, bu yüzden babel'in web sitesine gittim , es6'yı es5'e çevrim içi aktartım ve çıktıyı değiştirdim!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.