One to be put squarely into the head-meets-desk section. For a little while now, I’ve been meaning to update how I minify and compress the JavaScript files used by this website (and others that use JS to some lesser degree). For ages I’ve been using compressor code that runs as a Java app (I know, I know! Just step away from the pepper spray right now!) – first it was the YUI Compressor (last release: eight years ago), and then a couple or more years ago I moved to the Google Closure Compiler because I was now using the more modern ES5+ syntax that the YUI Compressor couldn’t parse.
This morning, I came across this repo on GitHub: JS minification benchmarks. It’s basically code that calculates performance benchmarks for a bunch of JavaScript minifiers. For me? “Oh, look, a list of minifiers, let’s try some out, and see which one I like best!”
I selected terser as the first one: I’m not particularly bothered about speed (I only minify occasionally, it’s not like I’m always altering the JS for this site, so speed is not a big worry) and so I went for the minifier that produced the smallest output. One quick call to npm install terser –g
later, I was ready to go.
As a start, for experimentation, I quickly wrote a batch file that would minify and concatenate the JavaScript I use for this site. There are actually two output JS files: one that’s used for all my readers, and one that’s used for when I’m logged in as the Boyet God (and, no, I’m not telling you what that JS does, and the filename I’m using here is fake!), so the batch file looked like this:
rem minify Boyet script
terser [input files] -o js\minifiedBoyet.js -c
rem minify Boyet God script
terser [input files] -o js\minifiedBoyetGod.js -c
I ran the batch file and it just stopped after executing the first (successful) call to terser
. The second call never happened. Wut? The first minified JS file had been created, and looked OK, but the second was nowhere to be seen. Double wut?
Time for a bit of googling. First hint was to put each of the calls to terser
in their own batch files, so all the main batch file does is to call the two one-line batch files. Didn’t work. Turns out that when you call a batch file from another, the called batch file doesn’t return: some historical reason dating from MS-DOS days. You have to explicitly call
the secondary batch file, like this: call DoThisOtherThing.bat
. Well I never, and I’ve been programming PCs since those MS-DOS days.
OK, bingo, here we go! Except nope, still didn’t work: the batch files just stopped after that first call to terser
.
This took another bit of googling. It turns out that terser
is not a batch file, nor an exe
file, but a cmd
file: terser.cmd
. To run a cmd
file inside a batch file, you have to use … get ready for it … the cmd
command. With the /c
switch so that it can return.
Boom, this is the batch file that actually worked as I’d expected:
rem minify Boyet script
call /c terser [input files]] -o js\minifiedBoyet.js -c
rem minify Boyet God script
call /c terser [input files]] -o js\minifiedBoyetGod.js -c
Now, what was I doing all this for again? Oh yes, minification. Time to test these new minified files to see that all their functionality works as before…
3 Responses
#1 Jürgen Krämer said...
07-Feb-21 11:58 PMIn your last example you mixed up two correct solutions, resulting in a wrong solution. To call a
bat
file or acmd
file from a batch file, you can either prefix itcall
orcmd /c
but not withcall /c
. Thus bothand
would work.
#2 julian m bucknall said...
08-Feb-21 6:59 AM@Jürgen: You are utterly right, I blew it 🙄. Now corrected, and thanks!
Cheers, Julian
#3 Stuart Anderson said...
08-Feb-21 10:47 PMGreat! Thanks for this. It worked for me.
Leave a response
Note: some MarkDown is allowed, but HTML is not. Expand to show what's available.
_emphasis_
**strong**
[text](url)
`IEnumerable`
* an item
1. an item
> Now is the time...
Preview of response