/gulp-terser-js

A Terser-js plugin for Gulp

Primary LanguageJavaScriptMIT LicenseMIT

gulp-terser-js

NPM Version NPM Downloads Linux Build Test Coverage

A Terser-js plugin for Gulp

Why choose terser?

uglify-es is no longer maintained and uglify-js does not support ES6+.

terser is a fork of uglify-es that retains API and CLI compatibility with uglify-es and uglify-js@3. Source:Why choose terser?

Why choose gulp-terser-js

This plugin displays formatted error:

error screenshot

Installation

npm install gulp-terser-js

Basic Usage

const terser = require('gulp-terser-js')

const minifyJS = () =>
  gulp.src('asset/js/*.js')
    .pipe(terser({
       mangle: {
         toplevel: true
       }
    }))
    .on('error', function (error) {
      this.emit('end')
    })
    .pipe(gulp.dest('public/js/'))


gulp.task('minifyJS', minifyJS)

Options

The options you can use can be found here.

Avanced Usage

const gulp = require('gulp')
const concat = require('gulp-concat')
const sourcemaps = require('gulp-sourcemaps')
const terser = require('gulp-terser-js')

const sourceMapOpt = {
  sourceMappingURL: (file) => 'http://127.0.0.1/map/' + file.relative + '.map'
}
const mapsFolder = './public/map'

const minifyJS = () =>  
  gulp.src('./asset/js/*.js')
    .pipe(gulp.dest(mapsFolder))
    .pipe(sourcemaps.init())
    .pipe(concat('script.js'))
    .pipe(terser({
      mangle: {
        toplevel: true
      }
    }))
    .on('error', function (error) {
      if (error.plugin !== "gulp-terser-js") {
        console.log(error.message)
      }
      this.emit('end')
    })
    .pipe(sourcemaps.write(mapsFolder, sourceMapOpt))
    .pipe(gulp.dest('./public/js/'))

gulp.task('minifyJS', minifyJS)

Source maps

When running Terser on compiled Javascript, you may run into issues with source maps. If you need to pass the content of your source maps to Terser, first you must set the loadMaps option to true when initializing gulp-sourcemaps. Next, make the content source map option true when piping Terser.

A basic setup may look like this:

gulp.src('asset/js/*.js')
  .pipe(sourcemaps.init({ loadMaps: true }))
  .pipe(terser({
     sourceMap: {
       content: true
     }
  }))
  .pipe(sourcemaps.write())
  .pipe(gulp.dest('dist'))

Can I use terser to format error of an other gulp module ?

// ... 
const less = require('gulp-less');

const generateCSS = () =>  
  gulp.src("./asset/css/*.less", srcOptions)
    .pipe(less()).on("error", printLESSError)
    .pipe(postcss([cssnano]))
    .pipe(sourcemaps.write(path.relative(srcOptions.cwd, mapsFolder), sourceMapOpt))
    .pipe(gulp.dest(outputBuildFolder))

function printLESSError(error) {
  if (error.plugin === "gulp-less") {
    terser.printError.call(this, {
      name: error.type,
      line: error.line,
      col: error.column,
      filePath: error.filename,
      fileContent: '' + fs.readFileSync(error.filename),
      message: (error.message || '').replace(error.filename, path.basename(error.filename)).split(' in file')[0],
      plugin: error.plugin
    })
  } else {
    console.log(error.message);
  }
  this.emit('end')
}

Version

Description gulp-terser-js
Node Version >= 8.10.0
Terser Version 4.1.4+
Gulp Version >= 4.X