Skip to content

Commit 28ccd5d

Browse files
committed
refactor: streamline import.meta.env definitions
1 parent 34f7fa6 commit 28ccd5d

54 files changed

Lines changed: 379 additions & 994 deletions

File tree

Some content is hidden

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

crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/add.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ impl Task<TaskContext> for AddTask {
120120
module: self.module,
121121
resolver_factory: context.resolver_factory.clone(),
122122
compiler_options: context.compiler_options.clone(),
123-
define_plugin_definitions: context.define_plugin_definitions.clone(),
124123
plugin_driver: context.plugin_driver.clone(),
125124
runtime_template: context.runtime_template.create_module_code_template(),
126125
fs: context.fs.clone(),

crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/build.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ pub struct BuildTask {
2424
pub module: BoxModule,
2525
pub resolver_factory: Arc<ResolverFactory>,
2626
pub compiler_options: Arc<CompilerOptions>,
27-
pub define_plugin_definitions: Arc<rustc_hash::FxHashMap<String, serde_json::Value>>,
2827
pub runtime_template: ModuleCodeTemplate,
2928
pub plugin_driver: SharedPluginDriver,
3029
pub fs: Arc<dyn ReadableFileSystem>,
@@ -41,7 +40,6 @@ impl Task<TaskContext> for BuildTask {
4140
compiler_id,
4241
compilation_id,
4342
compiler_options,
44-
define_plugin_definitions,
4543
resolver_factory,
4644
plugin_driver,
4745
runtime_template,
@@ -62,7 +60,6 @@ impl Task<TaskContext> for BuildTask {
6260
compiler_id,
6361
compilation_id,
6462
compiler_options: compiler_options.clone(),
65-
define_plugin_definitions: define_plugin_definitions.clone(),
6663
resolver_factory: resolver_factory.clone(),
6764
plugin_driver: plugin_driver.clone(),
6865
runtime_template,

crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/context.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ pub struct TaskContext {
2222
pub intermediate_fs: Arc<dyn IntermediateFileSystem>,
2323
pub output_fs: Arc<dyn WritableFileSystem>,
2424
pub compiler_options: Arc<CompilerOptions>,
25-
pub define_plugin_definitions: Arc<HashMap<String, serde_json::Value>>,
2625
pub platform: Arc<CompilerPlatform>,
2726
pub resolver_factory: Arc<ResolverFactory>,
2827
pub loader_resolver_factory: Arc<ResolverFactory>,
@@ -46,7 +45,6 @@ impl TaskContext {
4645
plugin_driver: compilation.plugin_driver.clone(),
4746
buildtime_plugin_driver: compilation.buildtime_plugin_driver.clone(),
4847
compiler_options: compilation.options.clone(),
49-
define_plugin_definitions: Arc::new(compilation.define_plugin_definitions.clone()),
5048
platform: compilation.platform.clone(),
5149
resolver_factory: compilation.resolver_factory.clone(),
5250
loader_resolver_factory: compilation.loader_resolver_factory.clone(),

crates/rspack_core/src/compilation/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,6 @@ pub struct Compilation {
293293
pub build_dependencies: ArcPathIndexSet,
294294

295295
pub value_cache_versions: ValueCacheVersions,
296-
pub define_plugin_definitions: HashMap<String, serde_json::Value>,
297296

298297
import_var_map: IdentifierDashMap<RuntimeKeyMap<ImportVarMap>>,
299298

@@ -426,7 +425,6 @@ impl Compilation {
426425
build_dependencies: Default::default(),
427426

428427
value_cache_versions: ValueCacheVersions::default(),
429-
define_plugin_definitions: Default::default(),
430428

431429
import_var_map: IdentifierDashMap::default(),
432430

crates/rspack_core/src/module.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ pub struct BuildContext {
4646
pub compiler_id: CompilerId,
4747
pub compilation_id: CompilationId,
4848
pub compiler_options: Arc<CompilerOptions>,
49-
pub define_plugin_definitions: Arc<HashMap<String, serde_json::Value>>,
5049
pub resolver_factory: Arc<ResolverFactory>,
5150
pub runtime_template: ModuleCodeTemplate,
5251
pub plugin_driver: SharedPluginDriver,

crates/rspack_core/src/normal_module.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ impl Module for NormalModule {
574574
loaders: &self.loaders,
575575
resource_data: &self.resource_data,
576576
compiler_options: &build_context.compiler_options,
577-
define_plugin_definitions: Some(&build_context.define_plugin_definitions),
577+
compilation_id: build_context.compilation_id,
578578
additional_data: loader_result.additional_data,
579579
factory_meta: self.factory_meta.as_ref(),
580580
build_info: &mut self.build_info,

crates/rspack_core/src/parser_and_generator.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,19 @@ use rspack_error::{Result, TWithDiagnosticArray};
99
use rspack_hash::RspackHashDigest;
1010
use rspack_loader_runner::{AdditionalData, ParseMeta, ResourceData};
1111
use rspack_sources::BoxSource;
12-
use rspack_util::{ext::AsAny, source_map::SourceMapKind};
13-
use rustc_hash::{FxHashMap, FxHashSet};
12+
use rspack_util::{
13+
ext::AsAny,
14+
fx_hash::{FxHashMap, FxHashSet},
15+
source_map::SourceMapKind,
16+
};
1417
use swc_core::atoms::Atom;
1518

1619
use crate::{
1720
AsyncDependenciesBlock, BoxDependency, BoxDependencyTemplate, BoxLoader, BoxModuleDependency,
18-
BuildInfo, BuildMeta, ChunkGraph, CodeGenerationData, Compilation, CompilerOptions,
19-
ConcatenationScope, Context, DependencyLocation, DependencyRange, EvaluatedInlinableValue,
20-
FactoryMeta, GeneratorOptions, Module, ModuleCodeTemplate, ModuleGraph, ModuleIdentifier,
21-
ModuleLayer, ModuleType, NormalModule, ParserOptions, RuntimeSpec, SourceType,
21+
BuildInfo, BuildMeta, ChunkGraph, CodeGenerationData, Compilation, CompilationId,
22+
CompilerOptions, ConcatenationScope, Context, DependencyLocation, DependencyRange,
23+
EvaluatedInlinableValue, FactoryMeta, GeneratorOptions, Module, ModuleCodeTemplate, ModuleGraph,
24+
ModuleIdentifier, ModuleLayer, ModuleType, NormalModule, ParserOptions, RuntimeSpec, SourceType,
2225
};
2326

2427
#[derive(Debug)]
@@ -37,7 +40,7 @@ pub struct ParseContext<'a> {
3740
pub loaders: &'a [BoxLoader],
3841
pub resource_data: &'a ResourceData,
3942
pub compiler_options: &'a CompilerOptions,
40-
pub define_plugin_definitions: Option<&'a FxHashMap<String, serde_json::Value>>,
43+
pub compilation_id: CompilationId,
4144
pub additional_data: Option<AdditionalData>,
4245
pub factory_meta: Option<&'a FactoryMeta>,
4346
pub parse_meta: ParseMeta,

crates/rspack_plugin_javascript/src/parser_and_generator/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ impl ParserAndGenerator for JavaScriptParserAndGenerator {
200200
module_layer,
201201
resource_data,
202202
compiler_options,
203-
define_plugin_definitions,
203+
compilation_id,
204204
runtime_template,
205205
factory_meta,
206206
build_info,
@@ -327,7 +327,7 @@ impl ParserAndGenerator for JavaScriptParserAndGenerator {
327327
build_info,
328328
module_identifier,
329329
module_parser_options,
330-
define_plugin_definitions,
330+
compilation_id,
331331
&mut semicolons,
332332
&mut self.parser_plugins,
333333
parse_meta,

crates/rspack_plugin_javascript/src/parser_plugin/define_plugin/mod.rs

Lines changed: 91 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,23 @@ mod parser;
22
pub(crate) mod utils;
33
mod walk_data;
44

5-
use std::sync::Arc;
5+
use std::sync::{Arc, LazyLock};
66

77
use parser::DefineParserPlugin;
88
use rspack_core::{
9-
Compilation, CompilationParams, CompilerCompilation, ModuleType, NormalModuleFactoryParser,
10-
ParserAndGenerator, ParserOptions, Plugin,
9+
Compilation, CompilationId, CompilationParams, CompilerCompilation, ModuleType,
10+
NormalModuleFactoryParser, ParserAndGenerator, ParserOptions, Plugin,
1111
};
1212
use rspack_error::{Diagnostic, Error, Result};
1313
use rspack_hook::{plugin, plugin_hook};
14-
use rustc_hash::FxHashMap;
14+
use rspack_util::fx_hash::{FxDashMap, FxHashMap};
1515
use serde_json::Value;
1616

17-
use self::walk_data::WalkData;
17+
use self::{utils::code_to_string, walk_data::WalkData};
1818
use crate::parser_and_generator::JavaScriptParserAndGenerator;
1919

2020
pub(crate) const VALUE_DEP_PREFIX: &str = "rspack/DefinePlugin ";
2121
pub(crate) const IMPORT_META_ENV_VALUE_DEP_KEY: &str = "rspack/DefinePlugin import.meta.env.*";
22-
const IMPORT_META_ENV_PREFIX: &str = "import.meta.env.";
2322

2423
#[derive(Debug)]
2524
struct ConflictingValuesError(String, String, String);
@@ -35,54 +34,82 @@ impl ConflictingValuesError {
3534
}
3635

3736
pub type DefineValue = FxHashMap<String, Value>;
37+
pub(crate) type ImportMetaEnvDefinitions = FxHashMap<String, Value>;
38+
39+
#[derive(Debug, Default)]
40+
struct ImportMetaEnvDefinitionsState {
41+
definitions: ImportMetaEnvDefinitions,
42+
serialized: Option<String>,
43+
}
44+
45+
static IMPORT_META_ENV_DEFINITIONS_MAP: LazyLock<
46+
FxDashMap<CompilationId, ImportMetaEnvDefinitionsState>,
47+
> = LazyLock::new(Default::default);
3848

3949
#[plugin]
4050
#[derive(Debug)]
4151
pub struct DefinePlugin {
4252
walk_data: Arc<WalkData>,
43-
definitions: Arc<DefineValue>,
4453
}
4554

4655
impl DefinePlugin {
4756
pub fn new(definitions: DefineValue) -> Self {
48-
Self::new_inner(Arc::new(WalkData::new(&definitions)), Arc::new(definitions))
57+
Self::new_inner(Arc::new(WalkData::new(&definitions)))
4958
}
5059
}
5160

52-
fn import_meta_env_value(definitions: &DefineValue) -> String {
61+
pub(crate) fn serialize_import_meta_env_definitions(
62+
definitions: &ImportMetaEnvDefinitions,
63+
) -> String {
5364
let mut pairs = definitions
5465
.iter()
55-
.filter_map(|(key, value)| {
56-
key
57-
.strip_prefix(IMPORT_META_ENV_PREFIX)
58-
.map(|env_key| (env_key, value.to_string()))
59-
})
66+
.map(|(key, value)| (key.as_str(), code_to_string(value, None, None)))
6067
.collect::<Vec<_>>();
6168
pairs.sort_unstable_by(|a, b| a.0.cmp(b.0));
62-
pairs
69+
let content = pairs
6370
.into_iter()
64-
.map(|(key, value)| format!("{key}:{value}"))
71+
.map(|(key, value)| format!("{}:{value}", rspack_util::json_stringify_str(key)))
6572
.collect::<Vec<_>>()
66-
.join(",")
73+
.join(",");
74+
format!("{{{content}}}")
75+
}
76+
77+
pub(crate) fn remove_import_meta_env_definitions(compilation_id: CompilationId) {
78+
IMPORT_META_ENV_DEFINITIONS_MAP.remove(&compilation_id);
79+
}
80+
81+
pub(crate) fn import_meta_env_definitions_string(compilation_id: CompilationId) -> String {
82+
IMPORT_META_ENV_DEFINITIONS_MAP
83+
.get(&compilation_id)
84+
.map(|state| {
85+
state
86+
.serialized
87+
.clone()
88+
.unwrap_or_else(|| serialize_import_meta_env_definitions(&state.definitions))
89+
})
90+
.unwrap_or_else(|| "{}".to_string())
91+
}
92+
93+
pub(crate) fn has_import_meta_env_definition(compilation_id: CompilationId, name: &str) -> bool {
94+
IMPORT_META_ENV_DEFINITIONS_MAP
95+
.get(&compilation_id)
96+
.is_some_and(|state| state.definitions.contains_key(name))
6797
}
6898

6999
#[plugin_hook(CompilerCompilation for DefinePlugin, tracing=false)]
70-
async fn compilation(
100+
async fn collect_import_meta_env_definitions(
71101
&self,
72102
compilation: &mut Compilation,
73103
_params: &mut CompilationParams,
74104
) -> Result<()> {
75105
compilation.extend_diagnostics(self.walk_data.diagnostics.clone());
76-
compilation.define_plugin_definitions.extend(
77-
self
78-
.definitions
79-
.iter()
80-
.map(|(key, value)| (key.clone(), value.clone())),
81-
);
82-
compilation.value_cache_versions.insert(
83-
IMPORT_META_ENV_VALUE_DEP_KEY.to_string(),
84-
import_meta_env_value(&compilation.define_plugin_definitions),
85-
);
106+
let mut definitions = IMPORT_META_ENV_DEFINITIONS_MAP
107+
.entry(compilation.id())
108+
.or_default();
109+
for (key, value) in &self.walk_data.import_meta_env_definitions {
110+
definitions.definitions.insert(key.clone(), value.clone());
111+
definitions.serialized = None;
112+
}
86113
for (key, value) in self.walk_data.tiling_definitions.iter() {
87114
let cache_key = format!("{VALUE_DEP_PREFIX}{key}");
88115
if let Some(prev) = compilation.value_cache_versions.get(&cache_key)
@@ -101,6 +128,30 @@ async fn compilation(
101128
Ok(())
102129
}
103130

131+
#[plugin_hook(CompilerCompilation for DefinePlugin, stage = i32::MAX, tracing=false)]
132+
async fn finalize_import_meta_env_definitions(
133+
&self,
134+
compilation: &mut Compilation,
135+
_params: &mut CompilationParams,
136+
) -> Result<()> {
137+
let mut state = IMPORT_META_ENV_DEFINITIONS_MAP
138+
.entry(compilation.id())
139+
.or_default();
140+
let serialized = match &state.serialized {
141+
Some(serialized) => serialized.clone(),
142+
None => {
143+
let serialized = serialize_import_meta_env_definitions(&state.definitions);
144+
state.serialized = Some(serialized.clone());
145+
serialized
146+
}
147+
};
148+
compilation
149+
.value_cache_versions
150+
.insert(IMPORT_META_ENV_VALUE_DEP_KEY.to_string(), serialized);
151+
152+
Ok(())
153+
}
154+
104155
#[plugin_hook(NormalModuleFactoryParser for DefinePlugin, tracing=false)]
105156
async fn nmf_parser(
106157
&self,
@@ -121,8 +172,19 @@ impl Plugin for DefinePlugin {
121172
"rspack.DefinePlugin"
122173
}
123174

175+
fn clear_cache(&self, id: CompilationId) {
176+
remove_import_meta_env_definitions(id);
177+
}
178+
124179
fn apply(&self, ctx: &mut rspack_core::ApplyContext<'_>) -> Result<()> {
125-
ctx.compiler_hooks.compilation.tap(compilation::new(self));
180+
ctx
181+
.compiler_hooks
182+
.compilation
183+
.tap(collect_import_meta_env_definitions::new(self));
184+
ctx
185+
.compiler_hooks
186+
.compilation
187+
.tap(finalize_import_meta_env_definitions::new(self));
126188
ctx
127189
.normal_module_factory_hooks
128190
.parser

crates/rspack_plugin_javascript/src/parser_plugin/define_plugin/parser.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::{
77
};
88

99
use rspack_util::SpanExt;
10-
use swc_experimental_ecma_ast::{Expr, Ident, MemberExpr, UnaryExpr};
10+
use swc_experimental_ecma_ast::{Expr, Ident, MemberExpr, Span, UnaryExpr};
1111

1212
use super::{VALUE_DEP_PREFIX, utils::gen_const_dep, walk_data::WalkData};
1313
use crate::{
@@ -42,6 +42,24 @@ impl DefineParserPlugin {
4242
}
4343
}
4444

45+
fn add_destructuring_value_dependencies(
46+
&self,
47+
parser: &mut JavascriptParser,
48+
key: &str,
49+
span: Span,
50+
) {
51+
let Some(properties) = parser
52+
.destructuring_assignment_properties
53+
.get(&span)
54+
.cloned()
55+
else {
56+
return;
57+
};
58+
for prop in properties.iter() {
59+
self.add_value_dependency(parser, &format!("{key}.{}", prop.id));
60+
}
61+
}
62+
4563
fn get_define_record(&self, for_name: &str) -> Option<&DefineRecord> {
4664
self
4765
.walk_data
@@ -170,6 +188,10 @@ impl<'p, 'a> JavascriptParserPlugin<'p, 'a> for DefineParserPlugin {
170188
|| self
171189
.walk_data
172190
.object_define_record
191+
.contains_key(info.name.as_str())
192+
|| self
193+
.walk_data
194+
.destructuring_define_record
173195
.contains_key(info.name.as_str()))
174196
{
175197
return Some(true);
@@ -209,6 +231,19 @@ impl<'p, 'a> JavascriptParserPlugin<'p, 'a> for DefineParserPlugin {
209231
span.real_hi(),
210232
for_name,
211233
);
234+
} else if let Some(record) = self.walk_data.destructuring_define_record.get(for_name)
235+
&& let Some(on_expression) = &record.on_expression
236+
{
237+
let span = expr.span;
238+
self.add_destructuring_value_dependencies(parser, for_name, span);
239+
return on_expression(
240+
record,
241+
parser,
242+
span,
243+
span.real_lo(),
244+
span.real_hi(),
245+
for_name,
246+
);
212247
}
213248
None
214249
}

0 commit comments

Comments
 (0)