const fs = require("fs"); var chalk = require('chalk') var glob = require('glob') const packageConfig = require('../package.json') const projectName = packageConfig.name == 'hi-vui-template' ? 'project' : packageConfig.name; // 获取所有的moduleList var moduleList = [] // console.time() moduleList = glob.sync(`./${projectName}/!(dist|node_modules|build)/**/package.json`);// 这个执行比较快 114.811ms for(let i=moduleList.length-1;i>=0;i--){ moduleList[i]= moduleList[i].replace(/\/package\.json/gi,'') } // console.timeEnd() // console.log(moduleList); /* // 需要忽略的文件夹 const ignores = 'dist,node_modules,build'.split(',') function getAllModule(dir) { var files = fs.readdirSync(dir), isFind = false; //判断是否有模块存在 for (var i = 0; i < files.length; i++) { if (ignores.includes(files[i])) continue; if (files[i] == "package.json") { moduleList.push(dir); isFind = true; break; } } if (isFind == false) { for (var i = 0; i < files.length; i++) { if (ignores.includes(files[i])) continue var file = dir + '/' + files[i] var stat = fs.statSync(file) if (stat.isDirectory() == true) { getAllModule(file); } } } } // console.time() // console.log('指定目录:',projectName) getAllModule('./'+projectName);//指定目录 开始搜索模块 这个执行比较慢 1.829ms // console.timeEnd() */ // 检测是否在输入的参数是否在允许的list中 var checkModule = function (module) { var module = module || process.env.MODULE_ENV; // 检查moduleList是否有重复 var hash = {} var repeatList = [] for (var l = 0; l < moduleList.length; l++) { if (hash[moduleList[l]]) { repeatList.push(moduleList[l]) } hash[moduleList[l]] = true } if (repeatList.length > 0) { console.log(chalk.red('moduleList 有重复:')) console.log(chalk.red(repeatList.toString())) return false } let result = true let illegalParam = '' for (let moduleToBuild of module.split(',')) { if (moduleList.indexOf(moduleToBuild) === -1) { result = false illegalParam = moduleToBuild break } } if (result === false) { console.log(chalk.red('参数错误,允许的参数为:')) console.log(chalk.green(moduleList.toString())) console.log(chalk.yellow(`非法参数:${illegalParam}`)) } return result } // 获取当前要打包的模块列表 function getModuleToBuild() { let moduleToBuild = [] if (process.env.NODE_ENV === 'production') { /* 部署态,构建要打包的模块列表,如果指定了要打包的模块,那么按照指定的模块配置入口 * 这里有个特性,即使参数未传,那么获取到的undefined也是字符串类型的,不是undefined类型 * */ if (process.env.MODULE_ENV !== 'undefined') { moduleToBuild = process.env.MODULE_ENV.split(',') } else { // 如果未指定要打包的模块,那么打包所有模块 moduleToBuild = moduleList } } else { // 开发态,获取所有的模块列表 moduleToBuild = moduleList } return moduleToBuild } exports.moduleList = moduleList exports.checkModule = checkModule exports.getModuleToBuild = getModuleToBuild