Build: Switch form Terser to SWC for JS minification (#5286)

Also, as part of this, fix the `file` & `sources` properties of the source map
file.

Fixes gh-5285
Closes gh-5286
Ref gh-5258
This commit is contained in:
Michał Gołębiowski-Owczarek 2023-07-10 18:23:07 +02:00 committed by GitHub
parent 198b41c8c2
commit e24218758b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 88 additions and 19 deletions

View File

@ -312,27 +312,41 @@ module.exports = function( grunt ) {
files: [ "<%= eslint.dev.src %>" ], files: [ "<%= eslint.dev.src %>" ],
tasks: [ "dev" ] tasks: [ "dev" ]
}, },
terser: { minify: {
all: { all: {
files: { files: {
"dist/<%= grunt.option('filename').replace('.js', '.min.js') %>": "dist/<%= grunt.option('filename').replace('.js', '.min.js') %>":
"dist/<%= grunt.option('filename') %>" "dist/<%= grunt.option('filename') %>"
}, },
options: { options: {
ecma: 5,
sourceMap: { sourceMap: {
filename: "dist/<%= grunt.option('filename').replace('.js', '.min.map') %>" filename: "dist/<%= grunt.option('filename').replace('.js', '.min.map') %>",
// The map's `files` & `sources` property are set incorrectly, fix
// them via overrides from the task config.
// See https://github.com/swc-project/swc/issues/7588#issuecomment-1624345254
overrides: {
file: "jquery.min.js",
sources: [
"jquery.js"
]
}
}, },
format: { swc: {
ascii_only: true, format: {
comments: false, ecma: 5,
preamble: "/*! jQuery v<%= pkg.version %> | " + asciiOnly: true,
"(c) OpenJS Foundation and other contributors | " + comments: false,
"jquery.org/license */" preamble: "/*! jQuery v4.0.0-pre | " +
}, "(c) OpenJS Foundation and other contributors | " +
compress: { "jquery.org/license */\n"
hoist_funs: false, },
loops: false compress: {
ecma: 5,
hoist_funs: false,
loops: false
},
mangle: true
} }
} }
} }
@ -400,7 +414,7 @@ module.exports = function( grunt ) {
grunt.registerTask( "dev", [ grunt.registerTask( "dev", [
"build:*:*", "build:*:*",
runIfNewNode( "newer:eslint:dev" ), runIfNewNode( "newer:eslint:dev" ),
"newer:terser", "newer:minify",
"remove_map_comment", "remove_map_comment",
"dist:*", "dist:*",
"qunit_fixture", "qunit_fixture",
@ -410,7 +424,7 @@ module.exports = function( grunt ) {
grunt.registerTask( "default", [ grunt.registerTask( "default", [
runIfNewNode( "eslint:dev" ), runIfNewNode( "eslint:dev" ),
"build:*:*", "build:*:*",
"terser", "minify",
"remove_map_comment", "remove_map_comment",
"dist:*", "dist:*",
"test:prepare", "test:prepare",

View File

@ -339,6 +339,6 @@ module.exports = function( grunt ) {
""; "";
grunt.log.writeln( "Creating custom build...\n" ); grunt.log.writeln( "Creating custom build...\n" );
grunt.task.run( [ "build:*:*" + ( modules ? ":" + modules : "" ), "terser", "dist" ] ); grunt.task.run( [ "build:*:*" + ( modules ? ":" + modules : "" ), "minify", "dist" ] );
} ); } );
}; };

56
build/tasks/minify.js Normal file
View File

@ -0,0 +1,56 @@
/**
* Minify JavaScript using SWC.
*/
"use strict";
module.exports = ( grunt ) => {
const swc = require( "@swc/core" );
grunt.registerMultiTask(
"minify",
"Minify JavaScript using SWC",
async function() {
const done = this.async();
const options = this.options();
const sourceMapFilename = options.sourceMap && options.sourceMap.filename;
const sourceMapOverrides = options.sourceMap && options.sourceMap.overrides || {};
await Promise.all( this.files.map( async( { src, dest } ) => {
if ( src.length !== 1 ) {
grunt.fatal( "The minify task requires a single source per destination" );
}
const { code, map: incompleteMap } = await swc.minify(
grunt.file.read( src[ 0 ] ),
{
...options.swc,
inlineSourcesContent: false,
sourceMap: sourceMapFilename ?
{
filename: sourceMapFilename
} :
false
}
);
grunt.file.write( dest, code );
if ( sourceMapFilename ) {
// Apply map overrides if needed. See the task config description
// for more details.
const mapObject = {
...JSON.parse( incompleteMap ),
...sourceMapOverrides
};
const map = JSON.stringify( mapObject );
grunt.file.write( sourceMapFilename, map );
}
} ) );
done();
}
);
};

View File

@ -3,7 +3,7 @@
var fs = require( "fs" ); var fs = require( "fs" );
module.exports = function( grunt ) { module.exports = function( grunt ) {
var config = grunt.config( "terser.all.files" ); var config = grunt.config( "minify.all.files" );
grunt.registerTask( "remove_map_comment", function() { grunt.registerTask( "remove_map_comment", function() {
var minLoc = grunt.config.process( Object.keys( config )[ 0 ] ); var minLoc = grunt.config.process( Object.keys( config )[ 0 ] );

View File

@ -26,6 +26,7 @@
"devDependencies": { "devDependencies": {
"@babel/core": "7.10.5", "@babel/core": "7.10.5",
"@babel/plugin-transform-for-of": "7.10.4", "@babel/plugin-transform-for-of": "7.10.4",
"@swc/core": "1.3.66",
"colors": "1.4.0", "colors": "1.4.0",
"commitplease": "3.2.0", "commitplease": "3.2.0",
"core-js-bundle": "3.6.5", "core-js-bundle": "3.6.5",
@ -42,7 +43,6 @@
"grunt-karma": "4.0.2", "grunt-karma": "4.0.2",
"grunt-newer": "1.3.0", "grunt-newer": "1.3.0",
"grunt-npmcopy": "0.2.0", "grunt-npmcopy": "0.2.0",
"grunt-terser": "2.0.0",
"gzip-js": "0.3.2", "gzip-js": "0.3.2",
"husky": "4.2.5", "husky": "4.2.5",
"jsdom": "19.0.0", "jsdom": "19.0.0",
@ -67,7 +67,6 @@
"rollup": "2.21.0", "rollup": "2.21.0",
"sinon": "7.3.1", "sinon": "7.3.1",
"strip-json-comments": "3.1.1", "strip-json-comments": "3.1.1",
"terser": "5.17.6",
"testswarm": "1.1.2" "testswarm": "1.1.2"
}, },
"scripts": { "scripts": {