08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / build / webpack.get-list.js
var fsextra = require('fs-extra');
const path = require("path");
const glob = require('glob')
// const fs = require("fs");
// const {Chalk} = require('chalk')
const merge = require('webpack-merge');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const baseWebpackConfig = require('./webpack.base.conf');

const packageConfig = require('../package.json');
const projectName = packageConfig.name == 'hi-vui-template' ? 'project' : packageConfig.name
// console.log('---------------------webpack.get-list.js------------', process.env.NODE_ENV)
function repeat(array) {
  let map = new Map();
  let array1 = []; // 数组用于返回结果                    
  for (let i = 0, leng = array.length; i < leng; i++) {
    if (map.has(array[i])) {
      // 判断是否存在key                            
      map.set(array[i], true);
    } else {
      map.set(array[i], false);
      array1.push(array[i]);
    }
  }
  return array1;
}

// 用来记录当前打包的模块路径列表,判断进程参数
let argvs = (process.argv[2] || "").replace(/\s*$/g, "")
let moduleList = [];
let isBuildAll = true;
if (argvs) {
  isBuildAll = false;
  moduleList = [];
  let list = argvs.split(',');
  for (let i = 0, l = list.length; i < l; i++) {
    // let checkPath = fs.existsSync(list[i]+'/package.json');
    //如果目录存在 返回 true ,如果目录不存在 返回false
    // if (checkPath == false) continue;
    let modulePath = list[i].replace(/:空格:/gi,' ');//特别处理资源文件有空格的文件名
    
    let pathList = glob.sync(modulePath + '/package.json'); // 这个执行比较快 114.811ms
    if (pathList.length == 0) {
      // 查找modulePath目录
      // let ls = glob.sync(`${modulePath}/!(dist|node_modules|build)/**/package.json`)
      // for (let k = 0, l = ls.length; k < l; k++) {
      //   moduleList.push(ls[k].replace('/package.json', ''));
      // }
      if (modulePath == './assets_platform' || modulePath == './error') {
        let res = modulePath.replace('./', '');
        var isexist = fsextra.existsSync(path.resolve(__dirname, '../', res));
        isexist && fsextra.copySync(path.resolve(__dirname, '../', res), path.resolve(__dirname, '../dist/', res), {
          overwrite: false,
          // errorOnExist:false
        }) //拷贝模块资源目录  
      } else if (/\/deploy\/desktop\/[\w,\/,\.]*\/dpdst\/[\w,\/,\.]*(\.dpdst)$/.test(modulePath)) { //服务部署环境配置的.json
        let buildScheme = fsextra.readJsonSync(path.resolve(__dirname, '../', modulePath.replace('.dpdst', '.json')));
        let settingPath = path.resolve(__dirname, '../dist/', projectName + '/setting/desktop/appsetting.js');
        if (buildScheme.appSetting == null) {
          console.log('build_error:部署环境文件没有绑定,无法同步appSetting!');
          break;
        }
        fsextra.copySync(path.resolve(__dirname, '../', buildScheme.appSetting), settingPath, {
          overwrite: false,
          // errorOnExist:false
        }) //拷贝模块资源目录  
      } else { // if(/(\/res)$/.test(modulePath))
        let res = modulePath.replace('./', '');
        var isexist = fsextra.existsSync(path.resolve(__dirname, '../', res));
        isexist && fsextra.copySync(path.resolve(__dirname, '../', res), path.resolve(__dirname, '../dist/', res), {
          overwrite: false,
          // errorOnExist:false
        }) //拷贝模块资源目录  
      }
      continue
    } else {
      moduleList.push(modulePath);
    }
  }
} else {
  //编译所有,找出模块
  moduleList = require('./webpack.get-module').moduleList || [];
  
  
  //拷贝模块资源目录  
  let res = './assets_platform'.replace('./', '');
  let isexist = fsextra.existsSync(path.resolve(__dirname, '../', res));
  isexist && fsextra.copySync(path.resolve(__dirname, '../', res), path.resolve(__dirname, '../dist/', res), {
    overwrite: false,
    // errorOnExist:false
  }) 

  res = `./${projectName}/lang`.replace('./', '');
  isexist = fsextra.existsSync(path.resolve(__dirname, '../', res));
  isexist && fsextra.copySync(path.resolve(__dirname, '../', res), path.resolve(__dirname, '../dist/', res), {
    overwrite: false,
    // errorOnExist:false
  }) 


}
moduleList = repeat(moduleList); //去重

