刮刮前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

44 lines
1.9 KiB

// 遍历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;