UglifyJS ném mã thông báo không mong muốn: từ khóa (const) với node_modules


90

Một dự án nhỏ mà tôi đã bắt đầu sử dụng một mô-đun nút (được cài đặt thông qua npm ) khai báo constcác biến. Chạy và kiểm tra dự án này tốt, nhưng Browserify không thành công khi UglifyJS được thực thi.

Mã thông báo không mong muốn: từ khóa (const)

Đây là tệp Gulp chung mà tôi đã sử dụng thành công cho một vài dự án trước đây khác mà không gặp sự cố này (tức là không có mô-đun nút cụ thể đó).

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

Tôi đã cố gắng sửa lỗi này bằng cách thay thế tất cả constthành varmô-đun được cài đặt npm đó và mọi thứ đều ổn. Vì vậy tôi không hiểu sự thất bại.

Có chuyện gì vậy const? Trừ khi ai đó sử dụng IE10, tất cả các trình duyệt chính đều hỗ trợ cú pháp này.

Có cách nào để khắc phục điều này mà không yêu cầu thay đổi mô-đun nút đó không?

Cập nhật

Tôi đã tạm thời (hoặc vĩnh viễn) thay thế UglifyJS bằng Butternut và dường như hoạt động.


Nó không phải là một vấn đề với phiên bản nút? Bạn không cần nút 8+ để có constsẵn? (không chắc khi nào nó thực sự được giới thiệu)
laurent

Tôi đã sử dụng constkể từ phiên bản 4. Và tôi hiện đang sử dụng 8.9.1 LTS.
Yanick Rochon

Ok, điều đó thật lạ lùng. Thông báo lỗi bạn đang thấy là gì?
đoạt giải

@ this.lau_ cùng một thông báo lỗi như trong tiêu đề, nhưng tôi đã thêm nó vào câu hỏi cho rõ ràng.
Yanick Rochon

Nó không nhất thiết phải về 'const'. Nó có thể là một trong những mô-đun mà bạn đang yêu cầu.
James

Câu trả lời:


92

Như ChrisR đã đề cập , UglifyJS hoàn toàn không hỗ trợ ES6.

Bạn cần sử dụng terser-webpack-plugin cho ES6 (webpack @ 5 sẽ sử dụng plugin này để xác minh)

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

Sau đó xác định trong pluginsmảng của bạn

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

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

Nguồn


1
Có lẽ bạn nên đề nghị npm install --save-dev terser-webpack-plugin.
Rafa

2
Tôi thực sự đánh giá cao câu trả lời này vì nó nhắc nhở tôi về terserlib được terser-webpack-pluginsử dụng bên dưới. Lưu ý cho những người khác: tersercó thể được sử dụng độc lập như cli giống như cũ uglify-js(tức là gói web không phải là một yêu cầu), đó là chính xác những gì tôi cần.
John Lee

1
nhưng chúng ta cần sử dụng webpack để sử dụng giải pháp này?
Enrique

@enrique tùy thuộc vào những gì bạn muốn làm, để xây dựng một trang web phù hợp với nhu cầu kinh doanh thực tế, bạn chắc chắn nên thử webpack. Chúng tôi đã gặp vấn đề đó trên cộng đồng webpack nên câu trả lời của tôi được đánh giá tốt nhưng về mặt kỹ thuật, bạn không cần webpack để tạo mã ES6
Ser

Terser đã được chọn anh đào cho webpack @ 4 trong github.com/webpack/webpack/pull/8392
Trivikram 12/09/19

39

UglifyJS không hỗ trợ es6. constlà một khai báo es6, vì vậy nó sẽ xuất hiện một lỗi.

Điều kỳ lạ là gói bạn sử dụng không chuyển các tệp của nó sang es5 để được sử dụng ở mọi nơi.

Nếu bạn vẫn muốn sử dụng UglifyJS (để sử dụng lại cấu hình chẳng hạn), hãy sử dụng phiên bản tương thích ES6 +, uglify-es . ( Cảnh báo : uglify-esđược tại bị bỏ rơi .)

Và như Ser đã đề cập , bây giờ bạn nên sử dụng terser-webpack-plugin.


3
Bạn cũng có thể thay thế gulp-uglifybằng cách gulp-uglify-es: npmjs.com/package/gulp-uglify-es
ChrisR

3
UglifyJS does not support es6 . Cảm ơn bạn! Tôi không thể tìm thấy phần thông tin đó ở bất cứ đâu.
Karl Pokus

sử dụng gulp-tersernếu chuyển sang webpack hết ngân sách của bạn.
Riki137,

7

Tôi gặp sự cố tương tự và plugin gulp gulp-uglify-es đã giải quyết được sự cố.

Tôi nghĩ đó là quyết định đơn giản nhất.

Chỉ cần cài đặt:

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

sau đó trong mã của bạn chỉ thay đổi dòng này

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

đến điều này:

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

Thuộc tính NB .default là rất quan trọng, nếu không bạn sẽ gặp lỗi rằng uglify không phải là một hàm.

Như đã đề cập ở trên và là một phần của toán tử const ES6 chỉ có thể được xử lý bởi plugin es6 gulp hiện đại hơn "gulp-uglify-es"

Phần còn lại của mã của bạn không cần phải thay đổi.

Trân trọng!


đã thử nghiệm và làm việc với "node: v12.14", "gulp cli v2.2.1", "gulp local v4.0.2".
ioojimooi

2

Tôi vừa gặp sự cố này với một dự án Gulp mà tôi đã cấu trúc lại và vì một số lý do tôi gặp sự cố với plugin Terser Gulp chính thức. Cái này (gulp-terser) hoạt động không có vấn đề gì.


0

Dùng uglify-es-webpack-plugin thì tốt hơn

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



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

7
Đây là một ý kiến, xin vui lòng giải thích tại sao nó tốt hơn.
ChrisR

0

Tôi đã thay thế UglifyJSbằng YUI Compressor JSbên trong GUI của PHPStorm .. Nó hoạt động ngay bây giờ.


0

Tôi không thực sự nghĩ rằng cách tiếp cận này là tốt, nhưng trong trường hợp của tôi, tôi cần làm điều này một lần và quên điều đó đi, vì vậy tôi chỉ cần truy cập trang web của babel , chuyển đổi es6 sang es5 trực tuyến và thay thế đầu ra!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.