Skip to content

Commit 68c4df8

Browse files
authored
feat: module.hot.accept/decline support arrary dependencies (#2378)
1 parent bfb1738 commit 68c4df8

File tree

41 files changed

+763
-476
lines changed

Some content is hidden

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

41 files changed

+763
-476
lines changed

.changeset/big-seals-fly.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@rspack/binding": patch
3+
"@rspack/core": patch
4+
---
5+
6+
feat: module.hot.accept/decline support arrary dependencies

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/node_binding/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rspack_plugin_javascript/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ anyhow = { workspace = true }
1313
async-trait = { workspace = true }
1414
base64 = "0.13"
1515
better_scoped_tls = { workspace = true }
16+
bitflags = { workspace = true }
1617
crossbeam-channel = { workspace = true }
1718
dashmap = { workspace = true }
1819
either = "1"

crates/rspack_plugin_javascript/src/dependency/esm/dynamic_import.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ impl CodeGeneratable for EsmDynamicImportDependency {
124124

125125
// Add interop require to runtime requirements, as dynamic imports have been transformed so `inject_runtime_helper` will not be able to detect this.
126126
runtime_requirements.insert(runtime_globals::INTEROP_REQUIRE);
127+
runtime_requirements.insert(runtime_globals::ENSURE_CHUNK);
127128
runtime_requirements.insert(runtime_globals::LOAD_CHUNK_WITH_MODULE);
128129

129130
code_gen.visitors.push(

crates/rspack_plugin_javascript/src/dependency/hmr/import_meta_hot_accept.rs

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use rspack_core::{
2-
CodeGeneratable, CodeGeneratableContext, CodeGeneratableResult, Dependency, DependencyCategory,
3-
DependencyId, DependencyType, ErrorSpan, JsAstPath, ModuleDependency, ModuleIdentifier,
2+
create_javascript_visitor, CodeGeneratable, CodeGeneratableContext, CodeGeneratableResult,
3+
Dependency, DependencyCategory, DependencyId, DependencyType, ErrorSpan, JsAstPath,
4+
ModuleDependency, ModuleIdentifier,
45
};
5-
use swc_core::ecma::atoms::JsWord;
6+
use swc_core::ecma::atoms::{Atom, JsWord};
67

78
#[derive(Debug, Eq, Clone)]
89
pub struct ImportMetaModuleHotAcceptDependency {
@@ -93,30 +94,26 @@ impl ModuleDependency for ImportMetaModuleHotAcceptDependency {
9394
impl CodeGeneratable for ImportMetaModuleHotAcceptDependency {
9495
fn generate(
9596
&self,
96-
_code_generatable_context: &mut CodeGeneratableContext,
97+
code_generatable_context: &mut CodeGeneratableContext,
9798
) -> rspack_error::Result<CodeGeneratableResult> {
98-
// let CodeGeneratableContext { compilation, .. } = code_generatable_context;
99-
100-
let code_gen = CodeGeneratableResult::default();
101-
102-
// if let Some(module_id) = compilation
103-
// .module_graph
104-
// .module_graph_module_by_dependency_id(self.id().expect("should have id"))
105-
// .map(|m| m.id(&compilation.chunk_graph).to_string())
106-
// {
107-
// code_gen.visitors.push(
108-
// create_javascript_visitor!(exact &self.ast_path, visit_mut_call_expr(n: &mut CallExpr) {
109-
// if let Some(Lit::Str(str)) = n
110-
// .args
111-
// .get_mut(0)
112-
// .and_then(|first_arg| first_arg.expr.as_mut_lit())
113-
// {
114-
// str.value = JsWord::from(&*module_id);
115-
// str.raw = Some(Atom::from(format!("\"{module_id}\"")));
116-
// }
117-
// }),
118-
// );
119-
// }
99+
let CodeGeneratableContext { compilation, .. } = code_generatable_context;
100+
101+
let mut code_gen = CodeGeneratableResult::default();
102+
103+
if let Some(id) = self.id() {
104+
if let Some(module_id) = compilation
105+
.module_graph
106+
.module_graph_module_by_dependency_id(&id)
107+
.map(|m| m.id(&compilation.chunk_graph).to_string())
108+
{
109+
code_gen.visitors.push(
110+
create_javascript_visitor!(exact &self.ast_path, visit_mut_str(str: &mut Str) {
111+
str.value = JsWord::from(&*module_id);
112+
str.raw = Some(Atom::from(format!("\"{module_id}\"")));
113+
}),
114+
);
115+
}
116+
}
120117

121118
Ok(code_gen)
122119
}

crates/rspack_plugin_javascript/src/dependency/hmr/import_meta_hot_decline.rs

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ use rspack_core::{
33
Dependency, DependencyCategory, DependencyId, DependencyType, ErrorSpan, JsAstPath,
44
ModuleDependency, ModuleIdentifier,
55
};
6-
use swc_core::ecma::{
7-
ast::Lit,
8-
atoms::{Atom, JsWord},
9-
};
6+
use swc_core::ecma::atoms::{Atom, JsWord};
107

118
#[derive(Debug, Eq, Clone)]
129
pub struct ImportMetaModuleHotDeclineDependency {
@@ -110,15 +107,9 @@ impl CodeGeneratable for ImportMetaModuleHotDeclineDependency {
110107
.map(|m| m.id(&compilation.chunk_graph).to_string())
111108
{
112109
code_gen.visitors.push(
113-
create_javascript_visitor!(exact &self.ast_path, visit_mut_call_expr(n: &mut CallExpr) {
114-
if let Some(Lit::Str(str)) = n
115-
.args
116-
.get_mut(0)
117-
.and_then(|first_arg| first_arg.expr.as_mut_lit())
118-
{
119-
str.value = JsWord::from(&*module_id);
120-
str.raw = Some(Atom::from(format!("\"{module_id}\"")));
121-
}
110+
create_javascript_visitor!(exact &self.ast_path, visit_mut_str(str: &mut Str) {
111+
str.value = JsWord::from(&*module_id);
112+
str.raw = Some(Atom::from(format!("\"{module_id}\"")));
122113
}),
123114
);
124115
}

crates/rspack_plugin_javascript/src/dependency/hmr/module_hot_accept.rs

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use rspack_core::{
2-
CodeGeneratable, CodeGeneratableContext, CodeGeneratableResult, Dependency, DependencyCategory,
3-
DependencyId, DependencyType, ErrorSpan, JsAstPath, ModuleDependency, ModuleIdentifier,
2+
create_javascript_visitor, CodeGeneratable, CodeGeneratableContext, CodeGeneratableResult,
3+
Dependency, DependencyCategory, DependencyId, DependencyType, ErrorSpan, JsAstPath,
4+
ModuleDependency, ModuleIdentifier,
45
};
5-
use swc_core::ecma::atoms::JsWord;
6+
use swc_core::ecma::atoms::{Atom, JsWord};
67

78
#[derive(Debug, Eq, Clone)]
89
pub struct ModuleHotAcceptDependency {
@@ -93,31 +94,26 @@ impl ModuleDependency for ModuleHotAcceptDependency {
9394
impl CodeGeneratable for ModuleHotAcceptDependency {
9495
fn generate(
9596
&self,
96-
_code_generatable_context: &mut CodeGeneratableContext,
97+
code_generatable_context: &mut CodeGeneratableContext,
9798
) -> rspack_error::Result<CodeGeneratableResult> {
98-
// let CodeGeneratableContext { compilation, .. } = code_generatable_context;
99-
100-
let code_gen = CodeGeneratableResult::default();
101-
102-
// if let Some(module_id) = compilation
103-
// .module_graph
104-
// .module_graph_module_by_dependency_id(self.id().expect("should have id"))
105-
// .map(|m| m.id(&compilation.chunk_graph).to_string())
106-
// {
107-
// code_gen.visitors.push(
108-
// create_javascript_visitor!(exact &self.ast_path, visit_mut_call_expr(n: &mut CallExpr) {
109-
// if let Some(Lit::Str(str)) = n
110-
// .args
111-
// .get_mut(0)
112-
// .and_then(|first_arg| first_arg.expr.as_mut_lit())
113-
// {
114-
// str.value = JsWord::from(&*module_id);
115-
// str.raw = Some(Atom::from(format!("\"{module_id}\"")));
116-
// }
117-
118-
// }),
119-
// );
120-
// }
99+
let CodeGeneratableContext { compilation, .. } = code_generatable_context;
100+
101+
let mut code_gen = CodeGeneratableResult::default();
102+
103+
if let Some(id) = self.id() {
104+
if let Some(module_id) = compilation
105+
.module_graph
106+
.module_graph_module_by_dependency_id(&id)
107+
.map(|m| m.id(&compilation.chunk_graph).to_string())
108+
{
109+
code_gen.visitors.push(
110+
create_javascript_visitor!(exact &self.ast_path, visit_mut_str(str: &mut Str) {
111+
str.value = JsWord::from(&*module_id);
112+
str.raw = Some(Atom::from(format!("\"{module_id}\"")));
113+
}),
114+
);
115+
}
116+
}
121117

122118
Ok(code_gen)
123119
}

crates/rspack_plugin_javascript/src/dependency/hmr/module_hot_decline.rs

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ use rspack_core::{
33
Dependency, DependencyCategory, DependencyId, DependencyType, ErrorSpan, JsAstPath,
44
ModuleDependency, ModuleIdentifier,
55
};
6-
use swc_core::ecma::{
7-
ast::Lit,
8-
atoms::{Atom, JsWord},
9-
};
6+
use swc_core::ecma::atoms::{Atom, JsWord};
107

118
#[derive(Debug, Eq, Clone)]
129
pub struct ModuleHotDeclineDependency {
@@ -110,15 +107,9 @@ impl CodeGeneratable for ModuleHotDeclineDependency {
110107
.map(|m| m.id(&compilation.chunk_graph).to_string())
111108
{
112109
code_gen.visitors.push(
113-
create_javascript_visitor!(exact &self.ast_path, visit_mut_call_expr(n: &mut CallExpr) {
114-
if let Some(Lit::Str(str)) = n
115-
.args
116-
.get_mut(0)
117-
.and_then(|first_arg| first_arg.expr.as_mut_lit())
118-
{
119-
str.value = JsWord::from(&*module_id);
120-
str.raw = Some(Atom::from(format!("\"{module_id}\"")));
121-
}
110+
create_javascript_visitor!(exact &self.ast_path, visit_mut_str(str: &mut Str) {
111+
str.value = JsWord::from(&*module_id);
112+
str.raw = Some(Atom::from(format!("\"{module_id}\"")));
122113
}),
123114
);
124115
}

crates/rspack_plugin_javascript/src/plugin.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use xxhash_rust::xxh3::Xxh3;
2525

2626
use crate::runtime::{generate_chunk_entry_code, render_chunk_modules, render_runtime_modules};
2727
use crate::utils::syntax_by_module_type;
28-
use crate::visitors::{run_after_pass, run_before_pass, DependencyScanner};
28+
use crate::visitors::{run_after_pass, run_before_pass, scan_dependencies};
2929

3030
#[derive(Debug)]
3131
pub struct JsPlugin {}
@@ -291,25 +291,26 @@ impl ParserAndGenerator for JavaScriptParserAndGenerator {
291291
module_type,
292292
)?;
293293

294-
let dep_scanner = ast.visit(|program, context| {
295-
let mut dep_scanner =
296-
DependencyScanner::new(context.unresolved_mark, resource_data, compiler_options);
297-
program.visit_with_path(&mut dep_scanner, &mut Default::default());
298-
dep_scanner
294+
let (dependencies, presentational_dependencies) = ast.visit(|program, context| {
295+
scan_dependencies(
296+
program,
297+
context.unresolved_mark,
298+
resource_data,
299+
compiler_options,
300+
)
299301
});
300302

301303
Ok(
302304
ParseResult {
303305
ast_or_source: AstOrSource::Ast(ModuleAst::JavaScript(ast)),
304-
dependencies: dep_scanner
305-
.dependencies
306+
dependencies: dependencies
306307
.into_iter()
307308
.map(|mut d| {
308309
d.set_parent_module_identifier(Some(module_identifier));
309310
d
310311
})
311312
.collect(),
312-
presentational_dependencies: dep_scanner.presentational_dependencies,
313+
presentational_dependencies,
313314
}
314315
.with_diagnostic(diagnostics),
315316
)

0 commit comments

Comments
 (0)