// 遍历jsonFiles,根据文件路径前缀判断属于哪个包(vue组件完全基于路径划分包归属 const { appJsonFileName, wxComponentsStr, mainPkgName } = require('../constant'); const { getIndependentPkgRoots, getNormalPkgRoots } = require('../util'); // 原生组件被主包和普通分包的使用情况 function collectWxComponentUsedStatus (emitFileMap) { const normalSubPkgRoots = getNormalPkgRoots(); const independentSubPkgRoots = getIndependentPkgRoots(); const usageByPkgMap = new Map(); for (const [jsonFileKey, jsonFileInfo] of emitFileMap) { if (jsonFileKey === appJsonFileName) { continue; } const explicitComponents = jsonFileInfo.usingComponents || {}; // 非全局组件 const usingGlobalWxComponents = jsonFileInfo.usingGlobalComponents || {}; // FIX 全局组件和直接引用的组件名称相同的情况 const currentAllComponents = Object.assign({}, usingGlobalWxComponents, explicitComponents); // 忽略独立分包下面的组件或页面,即收集主包和普通分包的依赖情况 const findPkg = subPkgRoot => jsonFileKey.startsWith(subPkgRoot); const independentPkgRoot = independentSubPkgRoots.find(findPkg); // 忽略独立分包页面 if (independentPkgRoot) continue; // 找出当前页面所属包(普通分包页面还是主包页面 const pkgName = normalSubPkgRoots.find(findPkg) || mainPkgName; Object.keys(currentAllComponents).forEach(componentName => { const componentPath = currentAllComponents[componentName]; if (componentPath.startsWith(`/${wxComponentsStr}`)) { if (!usageByPkgMap.get(componentPath)) { usageByPkgMap.set(componentPath, [new Set(), []]); } usageByPkgMap.get(componentPath)[0].add(pkgName); usageByPkgMap.get(componentPath)[1].push(jsonFileKey); } }); } return usageByPkgMap; } module.exports = collectWxComponentUsedStatus;