Files

158 lines
5.8 KiB
JavaScript
Raw Permalink Normal View History

2025-11-14 11:39:33 +08:00
const path = require('path');
const fs = require('fs-extra');
const { getGlobalUsingComponents } = require('@dcloudio/uni-cli-shared/lib/cache');
const { wxComponentsStr, outerComponents } = require('./constant');
const { generateAsset } = require('../utils');
function getGlobalComponentKeyByGlobalComponentPath () {
const globalUsingComponents = getGlobalUsingComponents();
const globalComponentInfoMap = {};
for (let componentKey in globalUsingComponents) {
const componentPath = globalUsingComponents[componentKey];
globalComponentInfoMap[componentPath] = componentKey;
}
return globalComponentInfoMap;
}
function getIndependentPkgRoots () {
return Object.values(process.UNI_SUBPACKAGES || []).filter(item => item.independent).map(item => item.root);
}
function getNormalPkgRoots () {
return Object.values(process.UNI_SUBPACKAGES || []).filter(item => !item.independent).map(item => item.root);
}
function getIndependentEntryPages (subPkgRoot) {
const subPages = [];
(Object.keys(process.UNI_SUB_PACKAGES_ROOT) || []).forEach(subPkgPagePath => {
const root = process.UNI_SUB_PACKAGES_ROOT[subPkgPagePath];
if (root === subPkgRoot) {
subPages.push(subPkgPagePath);
}
});
return subPages;
}
function getMainPkgPages () {
return (process.UNI_PAGES.pages || []).map(pageInfo => pageInfo.path);
}
function collectPkgCopyFiles (components, wxComponentFileDependencyCache, logPrefix = '') {
const allFiles = [];
components.forEach(component => {
// console.log(logPrefix, `copy component ${component}`);
const cacheFiles = wxComponentFileDependencyCache[component] || [];
allFiles.push(...cacheFiles);
});
return allFiles;
}
function copyAllWxComponentsFiles (key, files = [], copyHandler) {
const targetPathPrefix = `${process.env.UNI_OUTPUT_DIR}/${key}/`;
files.forEach(originalFilePath => {
const relativePath = path.relative(process.env.UNI_INPUT_DIR, originalFilePath);
const targetPath = path.resolve(targetPathPrefix, relativePath);
if (copyHandler) {
return copyHandler(originalFilePath, targetPath, relativePath);
}
fs.copySync(originalFilePath, targetPath);
});
}
// 不带 首杠
function getNewComponentPathInIndependentPkg (independentRoot, componentPath) {
// 相对路径不处理
if (componentPath.startsWith('.')) {
return componentPath;
}
if (componentPath.startsWith('/')) {
componentPath = componentPath.substring(1);
}
if (componentPath.startsWith(`${independentRoot}`)) {
return componentPath;
}
let pathPrefix = `${independentRoot}/`;
if (componentPath.indexOf(wxComponentsStr) >= 0) {
return `${pathPrefix}${componentPath}`;
}
return `${pathPrefix}${outerComponents}/${componentPath}`;
}
// 收集用到的所有包外组件
function collectAllOutSideComponentsMap (independentRoot, emitFileMap, entryPage, cacheForAll = new Set(), cacheForGlobal = new Map()) {
if (entryPage.startsWith('/')) {
entryPage = entryPage.substring(1);
}
const jsonFileInfo = emitFileMap.get(`${entryPage}.json`);
if (!jsonFileInfo) { // 只看vue组件
return;
}
const explicitComponents = jsonFileInfo.usingComponents || {}; // 非全局组件
const usingGlobalComponents = jsonFileInfo.usingGlobalComponents || {}; // 全局组件(忽略原生组件引用全局组件的场景)
const allUsingComponents = Object.assign({}, usingGlobalComponents, explicitComponents);
const allComponentsPath = Object.values(allUsingComponents);
const globalComponents = Object.values(usingGlobalComponents);
allComponentsPath.forEach(componentPath => {
if (!componentPath.startsWith(`/${independentRoot}`)) {
cacheForAll.add(componentPath);
}
// 全局组件
if (globalComponents.includes(componentPath)) {
const originalSet = cacheForGlobal.get(componentPath);
const pageSet = originalSet || new Set();
if (!originalSet) {
cacheForGlobal.set(componentPath, pageSet);
}
pageSet.add(entryPage);
}
collectAllOutSideComponentsMap(independentRoot, emitFileMap, componentPath, cacheForAll, cacheForGlobal);
});
}
function getJsonByPageOrComponentPath (pageOrComponentPath, sourceRepo) {
const { emitFileMap, compilationAssets } = sourceRepo;
if (pageOrComponentPath.startsWith('/')) {
pageOrComponentPath = pageOrComponentPath.substring(1);
}
const pathWithSuffix = `${pageOrComponentPath}.json`;
const assetInfo = compilationAssets[pathWithSuffix]; // 原生组件的json文件在copy时保存到了 compilationAssets
const jsonObj = assetInfo && JSON.parse(assetInfo.source().toString());
try {
return {
content: emitFileMap.get(pathWithSuffix) || jsonObj,
fromAssetsFlag: !!jsonObj
};
} catch (e) {
console.error('util', e);
}
}
function collectIndependentJsAssets (compilationAssets) {
const independentPkgRoots = getIndependentPkgRoots();
const jsAssets = Object.keys(compilationAssets).filter(assetName => assetName.endsWith('.js'));
return independentPkgRoots.map(independentRoot => {
return {
independentRoot, jsAssets: jsAssets.filter(assetName => assetName.startsWith(independentRoot)) || [],
};
});
}
module.exports = {
getJsonByPageOrComponentPath,
getNewComponentPathInIndependentPkg,
collectIndependentJsAssets,
getGlobalComponentKeyByGlobalComponentPath,
getNormalPkgRoots,
getIndependentPkgRoots,
getIndependentEntryPages,
getMainPkgPages,
copyAllWxComponentsFiles,
collectPkgCopyFiles,
collectAllOutSideComponentsMap,
generateAsset
};