dojo-util
Version:
Dojo utilities including build system for optimizing JavaScript application performance, and DOH testing tool
96 lines (86 loc) • 2.54 kB
JavaScript
/*jshint node:true */
define([
"../../buildControl",
"../../fs",
"./stripConsole",
"dojo/_base/lang",
"./uglify_worker",
"../writeAmd",
"require"
], function(bc, fs, stripConsole, lang, uglify, writeAmd, require){
if(!uglify){
throw new Error("Unknown host environment: only nodejs is supported by uglify optimizer.");
}
if(bc.maxOptimizationProcesses){
var nodeReq = require.nodeRequire,
processes = [],
fork = nodeReq("child_process").fork,
proc, jobs = {}, currentIndex = 0, queue = [],
worker = require.toUrl("./uglify_worker.js");
if(bc.maxOptimizationProcesses<0){
bc.maxOptimizationProcesses = nodeReq('os').cpus().length;
}
for(var i = 0; i < bc.maxOptimizationProcesses; i++){
proc = fork(worker);
proc.on("message", function(data){
if(jobs[data.dest]){
var func = jobs[data.dest];
delete jobs[data.dest];
func(data);
}
});
processes.push(proc);
}
}
return function(resource, text, copyright, optimizeSwitch, callback){
copyright = copyright || "";
var options = bc.optimizeOptions || {};
options.filename = writeAmd.getDestFilename(resource).split("/").pop();
if(optimizeSwitch.indexOf(".keeplines") > -1){
options.gen_options = options.gen_options || {};
options.gen_options.beautify = true;
options.gen_options.indent_level = 0; //don't indent, just keep new lines
}
if(optimizeSwitch.indexOf(".comments") > -1){
throw new Error("'comments' option is not supported by uglify optimizer.");
}
var handleResult = function(data){
try{
if(data.error){
throw data.error;
}
var result = copyright + "//>>built" + bc.newline + data.text;
fs.writeFile(resource.dest, result, resource.encoding, function(err){
if(err){
bc.log("optimizeFailedWrite", ["filename", resource.dest]);
}
callback(resource, err);
});
}catch(e){
bc.log("optimizeFailed", ["module identifier", resource.mid, "exception", e + ""]);
callback(resource, 0);
}
};
if(bc.maxOptimizationProcesses){
jobs[resource.dest] = handleResult;
processes[currentIndex].send({
text: stripConsole(text),
options: options,
dest: resource.dest,
useSourceMaps: bc.useSourceMaps
});
currentIndex = (currentIndex+1) % processes.length;
} else {
process.nextTick(function(){
var o = {};
try{
o.text = uglify(stripConsole(text), options, resource.dest, bc.useSourceMaps);
}catch(e){
o.error = e;
}
handleResult(o);
});
}
return callback;
};
});