08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / build / webpack.prod.conf.js
// 多进程 编译所有
//parallel-webpack允许您并行运行多个Webpack构建,从而将工作分散到各个处理器上,从而有助于显着加快构建速度
// const os = require('os');
// const cpus = os.cpus().length;
// console.log(cpus, ' Math.floor(cpus/2)||1', Math.floor(cpus / 2) || 1)
const chalk = require('chalk')
let webpack = require('webpack')
let argvs = (process.argv[2] || "").replace(/\s*$/g, "");
let moduleList = argvs != "" ? argvs.split(',') : [];
let isAllBuild = moduleList.length==0;
let startTime = new Date().valueOf();
let webpackList = require('./webpack.get-list.js');
let moduleCount = webpackList.length;

//  秒数转化为时分秒
function formatSeconds(value) {
  //  秒
  let second = parseInt(value)
  //  分
  let minute = 0
  //  小时
  let hour = 0
  //  天
  //  let day = 0
  //  如果秒数大于60,将秒数转换成整数
  if (second > 60) {
    //  获取分钟,除以60取整数,得到整数分钟
    minute = parseInt(second / 60)
    //  获取秒数,秒数取佘,得到整数秒数
    second = parseInt(second % 60)
    //  如果分钟大于60,将分钟转换成小时
    if (minute > 60) {
      //  获取小时,获取分钟除以60,得到整数小时
      hour = parseInt(minute / 60)
      //  获取小时后取佘的分,获取分钟除以60取佘的分
      minute = parseInt(minute % 60)
      //  如果小时大于24,将小时转换成天
      //  if (hour > 23) {
      //    //  获取天数,获取小时除以24,得到整天数
      //    day = parseInt(hour / 24)
      //    //  获取天数后取余的小时,获取小时除以24取余的小时
      //    hour = parseInt(hour % 24)
      //  }
    }
  }

  let result = '' + parseInt(second) + '秒'
  if (minute > 0) {
    result = '' + parseInt(minute) + '分' + result
  }
  if (hour > 0) {
    result = '' + parseInt(hour) + '小时' + result
  }
  //  if (day > 0) {
  //    result = '' + parseInt(day) + '天' + result
  //  }
  return result
}

let timerCtl = setInterval(function () {
  console.log(chalk.green(`正在编译中,目前已消耗 ${formatSeconds((new Date().valueOf() - startTime) / 1000)} ...`))
}, 1000 * 60 * 5);

//----------- 【一般编译,按参数,一个接一个的】 ---------------
function DoWebpackBuild(list, start, total, step = 1) {
  let wpkCfg, isEndAll = false;
  if (list == null || list.length == 0) {
    console.log(chalk.yellow(`没有模块可编译!`));
    clearInterval(timerCtl);
    return;
  }
  wpkCfg = list.slice(start, start + step);
  if (wpkCfg == null || wpkCfg.length == 0) {
    isEndAll = true;
    clearInterval(timerCtl);
    console.log(chalk.green(`【总消耗】 ${formatSeconds((new Date().valueOf() - startTime) / 1000)}`));
    return;
  }

  console.log('****************************************************************\n');
  for(let i=0,l=wpkCfg.length;i<l;i++){
    console.log(wpkCfg[i].output.path.split('dist')[1]);
  }
  if(step==1){
    console.log(`【进度 ${start+1}/${total} 】,正在编译模块...\n`);
  }else{
    console.log(`【进度 ${start+1}/${total} 】,正在编译${start+1} - ${total < step ? total : start + step}之间的模块...\n`);
  }
  console.log('****************************************************************\n');

  let cmper = webpack(wpkCfg);
  let cmperStep = 5,cmperTotal=5;
  cmper.apply(new webpack.ProgressPlugin({
    handler(percentage, message, ...args) {
      // console.log(args.length,'...args', args[0],'\n', args[1],'\n', args[2])
      let t = (new Date().valueOf() - startTime) / 1000;

      if(t>cmperTotal){
        cmperTotal+=cmperStep;
        // console.log(` 进度 : ${(percentage*100).toFixed(2)} %`)//,message
        console.log(`{"progress":${percentage.toFixed(4)},"message":""}`);
      }
      console.log(`{"progress":${percentage.toFixed(4)},"message":""}`);

    },
  }));
  cmper.run((err, stats) => {
    //这个回调一定要写,不然打包不出来
    if (err || stats.hasErrors()) {//编译错误不在 err 对象内,而是需要使用 stats.hasErrors() 单独处理
      let info = {};
      try {
        info = stats.toJson();
      } catch (e) {
        info = {
          errors: []
        };
        console.log('stats.toJson()', err, stats)
      }
      // console.error(info.errors);
      for (let i = 0, l = info.errors.length; i < l; i++) {
        // console.log(chalk.red(info.errors[i].message));
        // console.error(info.errors[i].message)
        console.error('build_error:'+info.errors[i])
      }
    }
    // 处理完成
    if (isEndAll) {
      cmperTotal = 10;
      clearInterval(timerCtl);
      console.log(chalk.green(`【总消耗】 ${formatSeconds((new Date().valueOf() - startTime) / 1000)}\n`));
    } else {
      DoWebpackBuild(list, start + step, total, step);
    }
  })

}


if (isAllBuild) {
  //-------- 【用parallel-webpack,全部编译情况下】 ------------
  /*
  moduleList = require('./webpack.get-module').moduleList || [];
  console.log(`=========进入全模块编译状态(${moduleList.length})模块...=============`)
  var run = require('parallel-webpack').run;
  run(
    require.resolve('./webpack.get-list.js'), 
    {
      watch: false,
      maxRetries: 1,
      stats: false, // defaults to false
      maxConcurrentWorkers: 1,// use 2 workers  cup个数
      argv: [argvs]
    }, ()=>{
      //多打包时,如果其中一个模块出错,不知道是哪个模块
      console.log('\n--------编译完成------- \n');
    });
  */
  console.log(`【编译所有 共${moduleCount}】============搜索文件耗时:${formatSeconds((new Date().valueOf() - startTime) / 1000)}\n`)
  DoWebpackBuild(webpackList, 0, moduleCount);//, 0, len
  //以上两种时间上差不多   20s
} else {
  console.log(`【按需编译 共${moduleCount}】============搜索文件耗时:${formatSeconds((new Date().valueOf() - startTime) / 1000)}\n`)
  DoWebpackBuild(webpackList, 0, moduleCount,1)//, 0, len
}