Skip to content

Commit 876f50e

Browse files
authored
feat(stats): add module reason locations and module trace dependencies (#9049)
* feat(stats): add module reason locations and module trace dependencies * feat(stats): add module reason locations and module trace dependencies
1 parent 5318eec commit 876f50e

File tree

19 files changed

+318
-63
lines changed

19 files changed

+318
-63
lines changed

crates/node_binding/binding.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,11 +1043,19 @@ export interface JsStatsModuleReason {
10431043
moduleChunks?: number
10441044
type?: string
10451045
userRequest?: string
1046+
explanation?: string
1047+
active: boolean
1048+
loc?: string
10461049
}
10471050

10481051
export interface JsStatsModuleTrace {
10491052
origin: JsStatsModuleTraceModule
10501053
module: JsStatsModuleTraceModule
1054+
dependencies: Array<JsStatsModuleTraceDependency>
1055+
}
1056+
1057+
export interface JsStatsModuleTraceDependency {
1058+
loc: string
10511059
}
10521060

10531061
export interface JsStatsModuleTraceModule {

crates/rspack_binding_values/src/stats.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,15 @@ impl From<rspack_core::StatsWarning<'_>> for JsStatsWarning {
157157
pub struct JsStatsModuleTrace {
158158
pub origin: JsStatsModuleTraceModule,
159159
pub module: JsStatsModuleTraceModule,
160+
pub dependencies: Vec<JsStatsModuleTraceDependency>,
160161
}
161162

162163
impl From<rspack_core::StatsModuleTrace> for JsStatsModuleTrace {
163164
fn from(stats: rspack_core::StatsModuleTrace) -> Self {
164165
Self {
165166
origin: stats.origin.into(),
166167
module: stats.module.into(),
168+
dependencies: stats.dependencies.into_iter().map(Into::into).collect(),
167169
}
168170
}
169171
}
@@ -187,6 +189,17 @@ impl From<rspack_core::StatsErrorModuleTraceModule> for JsStatsModuleTraceModule
187189
}
188190
}
189191

192+
#[napi(object, object_from_js = false)]
193+
pub struct JsStatsModuleTraceDependency {
194+
pub loc: String,
195+
}
196+
197+
impl From<rspack_core::StatsErrorModuleTraceDependency> for JsStatsModuleTraceDependency {
198+
fn from(stats: rspack_core::StatsErrorModuleTraceDependency) -> Self {
199+
Self { loc: stats.loc }
200+
}
201+
}
202+
190203
#[napi(object, object_from_js = false)]
191204
pub struct JsStatsLogging {
192205
pub name: String,
@@ -673,6 +686,9 @@ pub struct JsStatsModuleReason {
673686
pub module_chunks: Option<u32>,
674687
pub r#type: Option<&'static str>,
675688
pub user_request: Option<String>,
689+
pub explanation: Option<&'static str>,
690+
pub active: bool,
691+
pub loc: Option<String>,
676692
}
677693

678694
impl From<rspack_core::StatsModuleReason<'_>> for JsStatsModuleReason {
@@ -697,6 +713,9 @@ impl From<rspack_core::StatsModuleReason<'_>> for JsStatsModuleReason {
697713
module_chunks: stats.module_chunks,
698714
r#type: stats.r#type,
699715
user_request: stats.user_request.map(|i| i.to_owned()),
716+
explanation: stats.explanation,
717+
active: stats.active,
718+
loc: stats.loc,
700719
}
701720
}
702721
}

crates/rspack_core/src/module_graph/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ pub type ImportVarMap =
2828
#[derive(Debug)]
2929
pub struct DependencyExtraMeta {
3030
pub ids: Vec<Atom>,
31+
pub explanation: Option<&'static str>,
3132
}
3233

3334
#[derive(Debug, Default, Clone)]

crates/rspack_core/src/stats/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,10 @@ impl Stats<'_> {
946946
} else {
947947
(None, None)
948948
};
949+
let loc = dependency.and_then(|d| d.loc()).map(|l| l.to_string());
950+
let explanation = module_graph
951+
.get_dep_meta_if_existing(&connection.dependency_id)
952+
.and_then(|extra| extra.explanation);
949953
Some(StatsModuleReason {
950954
module_identifier: connection.original_module_identifier,
951955
module_name,
@@ -967,6 +971,9 @@ impl Stats<'_> {
967971
resolved_module_id: resolved_module_id.and_then(|i| i),
968972
r#type,
969973
user_request,
974+
explanation,
975+
active: connection.active,
976+
loc,
970977
})
971978
})
972979
.collect();

crates/rspack_core/src/stats/struct.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ pub struct StatsWarning<'s> {
7878
pub struct StatsModuleTrace {
7979
pub origin: StatsErrorModuleTraceModule,
8080
pub module: StatsErrorModuleTraceModule,
81+
pub dependencies: Vec<StatsErrorModuleTraceDependency>,
8182
}
8283

8384
#[derive(Debug)]
@@ -87,6 +88,11 @@ pub struct StatsErrorModuleTraceModule {
8788
pub id: Option<String>,
8889
}
8990

91+
#[derive(Debug)]
92+
pub struct StatsErrorModuleTraceDependency {
93+
pub loc: String,
94+
}
95+
9096
#[derive(Debug)]
9197
pub struct StatsAsset {
9298
pub r#type: &'static str,
@@ -267,6 +273,9 @@ pub struct StatsModuleReason<'s> {
267273

268274
pub r#type: Option<&'static str>,
269275
pub user_request: Option<&'s str>,
276+
pub explanation: Option<&'static str>,
277+
pub active: bool,
278+
pub loc: Option<String>,
270279
}
271280

