UglifyJS에서 예상치 못한 토큰 발생 : node_modules 키워드 (const)


90

내가 시작한 작은 프로젝트 는 변수 를 선언 하는 노드 모듈 ( npm을 통해 설치됨 )을 사용합니다 const. 이 프로젝트를 실행하고 테스트하는 것은 좋지만 UglifyJS가 실행되면 browserify가 실패합니다.

예기치 않은 토큰 : 키워드 (const)

다음은이 문제가없는 (즉, 특정 노드 모듈없이) 몇 가지 다른 과거 프로젝트에 성공적으로 사용한 일반적인 Gulp 파일입니다.

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))
  ;
});

npm이 설치된 모듈에서 모두 교체하여 문제 const를 해결하려고 시도했으며 모든 var것이 정상입니다. 그래서 나는 실패를 이해하지 못합니다.

뭐가 잘못 const됐나요? 누군가 IE10을 사용하지 않는 한 모든 주요 브라우저가이 구문을 지원합니다.

해당 노드 모듈을 변경하지 않고이 문제를 해결할 수있는 방법이 있습니까?

최신 정보

나는 일시적으로 (또는 영구적으로) UglifyJS를 Butternut으로 대체했으며 작동하는 것 같습니다.


노드 버전 문제 아닙니까? 노드 8 이상이 필요하지 const않습니까? (실제로 언제 도입되었는지 확실하지 않음)
laurent

나는 constv4 부터 사용 하고 있습니다. 그리고 현재 8.9.1 LTS를 사용하고 있습니다.
Yanick Rochon 17.11.

그럼 이상해. 표시되는 오류 메시지는 무엇입니까?
laurent

@ this.lau_ 제목과 동일한 오류 메시지이지만 명확성을 위해 질문에도 추가했습니다.
Yanick Rochon 17.11.

반드시 'const'에 관한 것일 필요는 없습니다. 필요한 모듈 중 하나 일 수 있습니다.
James

답변:


92

으로 ChrisR는 했나요 , UglifyJS 전혀 ES6를 지원하지 않습니다.

당신은 사용할 필요가 terser-웹팩 - 플러그인 ES6 위해 (웹팩 @ 5 uglification이 플러그인을 사용합니다)

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

그런 다음 plugins배열 에서 정의하십시오.

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

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

출처


1
아마도 당신은 제안해야 할 것 npm install --save-dev terser-webpack-plugin입니다.
Rafa

2
이 답변 은 아래 terser에서 terser-webpack-plugin사용 하는 lib 에 대해 상기시켜 주었기 때문에 정말 감사합니다 . 다른 사용자를위한 참고 사항 : 내가 필요로하는 그대로 (즉, webpack은 요구 사항이 아님) tersercli로 독립형으로 사용할 수 있습니다 uglify-js.
John Lee

1
하지만이 솔루션을 사용하려면 웹팩을 사용해야합니까?
Enrique

@enrique는 실제 비즈니스 요구에 맞는 웹 사이트를 구축하기 위해 원하는 작업에 따라 반드시 webpack을 시도해야합니다. 우리는 webpack 커뮤니티에 그 문제가 있었기 때문에 내 대답은 잘 평가되었지만 기술적으로는 ES6 코드를 빌드하는 데 webpack이 필요하지 않습니다
Ser

Terser는에 웹팩 @ 4 체리웠다 github.com/webpack/webpack/pull/8392
Trivikram

39

UglifyJS는 es6를 지원하지 않습니다. constes6 선언이므로 오류가 발생합니다.

이상한 점은 사용하는 패키지가 어디서나 사용하기 위해 파일을 es5로 변환하지 않는다는 것입니다.

예를 들어 구성을 재사용하기 위해 UglifyJS를 계속 사용하려면 ES6 + 호환 버전 인 uglify-es를 사용하십시오 . ( 경고 : uglify-es되어 이제 포기 .)

그리고 Ser이 언급했듯이 이제 terser-webpack-plugin.


3
또한 대체 할 수 있습니다 gulp-uglify으로 gulp-uglify-es: npmjs.com/package/gulp-uglify-es을
ChrisR

3
UglifyJS does not support es6 . 감사합니다! 나는 그 정보를 어디서도 찾을 수 없었다.
Karl Pokus 19-06-15

gulp-terserwebpack으로 마이그레이션하는 것이 예산을 초과 하는 경우 사용 하십시오.
Riki137

7

나는 같은 문제가 있었고 gulp 플러그인 gulp-uglify-es 가 문제를 해결했습니다.

가장 간단한 결정이라고 생각합니다.

다음을 설치하십시오.

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

그 후 코드 에서이 줄만 변경하십시오.

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

이에:

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

NB 속성 .default 가 중요하지 않으면 uglify가 함수가 아니라는 오류가 발생합니다.

위에서 언급했듯이 ES6 const 연산자의 일부로서 더 현대적인 es6 gulp 플러그인 "gulp-uglify-es"로만 처리 할 수 ​​있습니다.

나머지 코드는 변경할 필요가 없습니다.

친애하는!


"node : v12.14", "gulp cli v2.2.1", "gulp local v4.0.2"로 테스트 및 작업했습니다.
ioojimooi

2

리팩토링 한 Gulp 프로젝트에서이 문제가 발생했으며 어떤 이유로 공식 Terser Gulp 플러그인에 문제가있었습니다. 이것은 (gulp-terser) 아무런 문제없이 작동했습니다.


0

uglify-es-webpack-plugin을 사용하는 것이 더 좋습니다.

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



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

7
이것은 의견입니다. 왜 더 나은지 자세히 설명하십시오.
ChrisR

0

PHPStorm의 GUI 내부 로 교체 UglifyJS했습니다 YUI Compressor JS. 이제 작동합니다.


0

이 접근 방식이 좋지 않다고 생각하지는 않지만 제 경우에는 한 번만 수행해야했고 잊어 버렸습니다. 그래서 방금 바벨의 웹 사이트 에 가서 es6에서 es5로 온라인으로 트랜스 파일하고 출력을 교체했습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.