const { mainPkgName } = require('../constant'); function analyzeGoDirection (usageMap, appJson, emitFileMap) { const copyComponentsForNormalPkgMap = {}; const copyComponentsForMainPkg = new Set(); const globalComponents = appJson.usingComponents || {}; for (const [originalWxComponentPath, usageInfo] of usageMap) { const [pkgSet, pageOrComponentPaths] = usageInfo; // 被主包用到 或者 被多个分包用到,则组件放置主包中 if (pkgSet.has(mainPkgName) || pkgSet.size > 1) { copyComponentsForMainPkg.add(originalWxComponentPath); continue; } // 到这里说明仅仅被一个普通分包使用,则将该组件复制到该普通分包中去 const pkgRoot = [...pkgSet][0]; const newComponentPath = `/${pkgRoot}${originalWxComponentPath}`; if (!copyComponentsForNormalPkgMap[pkgRoot]) { copyComponentsForNormalPkgMap[pkgRoot] = new Set(); } copyComponentsForNormalPkgMap[pkgRoot].add(originalWxComponentPath); // 当前组件是否是全局组件 const componentTagInGlobal = Object.keys(globalComponents).find(compoName => originalWxComponentPath === globalComponents[compoName]); // 该组件 originalWxComponentPath 可能是以全局方式引入有可能是在json文件中声明引用 // 甚至可能是两种方式都存在,只是 tag 不一样 (pageOrComponentPaths || []).forEach(jsonFilePath => { const jsonFileInfo = emitFileMap.get(jsonFilePath); // 以全局方式引入该组件 if (componentTagInGlobal) { delete globalComponents[componentTagInGlobal]; // 从全局组件配置中删除 jsonFileInfo.usingComponents[componentTagInGlobal] = newComponentPath; // 更新当前引用路径为分包路径 } // 以json文件声明方式引入,则需要更新json文件声明的路径 const usingComponents = jsonFileInfo.usingComponents; const componentTagInPage = Object.keys(usingComponents).find(compoName => originalWxComponentPath === usingComponents[compoName]); if (componentTagInPage) { jsonFileInfo.usingComponents[componentTagInPage] = newComponentPath; } if (componentTagInPage || componentTagInGlobal) { const replaceInfo = `jsonFilePath: ${jsonFilePath}, originalWxComponentPath: ${originalWxComponentPath}, newComponentPath: ${newComponentPath}`; // console.log(`replace componentPath used only by normal package, ${replaceInfo}`); } }); } return { copyForNormal: copyComponentsForNormalPkgMap, copyForMain: { [mainPkgName]: copyComponentsForMainPkg } }; } module.exports = analyzeGoDirection;