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