let evnConfig = require('./getEnvVar')

let webpackList = [],
  resList = [];
//构建webpack 配置

for (let i = 0, l = moduleList.length; i < l; i++) {
  let MODULE = moduleList[i];
  // console.log('---------------模块-------------',MODULE)
  if (isBuildAll) {
    //全部编译时拷资源文件res
    let res = MODULE.indexOf('/view') > -1 ? MODULE.split('view')[0] + 'res' : '';
    // console.log('=========================',res)
    if (res) {
      res = res.replace('./', '');
      var isexist = fsextra.existsSync(path.resolve(__dirname, '..', res));
      if (isexist) {
        // console.log('拷贝模块资源目录====',path.resolve(__dirname, '..', res))
        fsextra.copySync(path.resolve(__dirname, '..', res), path.resolve(__dirname, '../dist', res), {
          overwrite: false,
          // errorOnExist:false
        }) //拷贝模块资源目录    
      }

    }
  }
  // continue;
  //添加每个模块的webpack 配置
  let MODULE_NAME = MODULE.split('/').pop();
  let entry = {};
  let outputPath = path.resolve(__dirname, '../dist', MODULE)
  entry[MODULE_NAME] = ['babel-polyfill', `${MODULE}/index.js`]; // @babel/polyfill
  let wpk = merge({
    mode: 'production',
    // mode: 'development',
    // devtool: 'source-map',
  }, baseWebpackConfig, {
    entry: entry,
    output: {
      path: outputPath,
      filename: `static/js/[name].js`,
      // publicPath:'./'
      // publicPath: `/${evnConfig.VITE_APP_SERVER.replace(/"/gi,"")}/render/${packageConfig.author}/${MODULE.replace('./', '')}/`
      publicPath: `${evnConfig.VITE_APP_USERPATH.replace(/"/gi,"")}/${MODULE.replace('./', '')}/`
    }
  });
  let htmlTemplate = `${MODULE}/index.html`

  // var checkPath = fs.existsSync(htmlTemplate);
  // //如果目录存在 返回 true ,如果目录不存在 返回false
  // if (checkPath == false) {
  //   htmlTemplate = path.resolve(__dirname, './template.html')
  // }
  let pathList = glob.sync(htmlTemplate); // 这个执行比较快 114.811ms
  if (pathList.length == 0) htmlTemplate = path.resolve(__dirname, './template.html');

  wpk.plugins.push(new CleanWebpackPlugin([outputPath], {
    root: path.resolve(__dirname, '../'), //根目录
    //其他配置按需求添加
    verbose: false, //不提示删除
  }));
  wpk.plugins.push(
    new MiniCssExtractPlugin({
      filename: 'static/css/[name].[contenthash].css',
      chunkFilename: `static/css/[name].[contenthash].css`
    })
  );
  wpk.plugins.push(
    new HtmlWebpackPlugin({
      filename: path.resolve(__dirname, '../dist', MODULE, 'index.html'),
      template: htmlTemplate, //如果html 不存在考虑用全局根目录下
      inject: true,
      minify: {
        removeComments: true, //去除注释
        collapseWhitespace: true, //是否去除空格
        removeAttributeQuotes: true //去除空属性
      },
      compile: true
    }))

  var isexist = fsextra.existsSync(path.resolve(__dirname, '../', MODULE, 'lang'));
  if (isexist) {
    wpk.plugins.push(
      new CopyWebpackPlugin([{
        from: path.resolve(__dirname, '../', MODULE, 'lang'),
        to: path.resolve(__dirname, '../dist/', MODULE, 'lang'),
      }])
    )
  }
  webpackList.push(wpk);
}


module.exports = webpackList; // [webpackList[4]] ////[webpackList[3]];//27