08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / build / build.js
caibinghong on 3 Dec 2021 adda
'use strict'
require('./check-versions')()
const fs = require("fs")
const chalk = require('chalk')
const { merge } = require('webpack-merge');

const packageConfig = require('../package.json')
process.env.NODE_ENV = 'production'
// 用来记录当前打包的模块路径列表
let moduleList = (process.argv[2] || "").replace(/\s*$/g, "")
if (moduleList == "") {
  moduleList = require('./module-conf').moduleList || []
} else {
  moduleList = moduleList.split(',')
}
// console.log('----moduleList-----:\n',moduleList,'\n----------------------')
// 如果有传参时,对传入的参数进行检测,如果参数非法,那么停止打包操作
const checkModule = require('./module-conf').checkModule
for (let i = moduleList.length - 1; i >= 0; i--) {
  if (!checkModule(moduleList[i])) {
    return
  }
}

const path = require('path')
// const ora = require('ora')
const rm = require('rimraf')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const webpackConfig = require('./webpack.base.conf')
let webpackList = [], rmList = [];

//删除文件
function getRm(pathStr) {
  return new Promise((resolve, reject) => {
    rm(pathStr, err => {
      if (err) {
        reject(pathStr + 'del failed!!');
        throw err;
      }
      resolve();
    });
  }).then(res => {
    //console.log(res)
  });
}

//构建webpack 配置
for (let i = moduleList.length - 1; i >= 0; i--) {
  let MODULE = moduleList[i]; 
  //构建时要删除的模块目录 
  rmList.push(getRm(path.resolve(__dirname, '../dist', MODULE)));
  //添加每个模块的webpack 配置
  let MODULE_NAME = MODULE.split('/').pop(); 
  let entry = {};
  entry[MODULE_NAME] = `${moduleList[i]}/index.js`;
  let wpk = merge({}, webpackConfig, {
    entry: entry,
    output: {
      path: path.resolve(__dirname, '../dist', MODULE),
      publicPath:`/e5/render/${packageConfig.author}/${MODULE.replace('./','')}`
    }
  });
  let htmlTemplate = `${MODULE}/index.html`

  var checkPath = fs.existsSync(htmlTemplate);
  //如果目录存在 返回 true ,如果目录不存在 返回false
  if (checkPath == false) {
    htmlTemplate = path.resolve(__dirname, '../index.html')
  }

  wpk.plugins.push(
    new HtmlWebpackPlugin({
      filename: path.resolve(__dirname, '../dist', MODULE, 'index.html'),
      template: htmlTemplate,//如果html 不存在考虑用全局根目录下
      inject: true,
      // 这里要指定把哪些chunks追加到html中,默认会把所有入口的chunks追加到html中,这样是不行的
      // chunks: ['vendor', 'manifest', 'elementUI', 'hiui', MODULE_NAME],
      minify: {
        removeComments: true,//去除注释
        collapseWhitespace: true,//是否去除空格
      }
    }))
  webpackList.push(wpk);
} 
//编译所有
// webpack(webpackList, (err, stats) => {
//     if (err || stats.hasErrors()) {//编译错误不在 err 对象内,而是需要使用 stats.hasErrors() 单独处理
//       const info = stats.toJson();
//       // console.error(info.errors);
//       for(let i=0,l=info.errors.length;i<l;i++){
//         console.log(chalk.red(info.errors[i].message));
//       }
//       // process.exit(1);
//     }
//   // console.log(chalk.cyan('  Build complete.\n'));
// });

console.log(chalk.green(`正在编译,总共(${moduleList.length})页面...`))
console.log(`===============================================================`);
console.log(chalk.yellow(`序号\t         模块\t      路径`));
console.log(`=================================================================`);
let webpackIndex=0;
function doWebpack(webpackItem){
  let mods = [];
  for(let name in webpackItem.entry){
    let ent = webpackItem.entry[name];
    ent = ent.replace(/\/index\.js/gi,'');
    ent = ent.replace(/\/dtv\/1\.0\.0\/desktop/gi,'');
    ent = ent.split('/').pop(); 
    console.log(`${webpackIndex}\t${ent}\t     路径`,webpackItem.entry[name]);
  }
  webpack(webpackItem, (err, stats) => {
    if (err || stats.hasErrors()) {//编译错误不在 err 对象内,而是需要使用 stats.hasErrors() 单独处理
      const info = stats.toJson();
      // console.error(info.errors);
      for(let i=0,l=info.errors.length;i<l;i++){
        console.log(chalk.red(info.errors[i].message));
      }
      // process.exit(1);
    }
    //else{
      // 处理完成
      webpackIndex++;
      webpackList[webpackIndex]&&doWebpack(webpackList[webpackIndex]);
    // }    
  });
}
doWebpack(webpackList[webpackIndex]);