Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ pub struct SideEffectsDoOptimizeMoveTarget {
pub target_export: Option<Vec<Atom>>,
}

pub type SideEffectsOptimizeArtifact = UkeyMap<DependencyId, Option<SideEffectsDoOptimize>>;
pub type SideEffectsOptimizeArtifact = UkeyMap<DependencyId, SideEffectsDoOptimize>;
2 changes: 1 addition & 1 deletion crates/rspack_core/src/exports/target.rs
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ pub(crate) fn get_target_with_filter(
}
}

pub(crate) fn get_target_from_export_info(
fn get_target_from_export_info(
export_info: &ExportInfoData,
mg: &ModuleGraph,
resolve_filter: ResolveFilterFnTy,
Expand Down
7 changes: 4 additions & 3 deletions crates/rspack_core/src/module_graph/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -773,9 +773,10 @@ impl<'a> ModuleGraph<'a> {
}

// set to origin module outgoing connection
if let Some(identifier) = origin_module_id
&& let Some(original_mgm) = self.module_graph_module_by_identifier_mut(&identifier)
{
if let Some(identifier) = origin_module_id {
let original_mgm = self
.module_graph_module_by_identifier_mut(&identifier)
.expect("should mgm exist");
original_mgm.add_outgoing_connection(dependency_id);
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ use rspack_core::{
ModuleGraph, ModuleGraphConnection, ModuleIdentifier, NormalModuleCreateData,
NormalModuleFactoryModule, Plugin, PrefetchExportsInfoMode, ResolvedExportInfoTarget,
SideEffectsBailoutItemWithSpan, SideEffectsDoOptimize, SideEffectsDoOptimizeMoveTarget,
SideEffectsOptimizeArtifact,
incremental::{self, IncrementalPasses, Mutation},
};
use rspack_error::Result;
Expand Down Expand Up @@ -644,8 +643,14 @@ async fn optimize_dependencies(&self, compilation: &mut Compilation) -> Result<O
let logger = compilation.get_logger("rspack.SideEffectsFlagPlugin");
let start = logger.time("update connections");

let mut side_effects_optimize_artifact =
std::mem::take(&mut compilation.side_effects_optimize_artifact);
let mut side_effects_optimize_artifact = if compilation
.incremental
.passes_enabled(IncrementalPasses::SIDE_EFFECTS)
{
std::mem::take(&mut compilation.side_effects_optimize_artifact)
} else {
Default::default()
};
let module_graph = compilation.get_module_graph();

let all_modules = module_graph.modules();
Expand All @@ -671,10 +676,14 @@ async fn optimize_dependencies(&self, compilation: &mut Compilation) -> Result<O
.mutations_read(IncrementalPasses::SIDE_EFFECTS)
&& !side_effects_optimize_artifact.is_empty()
{
side_effects_optimize_artifact.retain(|dependency_id, _| {
module_graph
side_effects_optimize_artifact.retain(|dependency_id, do_optimize| {
let dep_exist = module_graph
.connection_by_dependency_id(dependency_id)
.is_some()
.is_some();
let target_module_exist = module_graph
.module_by_identifier(&do_optimize.target_module)
.is_some();
dep_exist && target_module_exist
});

fn affected_incoming_modules(
Expand Down Expand Up @@ -731,7 +740,7 @@ async fn optimize_dependencies(&self, compilation: &mut Compilation) -> Result<O
logger.time_end(inner_start);

let inner_start = logger.time("find optimizable connections");
let artifact: SideEffectsOptimizeArtifact = modules
let dep_optimize_info = modules
.par_iter()
.filter(|module| side_effects_state_map[module] == ConnectionState::Active(false))
.flat_map(|module| {
Expand All @@ -745,21 +754,17 @@ async fn optimize_dependencies(&self, compilation: &mut Compilation) -> Result<O
can_optimize_connection(connection, &side_effects_state_map, &module_graph),
)
})
.collect();
.collect::<Vec<_>>();
for (dep_id, can_optimize) in dep_optimize_info {
if let Some(do_optimize) = can_optimize {
side_effects_optimize_artifact.insert(dep_id, do_optimize);
} else {
side_effects_optimize_artifact.remove(&dep_id);
}
}
logger.time_end(inner_start);

let mut do_optimizes: Vec<(DependencyId, SideEffectsDoOptimize)> = if compilation
.incremental
.passes_enabled(IncrementalPasses::SIDE_EFFECTS)
{
side_effects_optimize_artifact.extend(artifact);
side_effects_optimize_artifact.clone()
} else {
artifact
}
.into_iter()
.filter_map(|(connection, do_optimize)| do_optimize.map(|i| (connection, i)))
.collect();
let mut do_optimizes = side_effects_optimize_artifact.clone();

let inner_start = logger.time("do optimize connections");
let mut do_optimized_count = 0;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const Button = "Button";
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { Button } from "./Button";
6 changes: 6 additions & 0 deletions tests/e2e/cases/incremental/remove-optimized-module/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { Button } from "./comp";

const div = document.createElement("div");
div.id = "main";
div.innerText = Button;
document.body.appendChild(div);
21 changes: 21 additions & 0 deletions tests/e2e/cases/incremental/remove-optimized-module/index.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { test, expect } from "@/fixtures";

test("remove optimized module should not panic", async ({
page,
fileAction
}) => {
await expect(page.locator("#main")).toHaveText("Button");

fileAction.deleteFile("comp/Button.js");

const overlay = page.frameLocator("#webpack-dev-server-client-overlay");
await expect(
overlay.getByText("Module not found: Can't resolve './Button'")
).toBeVisible();

fileAction.updateFile(
"comp/Button.js",
() => "export const Button = 'NewButton';"
);
await expect(page.locator("#main")).toHaveText("NewButton");
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "test",
"sideEffects": false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const { rspack } = require("@rspack/core");

/** @type {import("@rspack/core").Configuration} */
module.exports = {
entry: "./index.js",
cache: true,
experiments: {
cache: true,
incremental: {
providedExports: false
}
},
plugins: [new rspack.HtmlRspackPlugin()]
};
4 changes: 3 additions & 1 deletion tests/e2e/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,9 @@ export default defineConfig<RspackOptions>({
basePort: 8200,
handleConfig: (config: any) => {
config.experiments ??= {};
config.experiments.incremental = true;
if (config.experiments.incremental == undefined) {
config.experiments.incremental = true;
}
const cache = config.experiments.cache;
if (typeof cache === "object" && cache.type === "persistent") {
cache.storage = {
Expand Down
Loading