Skip to content

Commit fad967a

Browse files
authored
refactor: recalculate all chunk ids with cache (#12374)
1 parent 1d7b488 commit fad967a

File tree

58 files changed

+293
-415
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+293
-415
lines changed

crates/rspack_binding_api/src/chunk.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ impl Chunk {
4545
#[napi(getter)]
4646
pub fn id(&self) -> napi::Result<Either<&str, ()>> {
4747
let (compilation, chunk) = self.as_ref()?;
48-
Ok(match chunk.id(&compilation.chunk_ids_artifact) {
48+
Ok(match chunk.id() {
4949
Some(id) => Either::A(id.as_str()),
5050
None => Either::B(()),
5151
})
@@ -54,12 +54,7 @@ impl Chunk {
5454
#[napi(getter)]
5555
pub fn ids(&self) -> napi::Result<Vec<&str>> {
5656
let (compilation, chunk) = self.as_ref()?;
57-
Ok(
58-
chunk
59-
.id(&compilation.chunk_ids_artifact)
60-
.map(|id| vec![id.as_str()])
61-
.unwrap_or_default(),
62-
)
57+
Ok(chunk.id().map(|id| vec![id.as_str()]).unwrap_or_default())
6358
}
6459

6560
#[napi(getter)]
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use rspack_collections::UkeyMap;
2+
3+
use crate::{ChunkUkey, chunk_graph_chunk::ChunkId};
4+
5+
#[derive(Debug, Default)]
6+
pub struct ChunkNamedIdArtifact {
7+
pub chunk_short_names: UkeyMap<ChunkUkey, String>,
8+
pub chunk_long_names: UkeyMap<ChunkUkey, String>,
9+
pub chunk_ids: UkeyMap<ChunkUkey, ChunkId>,
10+
}
11+
12+
impl ChunkNamedIdArtifact {
13+
pub fn clear(&mut self) {
14+
self.chunk_short_names.clear();
15+
self.chunk_long_names.clear();
16+
self.chunk_ids.clear();
17+
}
18+
19+
pub fn retain<F>(&mut self, mut f: F)
20+
where
21+
F: FnMut(&ChunkUkey) -> bool,
22+
{
23+
self.chunk_short_names.retain(|chunk, _| f(chunk));
24+
self.chunk_long_names.retain(|chunk, _| f(chunk));
25+
self.chunk_ids.retain(|chunk, _| f(chunk));
26+
}
27+
28+
pub fn remove(&mut self, chunk: &ChunkUkey) {
29+
self.chunk_short_names.remove(chunk);
30+
self.chunk_long_names.remove(chunk);
31+
self.chunk_ids.remove(chunk);
32+
}
33+
}

crates/rspack_core/src/artifacts/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use rspack_collections::{IdentifierMap, IdentifierSet, UkeyMap};
22
use rspack_error::Diagnostic;
33

4-
use crate::{ChunkRenderResult, ChunkUkey, ModuleId, RuntimeGlobals, chunk_graph_chunk::ChunkId};
4+
use crate::{ChunkRenderResult, ChunkUkey, ModuleId, RuntimeGlobals};
55

66
mod cgm_hash_artifact;
77
mod cgm_runtime_requirement_artifact;
88
mod chunk_hashes_artifact;
9+
mod chunk_ids_artifact;
910
mod chunk_render_cache_artifact;
1011
mod code_generation_results;
1112
mod module_graph_cache_artifact;
@@ -15,6 +16,7 @@ mod side_effects_do_optimize_artifact;
1516
pub use cgm_hash_artifact::*;
1617
pub use cgm_runtime_requirement_artifact::*;
1718
pub use chunk_hashes_artifact::*;
19+
pub use chunk_ids_artifact::*;
1820
pub use chunk_render_cache_artifact::ChunkRenderCacheArtifact;
1921
pub use code_generation_results::*;
2022
pub use module_graph_cache_artifact::*;
@@ -25,6 +27,5 @@ pub type AsyncModulesArtifact = IdentifierSet;
2527
pub type ImportedByDeferModulesArtifact = IdentifierSet;
2628
pub type DependenciesDiagnosticsArtifact = IdentifierMap<Vec<Diagnostic>>;
2729
pub type ModuleIdsArtifact = IdentifierMap<ModuleId>;
28-
pub type ChunkIdsArtifact = UkeyMap<ChunkUkey, ChunkId>;
2930
pub type CgcRuntimeRequirementsArtifact = UkeyMap<ChunkUkey, RuntimeGlobals>;
3031
pub type ChunkRenderArtifact = UkeyMap<ChunkUkey, ChunkRenderResult>;

crates/rspack_core/src/chunk.rs

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ use rspack_hash::{RspackHash, RspackHashDigest};
1313
use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet, FxHasher};
1414

1515
use crate::{
16-
ChunkGraph, ChunkGroupByUkey, ChunkGroupOrderKey, ChunkGroupUkey, ChunkHashesArtifact,
17-
ChunkIdsArtifact, ChunkUkey, Compilation, EntryOptions, Filename, ModuleGraph,
18-
RenderManifestEntry, RuntimeSpec, SourceType, chunk_graph_chunk::ChunkId, compare_chunk_group,
19-
sort_group_by_index,
16+
ChunkGraph, ChunkGroupByUkey, ChunkGroupOrderKey, ChunkGroupUkey, ChunkHashesArtifact, ChunkUkey,
17+
Compilation, EntryOptions, Filename, ModuleGraph, RenderManifestEntry, RuntimeSpec, SourceType,
18+
chunk_graph_chunk::ChunkId, compare_chunk_group, sort_group_by_index,
2019
};
2120

2221
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -57,6 +56,7 @@ pub struct ChunkRenderResult {
5756
pub struct Chunk {
5857
ukey: ChunkUkey,
5958
kind: ChunkKind,
59+
id: Option<ChunkId>,
6060
// - If the chunk is create by entry config, the name is the entry name
6161
// - The name of chunks create by dynamic import is `None` unless users use
6262
// magic comment like `import(/* webpackChunkName: "someChunk" * / './someModule.js')` to specify it.
@@ -110,19 +110,24 @@ impl Chunk {
110110
self.css_filename_template = filename_template;
111111
}
112112

113-
pub fn id<'a>(&self, chunk_ids: &'a ChunkIdsArtifact) -> Option<&'a ChunkId> {
114-
ChunkGraph::get_chunk_id(chunk_ids, &self.ukey)
113+
pub fn id(&self) -> Option<&ChunkId> {
114+
self.id.as_ref()
115115
}
116116

117-
pub fn expect_id<'a>(&self, chunk_ids: &'a ChunkIdsArtifact) -> &'a ChunkId {
118-
self
119-
.id(chunk_ids)
120-
.expect("Should set id before calling expect_id")
117+
pub fn expect_id(&self) -> &ChunkId {
118+
self.id().expect("Should set id before calling expect_id")
121119
}
122120

123-
pub fn set_id(&self, chunk_ids: &mut ChunkIdsArtifact, id: impl Into<ChunkId>) -> bool {
124-
let id = id.into();
125-
ChunkGraph::set_chunk_id(chunk_ids, self.ukey, id)
121+
pub fn set_id(&mut self, id: impl Into<ChunkId>) -> bool {
122+
let id: ChunkId = id.into();
123+
if let Some(prev_id) = &self.id
124+
&& prev_id == &id
125+
{
126+
return false;
127+
}
128+
129+
self.id = Some(id);
130+
true
126131
}
127132

128133
pub fn prevent_integration(&self) -> bool {
@@ -280,6 +285,7 @@ impl Chunk {
280285
filename_template: None,
281286
css_filename_template: None,
282287
ukey: ChunkUkey::new(),
288+
id: None,
283289
id_name_hints: Default::default(),
284290
prevent_integration: false,
285291
files: Default::default(),
@@ -667,14 +673,11 @@ impl Chunk {
667673
chunks
668674
}
669675

670-
pub fn name_for_filename_template<'a>(
671-
&'a self,
672-
chunk_ids: &'a ChunkIdsArtifact,
673-
) -> Option<&'a str> {
676+
pub fn name_for_filename_template(&self) -> Option<&str> {
674677
if self.name.is_some() {
675678
self.name.as_deref()
676679
} else {
677-
self.id(chunk_ids).map(|id| id.as_str())
680+
self.id().map(|id| id.as_str())
678681
}
679682
}
680683

@@ -687,7 +690,7 @@ impl Chunk {
687690
}
688691

689692
pub fn update_hash(&self, hasher: &mut RspackHash, compilation: &Compilation) {
690-
self.id(&compilation.chunk_ids_artifact).hash(hasher);
693+
self.id().hash(hasher);
691694
let runtime_modules = compilation
692695
.chunk_graph
693696
.get_chunk_runtime_modules_iterable(&self.ukey)
@@ -853,7 +856,7 @@ impl Chunk {
853856
&& let Some(chunk_id) = compilation
854857
.chunk_by_ukey
855858
.expect_get(chunk_ukey)
856-
.id(&compilation.chunk_ids_artifact)
859+
.id()
857860
.cloned()
858861
{
859862
chunk_ids.push(chunk_id);
@@ -883,7 +886,7 @@ impl Chunk {
883886
) -> Option<(ChunkId, Vec<ChunkId>)> {
884887
let chunk = compilation.chunk_by_ukey.expect_get(chunk_ukey);
885888
if let (Some(chunk_id), Some(child_chunk_ids)) = (
886-
chunk.id(&compilation.chunk_ids_artifact).cloned(),
889+
chunk.id().cloned(),
887890
chunk.get_child_ids_by_order(order, compilation, filter_fn),
888891
) {
889892
return Some((chunk_id, child_chunk_ids));

crates/rspack_core/src/chunk_graph/chunk_graph_chunk.rs

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use serde::{Serialize, Serializer};
1212

1313
use crate::{
1414
BoxModule, Chunk, ChunkByUkey, ChunkGraph, ChunkGraphModule, ChunkGroupByUkey, ChunkGroupUkey,
15-
ChunkIdsArtifact, ChunkUkey, Compilation, Module, ModuleGraph, ModuleGraphCacheArtifact,
16-
ModuleIdentifier, RuntimeGlobals, RuntimeModule, SourceType, find_graph_roots, merge_runtime,
15+
ChunkUkey, Compilation, Module, ModuleGraph, ModuleGraphCacheArtifact, ModuleIdentifier,
16+
RuntimeGlobals, RuntimeModule, SourceType, find_graph_roots, merge_runtime,
1717
};
1818

1919
#[derive(Debug, Clone, Default)]
@@ -719,10 +719,7 @@ impl ChunkGraph {
719719
.iter()
720720
{
721721
let chunk = compilation.chunk_by_ukey.expect_get(c);
722-
map.insert(
723-
chunk.expect_id(&compilation.chunk_ids_artifact).to_string(),
724-
filter(c, compilation),
725-
);
722+
map.insert(chunk.expect_id().to_string(), filter(c, compilation));
726723
}
727724

728725
map
@@ -1154,23 +1151,4 @@ impl ChunkGraph {
11541151
})
11551152
.unwrap_or(module.source_types(module_graph).iter().copied().collect())
11561153
}
1157-
1158-
pub fn get_chunk_id<'a>(
1159-
chunk_ids: &'a ChunkIdsArtifact,
1160-
chunk_ukey: &ChunkUkey,
1161-
) -> Option<&'a ChunkId> {
1162-
chunk_ids.get(chunk_ukey)
1163-
}
1164-
1165-
pub fn set_chunk_id(
1166-
chunk_ids: &mut ChunkIdsArtifact,
1167-
chunk_ukey: ChunkUkey,
1168-
id: ChunkId,
1169-
) -> bool {
1170-
if let Some(old_id) = chunk_ids.insert(chunk_ukey, id.clone()) {
1171-
old_id != id
1172-
} else {
1173-
true
1174-
}
1175-
}
11761154
}

crates/rspack_core/src/chunk_group.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ impl ChunkGroup {
285285
compilation
286286
.chunk_by_ukey
287287
.get(chunk)
288-
.and_then(|item| item.id(&compilation.chunk_ids_artifact))
288+
.and_then(|item| item.id())
289289
})
290290
.join("+")
291291
}

crates/rspack_core/src/compilation/build_module_graph/module_executor/execute.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@ impl Task<ExecutorTaskContext> for ExecuteTask {
224224
let mut chunk = Chunk::new(Some("build time chunk".into()), ChunkKind::Normal);
225225

226226
if let Some(name) = chunk.name() {
227-
chunk.set_id(&mut compilation.chunk_ids_artifact, name);
227+
let name = name.to_string();
228+
chunk.set_id(name);
228229
}
229230
let runtime: RuntimeSpec = once("build time".into()).collect();
230231

crates/rspack_core/src/compilation/mod.rs

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,17 @@ use crate::{
4444
AsyncModulesArtifact, BindingCell, BoxDependency, BoxModule, CacheCount, CacheOptions,
4545
CgcRuntimeRequirementsArtifact, CgmHashArtifact, CgmRuntimeRequirementsArtifact, Chunk,
4646
ChunkByUkey, ChunkContentHash, ChunkGraph, ChunkGroupByUkey, ChunkGroupUkey, ChunkHashesArtifact,
47-
ChunkIdsArtifact, ChunkKind, ChunkRenderArtifact, ChunkRenderCacheArtifact, ChunkRenderResult,
48-
ChunkUkey, CodeGenerationJob, CodeGenerationResult, CodeGenerationResults, CompilationLogger,
49-
CompilationLogging, CompilerOptions, ConcatenationScope, DependenciesDiagnosticsArtifact,
50-
DependencyCodeGeneration, DependencyTemplate, DependencyTemplateType, DependencyType,
51-
DerefOption, Entry, EntryData, EntryOptions, EntryRuntime, Entrypoint, ExecuteModuleId, Filename,
52-
ImportPhase, ImportVarMap, ImportedByDeferModulesArtifact, Logger, MemoryGCStorage,
53-
ModuleFactory, ModuleGraph, ModuleGraphCacheArtifact, ModuleGraphMut, ModuleGraphPartial,
54-
ModuleGraphRef, ModuleIdentifier, ModuleIdsArtifact, ModuleStaticCacheArtifact, PathData,
55-
ResolverFactory, RuntimeGlobals, RuntimeKeyMap, RuntimeMode, RuntimeModule, RuntimeSpec,
56-
RuntimeSpecMap, RuntimeTemplate, SharedPluginDriver, SideEffectsOptimizeArtifact, SourceType,
57-
Stats, ValueCacheVersions,
47+
ChunkKind, ChunkNamedIdArtifact, ChunkRenderArtifact, ChunkRenderCacheArtifact,
48+
ChunkRenderResult, ChunkUkey, CodeGenerationJob, CodeGenerationResult, CodeGenerationResults,
49+
CompilationLogger, CompilationLogging, CompilerOptions, ConcatenationScope,
50+
DependenciesDiagnosticsArtifact, DependencyCodeGeneration, DependencyTemplate,
51+
DependencyTemplateType, DependencyType, DerefOption, Entry, EntryData, EntryOptions,
52+
EntryRuntime, Entrypoint, ExecuteModuleId, Filename, ImportPhase, ImportVarMap,
53+
ImportedByDeferModulesArtifact, Logger, MemoryGCStorage, ModuleFactory, ModuleGraph,
54+
ModuleGraphCacheArtifact, ModuleGraphMut, ModuleGraphPartial, ModuleGraphRef, ModuleIdentifier,
55+
ModuleIdsArtifact, ModuleStaticCacheArtifact, PathData, ResolverFactory, RuntimeGlobals,
56+
RuntimeKeyMap, RuntimeMode, RuntimeModule, RuntimeSpec, RuntimeSpecMap, RuntimeTemplate,
57+
SharedPluginDriver, SideEffectsOptimizeArtifact, SourceType, Stats, ValueCacheVersions,
5858
build_chunk_graph::artifact::BuildChunkGraphArtifact,
5959
compilation::build_module_graph::{
6060
BuildModuleGraphArtifact, ModuleExecutor, UpdateParam, build_module_graph,
@@ -254,8 +254,8 @@ pub struct Compilation {
254254
pub side_effects_optimize_artifact: DerefOption<SideEffectsOptimizeArtifact>,
255255
// artifact for module_ids
256256
pub module_ids_artifact: ModuleIdsArtifact,
257-
// artifact for chunk_ids
258-
pub chunk_ids_artifact: ChunkIdsArtifact,
257+
// artifact for named_chunk_ids
258+
pub named_chunk_ids_artifact: ChunkNamedIdArtifact,
259259
// artifact for code_generation
260260
pub code_generation_results: BindingCell<CodeGenerationResults>,
261261
// artifact for create_module_hashes
@@ -393,7 +393,7 @@ impl Compilation {
393393
),
394394
side_effects_optimize_artifact: DerefOption::new(Default::default()),
395395
module_ids_artifact: Default::default(),
396-
chunk_ids_artifact: Default::default(),
396+
named_chunk_ids_artifact: Default::default(),
397397
code_generation_results: Default::default(),
398398
cgm_hash_artifact: Default::default(),
399399
cgm_runtime_requirements_artifact: Default::default(),
@@ -2010,7 +2010,6 @@ impl Compilation {
20102010
entrypoint_ukey: &ChunkGroupUkey,
20112011
chunk_group_by_ukey: &ChunkGroupByUkey,
20122012
chunk_by_ukey: &ChunkByUkey,
2013-
chunk_ids: &ChunkIdsArtifact,
20142013
chunk_graph: &mut ChunkGraph,
20152014
) {
20162015
let entrypoint = chunk_group_by_ukey.expect_get(entrypoint_ukey);
@@ -2026,15 +2025,14 @@ impl Compilation {
20262025
runtime,
20272026
chunk_by_ukey.get(&entrypoint.get_runtime_chunk(chunk_group_by_ukey)),
20282027
) {
2029-
chunk_graph.set_runtime_id(runtime, chunk.id(chunk_ids).map(|id| id.to_string()));
2028+
chunk_graph.set_runtime_id(runtime, chunk.id().map(|id| id.to_string()));
20302029
}
20312030
}
20322031
for i in self.entrypoints.iter() {
20332032
process_entrypoint(
20342033
i.1,
20352034
&self.chunk_group_by_ukey,
20362035
&self.chunk_by_ukey,
2037-
&self.chunk_ids_artifact,
20382036
&mut self.chunk_graph,
20392037
)
20402038
}
@@ -2043,7 +2041,6 @@ impl Compilation {
20432041
i,
20442042
&self.chunk_group_by_ukey,
20452043
&self.chunk_by_ukey,
2046-
&self.chunk_ids_artifact,
20472044
&mut self.chunk_graph,
20482045
)
20492046
}
@@ -2529,17 +2526,14 @@ impl Compilation {
25292526
.filter(|(_, (_, remaining))| *remaining != 0)
25302527
.map(|(chunk_ukey, _)| self.chunk_by_ukey.expect_get(chunk_ukey))
25312528
.collect();
2532-
circular.sort_unstable_by(|a, b| {
2533-
a.id(&self.chunk_ids_artifact)
2534-
.cmp(&b.id(&self.chunk_ids_artifact))
2535-
});
2529+
circular.sort_unstable_by(|a, b| a.id().cmp(&b.id()));
25362530
runtime_chunks.extend(circular.iter().map(|chunk| chunk.ukey()));
25372531
let circular_names = circular
25382532
.iter()
25392533
.map(|chunk| {
25402534
chunk
25412535
.name()
2542-
.or(chunk.id(&self.chunk_ids_artifact).map(|id| id.as_str()))
2536+
.or(chunk.id().map(|id| id.as_str()))
25432537
.unwrap_or("no id chunk")
25442538
})
25452539
.join(", ");

crates/rspack_core/src/compiler/rebuild.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ impl Compiler {
127127
.incremental
128128
.mutations_readable(IncrementalPasses::CHUNK_IDS)
129129
{
130-
new_compilation.chunk_ids_artifact =
131-
std::mem::take(&mut self.compilation.chunk_ids_artifact);
130+
new_compilation.named_chunk_ids_artifact =
131+
std::mem::take(&mut self.compilation.named_chunk_ids_artifact);
132132
}
133133
if new_compilation
134134
.incremental
@@ -234,10 +234,7 @@ impl CompilationRecords {
234234
let mut hashes = FxHashMap::default();
235235
for chunk in compilation.chunk_graph.get_module_chunks(*identifier) {
236236
let chunk = compilation.chunk_by_ukey.expect_get(chunk);
237-
let chunk_id = chunk
238-
.id(&compilation.chunk_ids_artifact)
239-
.expect("should have chunk_id")
240-
.clone();
237+
let chunk_id = chunk.id().expect("should have chunk_id").clone();
241238
let hash = compilation
242239
.code_generation_results
243240
.get_hash(identifier, Some(chunk.runtime()))
@@ -282,7 +279,7 @@ impl CompilationRecords {
282279
.values()
283280
.filter(|chunk| chunk.kind() != ChunkKind::HotUpdate)
284281
.map(|chunk| {
285-
let chunk_id = chunk.expect_id(&compilation.chunk_ids_artifact).clone();
282+
let chunk_id = chunk.expect_id().clone();
286283
let chunk_runtime = chunk.runtime().clone();
287284
let chunk_modules: FxHashSet<ModuleId> = compilation
288285
.chunk_graph

0 commit comments

Comments
 (0)