Skip to content

Commit d0b745d

Browse files
committed
refactor: centralize import.meta.env state in EnvPlugin
1 parent 91915a3 commit d0b745d

10 files changed

Lines changed: 88 additions & 91 deletions

File tree

crates/rspack/src/builder/builder_context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ impl BuilderContext {
210210
// Core module plugins
211211
BuiltinPluginOptions::JavascriptModulesPlugin => {
212212
plugins.push(rspack_plugin_javascript::JsPlugin::default().boxed());
213+
plugins.push(rspack_plugin_javascript::EnvPlugin::default().boxed());
213214
}
214215
BuiltinPluginOptions::JsonModulesPlugin => {
215216
plugins.push(rspack_plugin_json::JsonPlugin.boxed());

crates/rspack_binding_api/src/raw_options/raw_builtins/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ use rspack_plugin_hmr::HotModuleReplacementPlugin;
7676
use rspack_plugin_html::HtmlRspackPlugin;
7777
use rspack_plugin_ignore::IgnorePlugin;
7878
use rspack_plugin_javascript::{
79-
FlagDependencyExportsPlugin, FlagDependencyUsagePlugin, InferAsyncModulesPlugin,
79+
EnvPlugin, FlagDependencyExportsPlugin, FlagDependencyUsagePlugin, InferAsyncModulesPlugin,
8080
InlineExportsPlugin, JsPlugin, MangleExportsPlugin, ModuleConcatenationPlugin,
8181
SideEffectsFlagPlugin, api_plugin::APIPlugin, define_plugin::DefinePlugin,
8282
provide_plugin::ProvidePlugin, url_plugin::URLPlugin,
@@ -643,7 +643,10 @@ impl<'a> BuiltinPlugin<'a> {
643643
BuiltinPluginName::InferAsyncModulesPlugin => {
644644
plugins.push(InferAsyncModulesPlugin::default().boxed())
645645
}
646-
BuiltinPluginName::JavascriptModulesPlugin => plugins.push(JsPlugin::default().boxed()),
646+
BuiltinPluginName::JavascriptModulesPlugin => {
647+
plugins.push(JsPlugin::default().boxed());
648+
plugins.push(EnvPlugin::default().boxed());
649+
}
647650
BuiltinPluginName::AsyncWebAssemblyModulesPlugin => {
648651
plugins.push(AsyncWasmPlugin::default().boxed())
649652
}

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

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,16 @@ use std::sync::Arc;
66

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

1717
use self::walk_data::WalkData;
18-
use crate::{
19-
parser_and_generator::JavaScriptParserAndGenerator,
20-
parser_plugin::import_meta_env::{
21-
finalize_import_meta_env_definitions as finalize_definitions,
22-
merge_import_meta_env_definitions, remove_import_meta_env_definitions,
23-
},
24-
};
18+
use crate::{parser_and_generator::JavaScriptParserAndGenerator, plugin::EnvPlugin};
2519

2620
pub(crate) const VALUE_DEP_PREFIX: &str = "rspack/DefinePlugin ";
2721

@@ -60,7 +54,7 @@ async fn collect_import_meta_env_definitions(
6054
) -> Result<()> {
6155
compilation.extend_diagnostics(self.walk_data.diagnostics.clone());
6256
if compilation.options.experiments.env {
63-
merge_import_meta_env_definitions(
57+
EnvPlugin::collect(
6458
compilation.id(),
6559
&self.walk_data.import_meta_env_definitions,
6660
);
@@ -83,21 +77,6 @@ async fn collect_import_meta_env_definitions(
8377
Ok(())
8478
}
8579

86-
#[plugin_hook(CompilerCompilation for DefinePlugin, stage = i32::MAX, tracing=false)]
87-
async fn finalize_import_meta_env_definitions(
88-
&self,
89-
compilation: &mut Compilation,
90-
_params: &mut CompilationParams,
91-
) -> Result<()> {
92-
if !compilation.options.experiments.env {
93-
return Ok(());
94-
}
95-
96-
finalize_definitions(compilation);
97-
98-
Ok(())
99-
}
100-
10180
#[plugin_hook(NormalModuleFactoryParser for DefinePlugin, tracing=false)]
10281
async fn nmf_parser(
10382
&self,
@@ -118,19 +97,11 @@ impl Plugin for DefinePlugin {
11897
"rspack.DefinePlugin"
11998
}
12099

121-
fn clear_cache(&self, id: CompilationId) {
122-
remove_import_meta_env_definitions(id);
123-
}
124-
125100
fn apply(&self, ctx: &mut rspack_core::ApplyContext<'_>) -> Result<()> {
126101
ctx
127102
.compiler_hooks
128103
.compilation
129104
.tap(collect_import_meta_env_definitions::new(self));
130-
ctx
131-
.compiler_hooks
132-
.compilation
133-
.tap(finalize_import_meta_env_definitions::new(self));
134105
ctx
135106
.normal_module_factory_hooks
136107
.parser

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use super::{VALUE_DEP_PREFIX, utils::gen_const_dep, walk_data::WalkData};
1313
use crate::{
1414
JavascriptParserPlugin,
1515
define_plugin::walk_data::DefineRecord,
16-
parser_plugin::import_meta_env::is_import_meta_env_name,
16+
plugin::env_plugin::is_import_meta_env_name,
1717
utils::eval::{BasicEvaluatedExpression, evaluate_to_string},
1818
visitors::{AllowedMemberTypes, JavascriptParser, MemberExpressionInfo},
1919
};

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use super::{
1515
utils::{code_to_string, gen_const_dep},
1616
};
1717
use crate::{
18-
parser_plugin::import_meta_env::ImportMetaEnvDefinitions, utils::eval::BasicEvaluatedExpression,
18+
plugin::env_plugin::ImportMetaEnvDefinitions, utils::eval::BasicEvaluatedExpression,
1919
visitors::JavascriptParser,
2020
};
2121

crates/rspack_plugin_javascript/src/parser_plugin/import_meta_plugin.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,6 @@ use super::{
2323
import_meta_runtime_api_member, is_simple_assign_op,
2424
render_import_meta_runtime_api_destructuring,
2525
},
26-
import_meta_env::{
27-
add_import_meta_env_value_dependency, import_meta_env_definitions_string, import_meta_env_key,
28-
is_import_meta_env_member, render_import_meta_env_definitions,
29-
render_import_meta_env_expression_info, render_import_meta_env_member_chain,
30-
},
3126
import_meta_path::{
3227
get_import_meta_eval_value, get_import_meta_member_replacement, should_handle_import_meta_path,
3328
},
@@ -37,6 +32,11 @@ use crate::{
3732
IMPORT_META_RSC_BINDING, ImportMetaResolveContextDependency, ImportMetaResolveDependency,
3833
ImportMetaResolveHeaderDependency, ImportMetaRscDependency,
3934
},
35+
plugin::env_plugin::{
36+
add_import_meta_env_value_dependency, import_meta_env_definitions_string, import_meta_env_key,
37+
is_import_meta_env_member, render_import_meta_env_definitions,
38+
render_import_meta_env_expression_info, render_import_meta_env_member_chain,
39+
},
4040
utils::eval::{self, BasicEvaluatedExpression},
4141
visitors::{
4242
AllowedMemberTypes, ExportedVariableInfo, ExprRef, ExpressionExpressionInfo, JavascriptParser,

crates/rspack_plugin_javascript/src/parser_plugin/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ mod esm_export_dependency_parser_plugin;
1111
mod esm_import_dependency_parser_plugin;
1212
mod esm_top_level_this_plugin;
1313
mod import_meta_context_dependency_parser_plugin;
14-
pub(crate) mod import_meta_env;
1514
mod import_meta_path;
1615
mod import_meta_plugin;
1716
mod import_parser_plugin;

crates/rspack_plugin_javascript/src/parser_plugin/import_meta_env.rs renamed to crates/rspack_plugin_javascript/src/plugin/env_plugin.rs

Lines changed: 69 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,80 @@
11
use std::sync::LazyLock;
22

33
use concat_string::concat_string;
4-
use rspack_core::{Compilation, CompilationId, property_access_with_optional};
4+
use rspack_core::{
5+
Compilation, CompilationId, CompilationParams, CompilerCompilation, Plugin,
6+
property_access_with_optional,
7+
};
8+
use rspack_error::Result;
9+
use rspack_hook::{plugin, plugin_hook};
510
use rspack_util::fx_hash::FxDashMap;
611
use serde_json::{Map, Value};
712
use swc_atoms::Atom;
813
use swc_experimental_ecma_ast::{MemberExpr, MemberProp, MetaPropKind};
914

10-
use super::define_plugin::utils::{code_object_properties_to_string, code_to_string};
11-
use crate::visitors::{ExportedVariableInfo, ExpressionExpressionInfo, JavascriptParser};
15+
use crate::{
16+
parser_plugin::define_plugin::utils::{code_object_properties_to_string, code_to_string},
17+
visitors::{ExportedVariableInfo, ExpressionExpressionInfo, JavascriptParser},
18+
};
19+
20+
#[plugin]
21+
#[derive(Debug, Default)]
22+
pub struct EnvPlugin;
23+
24+
impl EnvPlugin {
25+
pub(crate) fn collect(compilation_id: CompilationId, definitions: &ImportMetaEnvDefinitions) {
26+
let mut state = IMPORT_META_ENV_DEFINITIONS_MAP
27+
.entry(compilation_id)
28+
.or_default();
29+
state.definitions.merge(definitions);
30+
state.serialized = None;
31+
}
32+
33+
fn finalize(compilation: &mut Compilation) {
34+
let compilation_id = compilation.id();
35+
let mut state = IMPORT_META_ENV_DEFINITIONS_MAP
36+
.entry(compilation_id)
37+
.or_default();
38+
let serialized = match &state.serialized {
39+
Some(serialized) => serialized.clone(),
40+
None => {
41+
let serialized = serialize_import_meta_env_definitions(&state.definitions);
42+
state.serialized = Some(serialized.clone());
43+
serialized
44+
}
45+
};
46+
compilation
47+
.value_cache_versions
48+
.insert(IMPORT_META_ENV_VALUE_DEP_KEY.to_string(), serialized);
49+
}
50+
}
51+
52+
#[plugin_hook(CompilerCompilation for EnvPlugin, stage = i32::MAX, tracing=false)]
53+
async fn compilation(
54+
&self,
55+
compilation: &mut Compilation,
56+
_params: &mut CompilationParams,
57+
) -> Result<()> {
58+
if compilation.options.experiments.env {
59+
EnvPlugin::finalize(compilation);
60+
}
61+
Ok(())
62+
}
63+
64+
impl Plugin for EnvPlugin {
65+
fn name(&self) -> &'static str {
66+
"rspack.EnvPlugin"
67+
}
68+
69+
fn clear_cache(&self, id: CompilationId) {
70+
IMPORT_META_ENV_DEFINITIONS_MAP.remove(&id);
71+
}
72+
73+
fn apply(&self, ctx: &mut rspack_core::ApplyContext<'_>) -> Result<()> {
74+
ctx.compiler_hooks.compilation.tap(compilation::new(self));
75+
Ok(())
76+
}
77+
}
1278

1379
pub(crate) const IMPORT_META_ENV: &str = "import.meta.env";
1480
pub(crate) const IMPORT_META_ENV_PREFIX: &str = "import.meta.env.";
@@ -135,46 +201,6 @@ fn serialize_import_meta_env_definitions(definitions: &ImportMetaEnvDefinitions)
135201
concat_string!("{", properties, "}")
136202
}
137203

138-
pub(crate) fn merge_import_meta_env_definitions(
139-
compilation_id: CompilationId,
140-
definitions: &ImportMetaEnvDefinitions,
141-
) {
142-
let mut state = IMPORT_META_ENV_DEFINITIONS_MAP
143-
.entry(compilation_id)
144-
.or_default();
145-
state.definitions.merge(definitions);
146-
state.serialized = None;
147-
}
148-
149-
pub(crate) fn finalize_import_meta_env_definitions(compilation: &mut Compilation) {
150-
let compilation_id = compilation.id();
151-
let mut state = IMPORT_META_ENV_DEFINITIONS_MAP
152-
.entry(compilation_id)
153-
.or_default();
154-
let serialized = match &state.serialized {
155-
Some(serialized) => serialized.clone(),
156-
None => {
157-
let serialized = serialize_import_meta_env_definitions(&state.definitions);
158-
state.serialized = Some(serialized.clone());
159-
serialized
160-
}
161-
};
162-
compilation
163-
.value_cache_versions
164-
.insert(IMPORT_META_ENV_VALUE_DEP_KEY.to_string(), serialized);
165-
}
166-
167-
pub(crate) fn seed_import_meta_env_value_cache(compilation: &mut Compilation) {
168-
compilation.value_cache_versions.insert(
169-
IMPORT_META_ENV_VALUE_DEP_KEY.to_string(),
170-
import_meta_env_definitions_string(compilation.id()),
171-
);
172-
}
173-
174-
pub(crate) fn remove_import_meta_env_definitions(compilation_id: CompilationId) {
175-
IMPORT_META_ENV_DEFINITIONS_MAP.remove(&compilation_id);
176-
}
177-
178204
pub(crate) fn import_meta_env_definitions_string(compilation_id: CompilationId) -> String {
179205
IMPORT_META_ENV_DEFINITIONS_MAP
180206
.get(&compilation_id)

crates/rspack_plugin_javascript/src/plugin/impl_plugin_for_js_plugin.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ use crate::{
4747
unsupported_dependency::UnsupportedDependencyTemplate,
4848
},
4949
parser_and_generator::JavaScriptParserAndGenerator,
50-
parser_plugin::import_meta_env::seed_import_meta_env_value_cache,
5150
};
5251

5352
#[plugin_hook(CompilerCompilation for JsPlugin)]
@@ -56,10 +55,6 @@ async fn compilation(
5655
compilation: &mut Compilation,
5756
params: &mut CompilationParams,
5857
) -> Result<()> {
59-
if compilation.options.experiments.env {
60-
seed_import_meta_env_value_cache(compilation);
61-
}
62-
6358
// ESMModulesPlugin
6459
compilation.set_dependency_factory(
6560
DependencyType::EsmImport,

crates/rspack_plugin_javascript/src/plugin/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use rayon::prelude::*;
99
use rustc_hash::{FxHashMap, FxHashSet as HashSet};
1010
pub mod api_plugin;
1111
mod drive;
12+
pub mod env_plugin;
1213
mod flag_dependency_exports_plugin;
1314
mod flag_dependency_usage_plugin;
1415
pub mod impl_plugin_for_js_plugin;
@@ -21,6 +22,7 @@ mod side_effects_flag_plugin;
2122
pub mod url_plugin;
2223

2324
pub use drive::*;
25+
pub use env_plugin::*;
2426
pub use flag_dependency_exports_plugin::*;
2527
pub use flag_dependency_usage_plugin::*;
2628
pub use inline_exports_plugin::*;

0 commit comments

Comments
 (0)