🔧 模块资源类型相关(SourceTypes)
setChunkModuleSourceTypes(chunk, module, sourceTypes)
为某个 chunk 中的某个模块设置 sourceTypes,并更新缓存。
getChunkModuleSourceTypes(chunk, module)
获取某个 chunk 中某个模块的 sourceTypes,优先从缓存中取,默认使用模块自身的值。
getModuleSourceTypes(module)
获取某个模块在其所有 chunk 中合并后的 sourceTypes,用于跨 chunk 判断。
_getOverwrittenModuleSourceTypes(module)
内部方法:合并所有包含该模块的 chunk 中的 sourceTypes,如果类型不同就合并成一个新集合。
📦 Chunk 模块集合操作
getOrderedChunkModulesIterable(chunk, comparator)
获取某个 chunk 的模块集合(可迭代),并按给定排序函数排序。
getOrderedChunkModulesIterableBySourceType(chunk, sourceType, comparator)
获取指定 chunk 中指定 sourceType 类型的模块集合(可迭代、已排序)。
getChunkModules(chunk)
获取 chunk 中所有模块的数组(无序、缓存版本,不可修改)。
getOrderedChunkModules(chunk, comparator)
获取 chunk 中所有模块的数组(有序、缓存版本,不可修改)。
🔗 Chunk 模块 ID/Hash 映射
getChunkModuleIdMap(chunk, filterFn, includeAllChunks = false)
遍历 chunk 的所有异步子 chunk(或所有引用 chunk),获取符合条件的模块 ID 映射表。
格式:{ chunkId: [moduleId, ...] }
getChunkModuleRenderedHashMap(chunk, filterFn, hashLength = 0, includeAllChunks = false)
获取 chunk 的模块 ID 到模块渲染 hash 的映射表,可截断 hash 长度。
格式:{ chunkId: { moduleId: hash } }
setChunkModuleSourceTypes(chunk, module, sourceTypes) {
const cgc = this._getChunkGraphChunk(chunk);
if (cgc.sourceTypesByModule === undefined) {
cgc.sourceTypesByModule = new WeakMap();
}
cgc.sourceTypesByModule.set(module, sourceTypes);
cgc._modulesBySourceType = modulesBySourceType(cgc.sourceTypesByModule);
}
getChunkModuleSourceTypes(chunk, module) {
const cgc = this._getChunkGraphChunk(chunk);
if (cgc.sourceTypesByModule === undefined) {
return module.getSourceTypes();
}
return cgc.sourceTypesByModule.get(module) || module.getSourceTypes();
}
getModuleSourceTypes(module) {
return (
this._getOverwrittenModuleSourceTypes(module) || module.getSourceTypes()
);
}
_getOverwrittenModuleSourceTypes(module) {
let newSet = false;
let sourceTypes;
for (const chunk of this.getModuleChunksIterable(module)) {
const cgc = this._getChunkGraphChunk(chunk);
if (cgc.sourceTypesByModule === undefined) return;
const st = cgc.sourceTypesByModule.get(module);
if (st === undefined) return;
if (!sourceTypes) {
sourceTypes = st;
continue;
} else if (!newSet) {
for (const type of st) {
if (!sourceTypes.has(type)) {
newSet = true;
sourceTypes = new Set(sourceTypes);
sourceTypes.add(type);
}
}
} else {
for (const type of st) sourceTypes.add(type);
}
}
return sourceTypes;
}
getOrderedChunkModulesIterable(chunk, comparator) {
const cgc = this._getChunkGraphChunk(chunk);
cgc.modules.sortWith(comparator);
return cgc.modules;
}
getOrderedChunkModulesIterableBySourceType(chunk, sourceType, comparator) {
const cgc = this._getChunkGraphChunk(chunk);
const modulesWithSourceType = cgc.modules
.getFromUnorderedCache(cgc._modulesBySourceType)
.get(sourceType);
if (modulesWithSourceType === undefined) return;
modulesWithSourceType.sortWith(comparator);
return modulesWithSourceType;
}
getChunkModules(chunk) {
const cgc = this._getChunkGraphChunk(chunk);
return cgc.modules.getFromUnorderedCache(getArray);
}
getOrderedChunkModules(chunk, comparator) {
const cgc = this._getChunkGraphChunk(chunk);
const arrayFunction = createOrderedArrayFunction(comparator);
return cgc.modules.getFromUnorderedCache(arrayFunction);
}
getChunkModuleIdMap(chunk, filterFn, includeAllChunks = false) {
const chunkModuleIdMap = Object.create(null);
for (const asyncChunk of includeAllChunks
? chunk.getAllReferencedChunks()
: chunk.getAllAsyncChunks()) {
let array;
for (const module of this.getOrderedChunkModulesIterable(
asyncChunk,
compareModulesById(this)
)) {
if (filterFn(module)) {
if (array === undefined) {
array = [];
chunkModuleIdMap[asyncChunk.id] = array;
}
const moduleId = this.getModuleId(module);
array.push(moduleId);
}
}
}
return chunkModuleIdMap;
}
getChunkModuleRenderedHashMap(
chunk,
filterFn,
hashLength = 0,
includeAllChunks = false
) {
const chunkModuleHashMap = Object.create(null);
for (const asyncChunk of includeAllChunks
? chunk.getAllReferencedChunks()
: chunk.getAllAsyncChunks()) {
let idToHashMap;
for (const module of this.getOrderedChunkModulesIterable(
asyncChunk,
compareModulesById(this)
)) {
if (filterFn(module)) {
if (idToHashMap === undefined) {
idToHashMap = Object.create(null);
chunkModuleHashMap[asyncChunk.id] = idToHashMap;
}
const moduleId = this.getModuleId(module);
const hash = this.getRenderedModuleHash(module, asyncChunk.runtime);
idToHashMap[moduleId] = hashLength
? hash.slice(0, hashLength)
: hash;
}
}
}
return chunkModuleHashMap;
}