parallel-uglifyjs
Version:
Recursively trawls a directory for .js files to uglify, running one node instance per available CPU.
95 lines (72 loc) • 2.49 kB
JavaScript
const readline = require('readline');
var cp = require( 'child_process' );
var finder = require( 'finder-on-steroids' );
var numCPUs = require( 'os' ).cpus().length;
var ProgressBar = require( 'progress' );
var util = require( 'util' );
if (process.argv.length != 3) {
console.error('Please enter a (single) directory of scripts to uglify.');
process.exit(1);
}
console.log( 'Finding all JS files' );
finder(process.argv[2]).files().name( '*.js' ).find(launch);
function launch(err, files) {
if ( err != null ) {
console.error(err);
}
// Fork all workers
var workers = [];
for ( var i = 0; i < numCPUs; i++ ) {
var worker = cp.fork( __dirname + '/../worker.js', [i] );
worker.on( 'message', make_message_processor(i) );
worker.on( 'error', function( err ) {
console.error( 'Worker: Something bad happened: ' + err );
});
workers.push( worker );
}
// Give out jobs
var job = 0;
var bar = new ProgressBar('[:bar] Minified :current of :total files, :percent, :rate/fps, :etas', {
complete: '=',
incomplete: ' ',
width: 20,
total: files.length,
});
function next( worker_id ) {
job++;
bar.tick();
var worker_process = workers[ worker_id] ;
if ( job < files.length ) {
worker_process.send({ cmd: 'go', name: files[job] });
} else {
console.log( 'master: We are all done. Disconnecting ' + worker_id + '.');
worker_process.disconnect();
}
}
// Create message processing function for each worker
function make_message_processor( id ) {
var local_id = id; // this gets closed
return function ( msg ) {
switch ( msg.message ) {
case 'give_me_another':
next( local_id );
break;
case 'error':
console.log( 'master: got error from worker process' );
break;
case 'default':
console.log( 'master: got unknown message' );
break;
}
};
}
}
// Respond to other messages
process.on( 'error', function( err ) {
console.log( 'master: Something bad happened: ' + err );
});
process.on('exit', function( err ) {
console.log( 'master: Exiting' );
});
;