start.js 7.59 KB
/**
 * @author PanZhao
 * @date 2016年3月17日 下午12:44:06
 */
var fs = require('fs')
    , colors = require('colors')
    , child_process = require('child_process')
    , EventProxy = require('eventproxy')
    , parse = require('./parse')
    , minifier = require('./minifier')
    , crypto = require("crypto")
    , handle_real_ctl = require('./handle_real_ctl');


var platform = process.platform;
var iswin = platform == 'win32';
var sp = platform == 'win32' ? '\\' : '/';
//不参与的目录
var excludes = ['scheduleApp', 'trafficManage', 'control', 'permission' + sp + 'authorize_all','permission' + sp + 'user', 'summary', 'history_sch', 'report' + sp + 'oil', 'base' + sp + 'geo_data_edit', 'base' + sp + 'carpark', 'forms', 'mforms', 'report', 'punctual', 'base' + sp + 'timesmodel', 'base' + sp + 'stationroute']
    , ep = new EventProxy()
    , pName = 'bsth_control'
    , path = process.cwd()
    //根目录
    , root = path.substr(0, path.indexOf(sp + 'src' + sp + 'main'))
    , workspace = root.substr(0, root.lastIndexOf(sp + pName))
    //临时目录
    , dest = (workspace + sp + pName + '@fatso_copy')
    , _static = sp + 'src' + sp + 'main' + sp + 'resources' + sp + 'static'
    , _pages = dest + _static + sp + 'pages';


//创建临时目录
fs.mkdir(dest, function (e) {
    if (e)
        logError('创建临时目录出错,请检查目录 ' + dest + '是否存在');

    setTimeout(function () {
        ep.emit('mvn-clean');
    }, 500);
});
//子进程
var cProcess;

ep.tail('mvn-clean', function () {
    //ep.emit('copy-project');
    //清理target
    logInfo('mvn clean...');
    cProcess = child_process.exec("mvn clean", {cwd: workspace + sp + pName}, function (error) {
        if (error)
            logError(error);

        logSuccess('mvn clean success');

        ep.emit('copy-project');
    });
    output(cProcess);
});

//复制项目副本
ep.tail('copy-project', function () {
    logInfo('copy project...');
    var xcopyCom;
    if (iswin)
        xcopyCom = 'XCOPY ' + root.replace(/\//g, '\\') + ' ' + dest + ' /e /exclude:' + path + '\\exclude.txt';
    else
        xcopyCom = 'cp -a ' + root + '/. ' + dest;

    cProcess = child_process.exec(xcopyCom, {cwd: workspace, maxBuffer: 5000 * 1024}, function (error) {
        if (error)
            logError(error);

        logSuccess('copy project success');

        ep.emit('check-js');
    });
    //output(cProcess);
});

//检查JS
ep.tail('check-js', function () {
    ep.emit('minifier-js');
});

//合并压缩JS
ep.tail('minifier-js', function () {
    logInfo('handle index.html...');

    //再处理首页
    ep.emit('handle-index', function () {
        //递归处理片段
        walk(dest + _static + sp + 'pages', function (item) {
                ep.emit('handle-fragment', item);
            },
            function () {
                //处理线调首页
                handle_real_ctl.handleMain(function () {
                    //处理线调地图
                    handle_real_ctl.handleMap(function () {
                        //处理单屏地图页面
                        handle_real_ctl.handleAlonePage(function () {
                            //处理单屏主页
                            handle_real_ctl.handleAloneHomePage(function () {
                                ep.emit('package-jar');
                            });
                        });
                    });
                });
            });
    });
});

//打包
ep.tail('package-jar', function (file) {
    var packageCom = 'mvn clean package -DskipTests';
    cProcess = child_process.exec(packageCom, {maxBuffer: 5000 * 1024, cwd: dest}, function (error) {
        if (error)
            logError(error);

        logSuccess('mvn package success');

        console.log(('成功打包在 ' + dest + sp + 'target 目录下').cyan);
    });

    output(cProcess);
});

//处理片段
ep.tail('handle-fragment', function (file) {
    //要排除的文件
    for (var i = 0, ex; ex = excludes[i++];) {
        if (file.indexOf(_pages + sp + ex) != -1)
            return false;
    }
    handleJavascript(file, function (mini, $) {
        var jsMini;
        if (mini.inside)
            jsMini = '(function(){' + mini.inside + '\n' + mini.outside + '})();';
        else
            jsMini = '(function(){' + mini.outside + '})();';

        write(file, $.html() + '<script>' + jsMini + '</script>');
    });

});

//处理首页
ep.tail('handle-index', function (cb) {
    var index = dest + _static + sp + 'index.html';
    handleJavascript(index, function (mini, $) {
        var jsMiniText = mini.inside + mini.outside;

        var code = md5(jsMiniText);
        fs.open(dest + _static + sp + 'assets' + sp + 'js' + sp + code + '.js', 'a', function (err, fd) {
            if (err)
                logError(err);

            fs.write(fd, jsMiniText, function () {
                var ss = $('script');

                $(ss[ss.length - 1]).before('<script src="/assets/js/' + code + '.js"></script>\n');
                for (var i = 0, s; s = ss[i++];) {
                    $(s).removeAttr('data-exclude')
                        .removeAttr('flag')
                        .removeAttr('data-autocephaly');
                }
                write(index, $.html());

                cb && cb();
            });
        });
    });
});


function handleJavascript(item, cb) {
    //解析页面
    var htmlResult = parse.html(item, dest + _static)
        , jsArray = htmlResult.jsArray
        , $ = htmlResult.$
        , scrStr = htmlResult.scriptString;

    //合并压缩
    var mini = minifier.mergeAndMini(jsArray, scrStr, dest + _static, item);

    cb && cb(mini, $);
}

function removeJsLink(s, e) {
    var newArray = [], flag;

    for (var i = 0, si; si = s[i++];) {
        flag = 0;
        for (var j = 0, ei; ei = e[j++];) {
            if (si.indexOf(ei) != -1) {
                flag = -1;
                break;
            }
        }

        if (flag == 0) {
            newArray.push(si);
        }
    }
    return newArray;
}

function write(file, text) {
    fs.writeFile(file, text, function (err) {
        if (err) {
            console.log(err.toString().red);
            process.exit();
        }
        //console.log(file.green);
    });
}

function md5(text) {
    return crypto.createHash("md5").update(text).digest("hex");
}


function walk(path, handleFile, over) {
    fs.readdir(path, function (err, files) {
        if (err) {
            console.log('read dir error'.red);
        } else {
            files.forEach(function (item) {
                var tmpPath = path + sp + item;
                fs.stat(tmpPath, function (err1, stats) {
                    if (err1) {
                        console.log('stat error');
                    } else {
                        if (stats.isDirectory()) {
                            walk(tmpPath, handleFile);
                        } else if (item.indexOf('.html') != -1) {
                            handleFile(tmpPath);
                        }
                    }
                })
            });

            over && over();
        }
    });
}

function logInfo(t) {
    console.log(t);
}

function logSuccess(t) {
    console.log(t.green);
}

function logError(e) {
    console.log(e.toString().red);
    process.exit();
}

function output(cProcess) {
    //标准输出
    cProcess.stdout.on('data', function (s) {
        console.log(s);
    });
}