272281
#[derive(Debug)]

crates/rspack_core/src/stats/utils.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
55
use rspack_collections::Identifier;
66
use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet};
77

8-
use super::{Stats, StatsChunkGroup, StatsErrorModuleTraceModule, StatsModule, StatsModuleTrace};
8+
use super::{
9+
Stats, StatsChunkGroup, StatsErrorModuleTraceDependency, StatsErrorModuleTraceModule,
10+
StatsModule, StatsModuleTrace,
11+
};
912
use crate::{
1013
BoxModule, Chunk, ChunkByUkey, ChunkGraph, ChunkGroupByUkey, ChunkGroupOrderKey, ChunkGroupUkey,
1114
Compilation, CompilerOptions, ModuleGraph,
@@ -189,10 +192,19 @@ pub fn get_module_trace(
189192
)
190193
.map(|s| s.to_string()),
191194
};
195+
let dependencies = module_graph
196+
.get_incoming_connections(&module_identifier)
197+
.filter_map(|c| {
198+
let dep = module_graph.dependency_by_id(&c.dependency_id)?;
199+
let loc = dep.loc().map(|loc| loc.to_string())?;
200+
Some(StatsErrorModuleTraceDependency { loc })
201+
})
202+
.collect::<Vec<_>>();
192203

193204
module_trace.push(StatsModuleTrace {
194205
origin: origin_stats_module,
195206
module: current_stats_module,
207+
dependencies,
196208
});
197209

198210
current_module_identifier = Some(origin_module.identifier());

crates/rspack_plugin_javascript/src/plugin/side_effects_flag_plugin.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,13 @@ fn do_optimize_connection(
822822
need_move_target,
823823
} = do_optimize;
824824
module_graph.do_update_module(&dependency, &target_module);
825-
module_graph.set_dependency_extra_meta(dependency, DependencyExtraMeta { ids });
825+
module_graph.set_dependency_extra_meta(
826+
dependency,
827+
DependencyExtraMeta {
828+
ids,
829+
explanation: Some("(skipped side-effect-free modules)"),
830+
},
831+
);
826832
if let Some(SideEffectsDoOptimizeMoveTarget {
827833
export_info,
828834
target_export,

packages/rspack-test-tools/tests/__snapshots__/NewCodeSplitting-stats-output.test.js.snap

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ chunk {909} (runtime: main) bundle.js (main) 7 bytes (asset) 159 bytes (javascri
1818
| ./raw.png [193] 42 bytes (javascript) 7 bytes (asset) {909} [depth 1] [built] [code generated]
1919
| [no exports]
2020
| [no exports used]
21-
| esm import ./raw.png ./index.js
21+
| esm import ./raw.png ./index.js 2:0-33
2222
./raw.png [193] 42 bytes (javascript) 7 bytes (asset) {909} [depth 1] [built] [code generated]
2323
[no exports]
2424
[no exports used]
25-
esm import ./raw.png ./index.js
25+
esm import ./raw.png ./index.js 2:0-33
2626
modules by path ./ 235 bytes (javascript) 7 bytes (asset)
2727
orphan modules 76 bytes [orphan]
2828
./index.js 75 bytes [depth 0] [orphan] [built]
@@ -33,7 +33,7 @@ modules by path ./ 235 bytes (javascript) 7 bytes (asset)
3333
[no exports]
3434
[module unused]
3535
ModuleConcatenation bailout: Module is not an ECMAScript module
36-
esm import ./stringModule [686] ./index.js
36+
esm import ./stringModule [686] ./index.js 1:0-41
3737
code generated modules 159 bytes (javascript) 7 bytes (asset) [code generated]
3838
./index.js + 1 modules [686] 117 bytes {909} [depth 0] [code generated]
3939
[no exports]
@@ -46,11 +46,11 @@ modules by path ./ 235 bytes (javascript) 7 bytes (asset)
4646
| ./raw.png [193] 42 bytes (javascript) 7 bytes (asset) {909} [depth 1] [built] [code generated]
4747
| [no exports]
4848
| [no exports used]
49-
| esm import ./raw.png ./index.js
49+
| esm import ./raw.png ./index.js 2:0-33
5050
./raw.png [193] 42 bytes (javascript) 7 bytes (asset) {909} [depth 1] [built] [code generated]
5151
[no exports]
5252
[no exports used]
53-
esm import ./raw.png ./index.js
53+
esm import ./raw.png ./index.js 2:0-33
5454
runtime modules 1.61 KiB
5555
webpack/runtime/auto_public_path 1.39 KiB {909} [code generated]
5656
[no exports]
@@ -374,7 +374,7 @@ exports[`new code splitting stats output new code splitting stats output/reasons
374374
entry ./index
375375
./a.js 55 bytes [built] [code generated]
376376
cjs self exports reference self ./a.js
377-
cjs require ./a ./index.js
377+
cjs require ./a ./index.js 1:18-24
378378
`;
379379
380380
exports[`new code splitting stats output new code splitting stats output/resolve-overflow-error should print correct stats for: NewCodeSplittingStatsOutput 1`] = `

0 commit comments

Comments
 (0)