diff --git a/crates/rspack_core/src/build_chunk_graph/available_modules.rs b/crates/rspack_core/src/build_chunk_graph/available_modules.rs index 89163063410e..2b2529401adc 100644 --- a/crates/rspack_core/src/build_chunk_graph/available_modules.rs +++ b/crates/rspack_core/src/build_chunk_graph/available_modules.rs @@ -89,14 +89,17 @@ pub fn remove_available_modules( chunk_parents: &mut [Vec], chunk_children: &mut [Vec], ) { - let mut chunk_incomings: Vec = chunk_parents.iter().map(|parents| parents.len()).collect(); + let mut chunk_incomings: Vec> = chunk_parents + .iter() + .map(|parents| parents.iter().copied().collect()) + .collect(); let mut pending = HashSet::::default(); let module_graph = compilation.get_module_graph(); let mut stack = roots .iter() .filter(|root| { - let is_entry_without_depend_on = chunk_incomings[**root] == 0 && matches!(&chunks[**root].1.chunk_desc, ChunkDesc::Entry(box EntryChunkDesc{initial, ..}) if *initial); + let is_entry_without_depend_on = chunk_incomings[**root].is_empty() && matches!(&chunks[**root].1.chunk_desc, ChunkDesc::Entry(box EntryChunkDesc{initial, ..}) if *initial); if is_entry_without_depend_on { pending.insert(**root); } @@ -111,10 +114,6 @@ pub fn remove_available_modules( while let Some((parent_available_modules, chunk_index, force_continue)) = stack.pop() { let (_, chunk) = &mut chunks[chunk_index]; - if chunk_incomings[chunk_index] >= 1 { - chunk_incomings[chunk_index] -= 1; - } - let curr_parents_modules = if let Some(curr) = &mut available_modules[chunk_index] { // if already calculated let res = if force_continue { @@ -138,14 +137,13 @@ pub fn remove_available_modules( }; // we have incomings that are not calculated, wait till we calculated - if chunk_incomings[chunk_index] != 0 { + if !chunk_incomings[chunk_index].is_empty() && !force_continue { pending.insert(chunk_index); continue; } // if we reach here, means all incomings have calculated (if no cycle) //, we can continue calculate children - pending.remove(&chunk_index); let curr_chunk_modules = chunk.chunk_desc.chunk_modules_ordinal(); let child_available = curr_parents_modules.union(curr_chunk_modules); @@ -153,6 +151,8 @@ pub fn remove_available_modules( for child in &chunk_children[chunk_index] { let child_chunk = &mut chunks[*child].1.chunk_desc; + chunk_incomings[*child].remove(&chunk_index); + if matches!( &child_chunk, ChunkDesc::Entry(box EntryChunkDesc { initial, .. }) if !initial