Skip to content

Commit 738b79c

Browse files
authored
fix: tree-shaking unused RawModule (#10954)
See: webpack/webpack#19670 This is a port of webpack/webpack#19671
1 parent fd51703 commit 738b79c

File tree

8 files changed

+78
-15
lines changed

8 files changed

+78
-15
lines changed

crates/rspack_core/src/context_module_factory.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ use tracing::instrument;
1212

1313
use crate::{
1414
resolve, BoxDependency, CompilationId, ContextElementDependency, ContextModule,
15-
ContextModuleOptions, DependencyCategory, DependencyId, DependencyType, ErrorSpan, ModuleExt,
16-
ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult, ModuleIdentifier, RawModule,
17-
ResolveArgs, ResolveContextModuleDependencies, ResolveInnerOptions,
15+
ContextModuleOptions, DependencyCategory, DependencyId, DependencyType, ErrorSpan, FactoryMeta,
16+
ModuleExt, ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult, ModuleIdentifier,
17+
RawModule, ResolveArgs, ResolveContextModuleDependencies, ResolveInnerOptions,
1818
ResolveOptionsWithDependencyType, ResolveResult, Resolver, ResolverFactory, SharedPluginDriver,
1919
};
2020

@@ -315,13 +315,18 @@ impl ContextModuleFactory {
315315
Ok(ResolveResult::Ignored) => {
316316
let ident = format!("{}/{}", data.context, specifier);
317317
let module_identifier = ModuleIdentifier::from(format!("ignored|{ident}"));
318-
let raw_module = RawModule::new(
318+
let mut raw_module = RawModule::new(
319319
"/* (ignored) */".to_owned(),
320320
module_identifier,
321321
format!("{specifier} (ignored)"),
322322
Default::default(),
323323
)
324324
.boxed();
325+
326+
raw_module.set_factory_meta(FactoryMeta {
327+
side_effect_free: Some(true),
328+
});
329+
325330
data.add_file_dependencies(file_dependencies);
326331
data.add_missing_dependencies(missing_dependencies);
327332
return Ok((ModuleFactoryResult::new_with_module(raw_module), None));

crates/rspack_core/src/normal_module_factory.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ use crate::{
1818
stringify_loaders_and_resource, AssetInlineGeneratorOptions, AssetResourceGeneratorOptions,
1919
BoxLoader, BoxModule, CompilerOptions, Context, CssAutoGeneratorOptions, CssAutoParserOptions,
2020
CssModuleGeneratorOptions, CssModuleParserOptions, Dependency, DependencyCategory,
21-
DependencyRange, FuncUseCtx, GeneratorOptions, ModuleExt, ModuleFactory, ModuleFactoryCreateData,
22-
ModuleFactoryResult, ModuleIdentifier, ModuleLayer, ModuleRuleEffect, ModuleRuleEnforce,
23-
ModuleRuleUse, ModuleRuleUseLoader, ModuleType, NormalModule, ParserAndGenerator, ParserOptions,
24-
RawModule, Resolve, ResolveArgs, ResolveOptionsWithDependencyType, ResolveResult, Resolver,
25-
ResolverFactory, ResourceData, ResourceParsedData, RunnerContext, SharedPluginDriver,
21+
DependencyRange, FactoryMeta, FuncUseCtx, GeneratorOptions, ModuleExt, ModuleFactory,
22+
ModuleFactoryCreateData, ModuleFactoryResult, ModuleIdentifier, ModuleLayer, ModuleRuleEffect,
23+
ModuleRuleEnforce, ModuleRuleUse, ModuleRuleUseLoader, ModuleType, NormalModule,
24+
ParserAndGenerator, ParserOptions, RawModule, Resolve, ResolveArgs,
25+
ResolveOptionsWithDependencyType, ResolveResult, Resolver, ResolverFactory, ResourceData,
26+
ResourceParsedData, RunnerContext, SharedPluginDriver,
2627
};
2728

2829
define_hook!(NormalModuleFactoryBeforeResolve: SeriesBail(data: &mut ModuleFactoryCreateData) -> bool,tracing=false);
@@ -346,14 +347,18 @@ impl NormalModuleFactory {
346347
let ident = format!("{}/{}", &data.context, resource);
347348
let module_identifier = ModuleIdentifier::from(format!("ignored|{ident}"));
348349

349-
let raw_module = RawModule::new(
350+
let mut raw_module = RawModule::new(
350351
"/* (ignored) */".to_owned(),
351352
module_identifier,
352353
format!("{resource} (ignored)"),
353354
Default::default(),
354355
)
355356
.boxed();
356357

358+
raw_module.set_factory_meta(FactoryMeta {
359+
side_effect_free: Some(true),
360+
});
361+
357362
return Ok(Some(ModuleFactoryResult::new_with_module(raw_module)));
358363
}
359364
Err(err) => {
@@ -866,7 +871,7 @@ impl NormalModuleFactory {
866871
);
867872
let module_identifier = ModuleIdentifier::from(format!("ignored|{ident}"));
868873

869-
let raw_module = RawModule::new(
874+
let mut raw_module = RawModule::new(
870875
"/* (ignored) */".to_owned(),
871876
module_identifier,
872877
format!(
@@ -877,6 +882,10 @@ impl NormalModuleFactory {
877882
)
878883
.boxed();
879884

885+
raw_module.set_factory_meta(FactoryMeta {
886+
side_effect_free: Some(true),
887+
});
888+
880889
return Ok(ModuleFactoryResult::new_with_module(raw_module));
881890
}
882891
}

crates/rspack_core/src/raw_module.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rspack_cacheable::{
44
cacheable, cacheable_dyn,
55
with::{AsOption, AsPreset},
66
};
7-
use rspack_collections::Identifiable;
7+
use rspack_collections::{Identifiable, IdentifierMap, IdentifierSet};
88
use rspack_error::{impl_empty_diagnosable_trait, Result};
99
use rspack_hash::{RspackHash, RspackHashDigest};
1010
use rspack_macros::impl_source_map_config;
@@ -13,9 +13,9 @@ use rspack_util::source_map::{ModuleSourceMapConfig, SourceMapKind};
1313

1414
use crate::{
1515
dependencies_block::AsyncDependenciesBlockIdentifier, impl_module_meta_info, module_update_hash,
16-
BuildInfo, BuildMeta, CodeGenerationResult, Compilation, ConcatenationScope, Context,
17-
DependenciesBlock, DependencyId, FactoryMeta, Module, ModuleGraph, ModuleIdentifier, ModuleType,
18-
RuntimeGlobals, RuntimeSpec, SourceType,
16+
BuildInfo, BuildMeta, CodeGenerationResult, Compilation, ConcatenationScope, ConnectionState,
17+
Context, DependenciesBlock, DependencyId, FactoryMeta, Module, ModuleGraph,
18+
ModuleGraphCacheArtifact, ModuleIdentifier, ModuleType, RuntimeGlobals, RuntimeSpec, SourceType,
1919
};
2020

2121
#[impl_source_map_config]
@@ -150,6 +150,19 @@ impl Module for RawModule {
150150
module_update_hash(self, &mut hasher, compilation, runtime);
151151
Ok(hasher.digest(&compilation.options.output.hash_digest))
152152
}
153+
154+
fn get_side_effects_connection_state(
155+
&self,
156+
_module_graph: &ModuleGraph,
157+
_module_graph_cache: &ModuleGraphCacheArtifact,
158+
_module_chain: &mut IdentifierSet,
159+
_connection_state_cache: &mut IdentifierMap<ConnectionState>,
160+
) -> ConnectionState {
161+
if let Some(side_effect_free) = self.factory_meta().and_then(|m| m.side_effect_free) {
162+
return ConnectionState::Active(!side_effect_free);
163+
}
164+
ConnectionState::Active(true)
165+
}
153166
}
154167

155168
impl_empty_diagnosable_trait!(RawModule);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "ignored";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default "a";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default "b";
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"use strict";
2+
3+
import "ignored-module";
4+
import "./ignored-module";
5+
6+
it("should remove all ignored modules", async function() {
7+
// Current module + module with runtime code to load context modules
8+
expect(Object.keys(__webpack_modules__)).toHaveLength(2);
9+
10+
const x = "a";
11+
const locale = (await import("./locales/" + x)).default;
12+
13+
expect(locale).toBe("a");
14+
expect(Object.keys(__webpack_modules__)).toHaveLength(3);
15+
});
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
"use strict";
2+
3+
const webpack = require("@rspack/core");
4+
5+
/** @type {import("../../../../").Configuration} */
6+
module.exports = {
7+
entry: "./test.js",
8+
resolve: {
9+
alias: {
10+
"ignored-module": false,
11+
"./ignored-module": false
12+
}
13+
},
14+
plugins: [new webpack.IgnorePlugin({ resourceRegExp: /(b\.js|b)$/ })],
15+
optimization: {
16+
sideEffects: true
17+
}
18+
};

0 commit comments

Comments
 (0)