From 27303c6be09b8fc24c13454deae234e480cbf995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski-Owczarek?= Date: Wed, 31 May 2023 18:59:35 +0200 Subject: [PATCH] Build: Switch the minifier from UglifyJS to Terser UglifyJS is ES5-only, while Terser supports newer ECMAScript versions. jQuery is authored in ES5 but jQuery 4.x will also have an ESM build that cannot be minified using UglifyJS directly. We could strip the `export` statement, minify via UglifyJS and re-add one but that increases complexity & may not fully play nice with source maps. On the other hand, switching to Terser increases the minfied size by just 324 bytes and the minified gzipped one by just 70 bytes. Such differences largely disappear among bigger size gains from the `3.x-stable` line - around 2.7 KB minified gzipped as of now. Closes gh-5258 --- Gruntfile.js | 27 ++++++++++++++------------- build/tasks/build.js | 2 +- build/tasks/sourcemap.js | 2 +- package.json | 6 +++--- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index c5e238ced..9029be85d 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -333,25 +333,26 @@ module.exports = function( grunt ) { files: [ "<%= eslint.dev.src %>" ], tasks: [ "dev" ] }, - uglify: { + terser: { all: { files: { "dist/<%= grunt.option('filename').replace('.js', '.min.js') %>": "dist/<%= grunt.option('filename') %>" }, options: { - preserveComments: false, - sourceMap: true, - sourceMapName: - "dist/<%= grunt.option('filename').replace('.js', '.min.map') %>", - report: "min", - output: { - "ascii_only": true + ecma: 5, + sourceMap: { + filename: "dist/<%= grunt.option('filename').replace('.js', '.min.map') %>" + }, + format: { + ascii_only: true, + comments: false, + preamble: "/*! jQuery v<%= pkg.version %> | " + + "(c) OpenJS Foundation and other contributors | " + + "jquery.org/license */" }, - banner: "/*! jQuery v<%= pkg.version %> | " + - "(c) OpenJS Foundation and other contributors | jquery.org/license */", compress: { - "hoist_funs": false, + hoist_funs: false, loops: false } } @@ -420,7 +421,7 @@ module.exports = function( grunt ) { grunt.registerTask( "dev", [ "build:*:*", runIfNewNode( "newer:eslint:dev" ), - "newer:uglify", + "newer:terser", "remove_map_comment", "dist:*", "qunit_fixture", @@ -431,7 +432,7 @@ module.exports = function( grunt ) { runIfNewNode( "eslint:dev" ), "build:*:*", "amd", - "uglify", + "terser", "remove_map_comment", "dist:*", "test:prepare", diff --git a/build/tasks/build.js b/build/tasks/build.js index bcfa8ceae..98d95cbe5 100644 --- a/build/tasks/build.js +++ b/build/tasks/build.js @@ -339,6 +339,6 @@ module.exports = function( grunt ) { ""; grunt.log.writeln( "Creating custom build...\n" ); - grunt.task.run( [ "build:*:*" + ( modules ? ":" + modules : "" ), "uglify", "dist" ] ); + grunt.task.run( [ "build:*:*" + ( modules ? ":" + modules : "" ), "terser", "dist" ] ); } ); }; diff --git a/build/tasks/sourcemap.js b/build/tasks/sourcemap.js index 509374f2e..f6ef5698e 100644 --- a/build/tasks/sourcemap.js +++ b/build/tasks/sourcemap.js @@ -3,7 +3,7 @@ var fs = require( "fs" ); module.exports = function( grunt ) { - var config = grunt.config( "uglify.all.files" ); + var config = grunt.config( "terser.all.files" ); grunt.registerTask( "remove_map_comment", function() { var minLoc = grunt.config.process( Object.keys( config )[ 0 ] ); diff --git a/package.json b/package.json index 31166d31f..56eaa6822 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "grunt-babel": "8.0.0", "grunt-cli": "1.4.3", "grunt-compare-size": "0.4.2", - "grunt-contrib-uglify": "3.4.0", "grunt-contrib-watch": "1.1.0", "grunt-eslint": "24.0.0", "grunt-git-authors": "3.2.0", @@ -43,6 +42,7 @@ "grunt-karma": "4.0.2", "grunt-newer": "1.3.0", "grunt-npmcopy": "0.2.0", + "grunt-terser": "2.0.0", "gzip-js": "0.3.2", "husky": "4.2.5", "jsdom": "19.0.0", @@ -67,8 +67,8 @@ "rollup": "2.21.0", "sinon": "7.3.1", "strip-json-comments": "3.1.1", - "testswarm": "1.1.2", - "uglify-js": "3.4.7" + "terser": "5.17.6", + "testswarm": "1.1.2" }, "scripts": { "build": "npm install && grunt",