Skip to content

Commit e3e337b

Browse files
authored
perf(turbopack): Reduce needless allocations for SWC plugins (#75275)
### What? Reduce allocations for SWC plugins, by applying swc-project/plugins#393 ### Why? Those are actually noop so they should not allocate too much.
1 parent 4249afd commit e3e337b

File tree

8 files changed

+134
-120
lines changed

8 files changed

+134
-120
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ testing = { version = "5.0.0" }
101101
browserslist-rs = { version = "0.16.0" }
102102
miette = { version = "5.10.0", features = ["fancy"] }
103103
mdxjs = "0.2.15"
104-
modularize_imports = { version = "0.70.1" }
105-
styled_components = { version = "0.98.2" }
106-
styled_jsx = { version = "0.75.2" }
107-
swc_emotion = { version = "0.74.2" }
104+
modularize_imports = { version = "0.71.0" }
105+
styled_components = { version = "0.99.0" }
106+
styled_jsx = { version = "0.76.0" }
107+
swc_emotion = { version = "0.75.0" }
108108
swc_relay = { version = "0.46.1" }
109109

110110
# General Deps

crates/next-core/src/next_shared/transforms/modularize_imports.rs

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
use std::collections::HashMap;
2-
31
use anyhow::Result;
42
use async_trait::async_trait;
5-
use modularize_imports::{modularize_imports, PackageConfig};
3+
use modularize_imports::{modularize_imports, Config, PackageConfig};
64
use serde::{Deserialize, Serialize};
75
use swc_core::ecma::ast::Program;
86
use turbo_tasks::{trace::TraceRawVcs, FxIndexMap, NonLocalValue, OperationValue, ResolvedVc};
@@ -71,35 +69,39 @@ pub fn get_next_modularize_imports_rule(
7169

7270
#[derive(Debug)]
7371
struct ModularizeImportsTransformer {
74-
packages: HashMap<String, PackageConfig>,
72+
config: Config,
7573
}
7674

7775
impl ModularizeImportsTransformer {
7876
fn new(packages: &FxIndexMap<String, ModularizeImportPackageConfig>) -> Self {
7977
Self {
80-
packages: packages
81-
.iter()
82-
.map(|(k, v)| {
83-
(
84-
k.clone(),
85-
PackageConfig {
86-
transform: match &v.transform {
87-
Transform::String(s) => {
88-
modularize_imports::Transform::String(s.clone())
89-
}
90-
Transform::Vec(v) => modularize_imports::Transform::Vec(v.clone()),
91-
Transform::None => {
92-
panic!("Missing transform value for package {}", k)
93-
}
78+
config: Config {
79+
packages: packages
80+
.iter()
81+
.map(|(k, v)| {
82+
(
83+
k.clone(),
84+
PackageConfig {
85+
transform: match &v.transform {
86+
Transform::String(s) => {
87+
modularize_imports::Transform::String(s.clone())
88+
}
89+
Transform::Vec(v) => {
90+
modularize_imports::Transform::Vec(v.clone())
91+
}
92+
Transform::None => {
93+
panic!("Missing transform value for package {}", k)
94+
}
95+
},
96+
prevent_full_import: v.prevent_full_import,
97+
skip_default_conversion: v.skip_default_conversion,
98+
handle_default_import: false,
99+
handle_namespace_import: false,
94100
},
95-
prevent_full_import: v.prevent_full_import,
96-
skip_default_conversion: v.skip_default_conversion,
97-
handle_default_import: false,
98-
handle_namespace_import: false,
99-
},
100-
)
101-
})
102-
.collect(),
101+
)
102+
})
103+
.collect(),
104+
},
103105
}
104106
}
105107
}
@@ -108,9 +110,7 @@ impl ModularizeImportsTransformer {
108110
impl CustomTransformer for ModularizeImportsTransformer {
109111
#[tracing::instrument(level = tracing::Level::TRACE, name = "modularize_imports", skip_all)]
110112
async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> {
111-
program.mutate(modularize_imports(modularize_imports::Config {
112-
packages: self.packages.clone(),
113-
}));
113+
program.mutate(modularize_imports(&self.config));
114114

115115
Ok(())
116116
}

crates/next-custom-transforms/src/chain_transforms.rs

Lines changed: 66 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ use swc_core::{
1313
FileName, Mark, SourceFile, SourceMap, SyntaxContext,
1414
},
1515
ecma::{
16-
ast::{noop_pass, EsVersion, Pass},
16+
ast::{fn_pass, noop_pass, EsVersion, Pass},
1717
parser::parse_file_as_module,
18-
visit::{fold_pass, visit_mut_pass},
18+
visit::visit_mut_pass,
1919
},
2020
};
2121

@@ -149,13 +149,6 @@ where
149149
}
150150
};
151151

152-
let modularize_imports_config = match &opts.modularize_imports {
153-
Some(config) => config.clone(),
154-
None => modularize_imports::Config {
155-
packages: std::collections::HashMap::new(),
156-
},
157-
};
158-
159152
let target_browsers = opts
160153
.swc
161154
.config
@@ -164,20 +157,69 @@ where
164157
.map(|env| targets_to_versions(env.targets.clone()).expect("failed to parse env.targets"))
165158
.unwrap_or_default();
166159

167-
let styled_jsx = if let Some(config) = opts.styled_jsx.to_option() {
168-
Either::Left(styled_jsx::visitor::styled_jsx(
169-
cm.clone(),
170-
(*file.name).clone(),
171-
styled_jsx::visitor::Config {
172-
use_lightningcss: config.use_lightningcss,
173-
browsers: target_browsers,
174-
},
175-
styled_jsx::visitor::NativeConfig { process_css: None },
176-
))
177-
} else {
178-
Either::Right(noop_pass())
160+
let styled_jsx = {
161+
let cm = cm.clone();
162+
let file = file.clone();
163+
164+
fn_pass(move |program| {
165+
if let Some(config) = opts.styled_jsx.to_option() {
166+
program.mutate(styled_jsx::visitor::styled_jsx(
167+
cm.clone(),
168+
&file.name,
169+
&styled_jsx::visitor::Config {
170+
use_lightningcss: config.use_lightningcss,
171+
browsers: target_browsers,
172+
},
173+
&styled_jsx::visitor::NativeConfig { process_css: None },
174+
))
175+
}
176+
})
179177
};
180178

179+
let styled_components = {
180+
let file = file.clone();
181+
182+
fn_pass(move |program| {
183+
if let Some(config) = &opts.styled_components {
184+
program.mutate(styled_components::styled_components(
185+
&file.name,
186+
file.src_hash,
187+
config,
188+
NoopComments,
189+
))
190+
}
191+
})
192+
};
193+
194+
let emotion = {
195+
let cm = cm.clone();
196+
let file = file.clone();
197+
let comments = comments.clone();
198+
199+
fn_pass(move |program| {
200+
if let Some(config) = opts.emotion.as_ref() {
201+
if !config.enabled.unwrap_or(false) {
202+
return;
203+
}
204+
if let FileName::Real(path) = &*file.name {
205+
program.mutate(swc_emotion::emotion(
206+
config,
207+
path,
208+
file.src_hash as u32,
209+
cm.clone(),
210+
comments.clone(),
211+
));
212+
}
213+
}
214+
})
215+
};
216+
217+
let modularize_imports = fn_pass(move |program| {
218+
if let Some(config) = opts.modularize_imports.as_ref() {
219+
program.mutate(modularize_imports::modularize_imports(config));
220+
}
221+
});
222+
181223
(
182224
(
183225
crate::transforms::disallow_re_export_all_in_page::disallow_re_export_all_in_page(
@@ -195,15 +237,7 @@ where
195237
_ => Either::Right(noop_pass()),
196238
},
197239
styled_jsx,
198-
match &opts.styled_components {
199-
Some(config) => Either::Left(styled_components::styled_components(
200-
file.name.clone(),
201-
file.src_hash,
202-
config.clone(),
203-
NoopComments,
204-
)),
205-
None => Either::Right(noop_pass()),
206-
},
240+
styled_components,
207241
Optional::new(
208242
crate::transforms::next_ssg::next_ssg(eliminated_packages),
209243
!opts.disable_next_ssg,
@@ -274,28 +308,8 @@ where
274308
),
275309
_ => Either::Right(noop_pass()),
276310
},
277-
opts.emotion
278-
.as_ref()
279-
.and_then(|config| {
280-
if !config.enabled.unwrap_or(false) {
281-
return None;
282-
}
283-
if let FileName::Real(path) = &*file.name {
284-
path.to_str().map(|_| {
285-
Either::Left(fold_pass(swc_emotion::EmotionTransformer::new(
286-
config.clone(),
287-
path,
288-
file.src_hash as u32,
289-
cm,
290-
comments.clone(),
291-
)))
292-
})
293-
} else {
294-
None
295-
}
296-
})
297-
.unwrap_or_else(|| Either::Right(noop_pass())),
298-
modularize_imports::modularize_imports(modularize_imports_config),
311+
emotion,
312+
modularize_imports,
299313
match &opts.font_loaders {
300314
Some(config) => Either::Left(next_font_loaders(config.clone())),
301315
None => Either::Right(noop_pass()),

turbopack/crates/turbopack-ecmascript-plugins/src/transform/emotion.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ impl CustomTransformer for EmotionTransformer {
104104
hasher.finish()
105105
};
106106
program.mutate(swc_emotion::emotion(
107-
self.config.clone(),
107+
&self.config,
108108
Path::new(ctx.file_name_str),
109109
hash as u32,
110110
ctx.source_map.clone(),

turbopack/crates/turbopack-ecmascript-plugins/src/transform/modularize_imports.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::collections::HashMap;
2-
31
use anyhow::Result;
42
use async_trait::async_trait;
53
use modularize_imports::{modularize_imports, Config, PackageConfig};
@@ -20,27 +18,31 @@ pub struct ModularizeImportPackageConfig {
2018

2119
#[derive(Debug)]
2220
pub struct ModularizeImportsTransformer {
23-
packages: HashMap<String, PackageConfig>,
21+
config: Config,
2422
}
2523

2624
impl ModularizeImportsTransformer {
2725
pub fn new(packages: &FxIndexMap<String, ModularizeImportPackageConfig>) -> Self {
2826
Self {
29-
packages: packages
30-
.iter()
31-
.map(|(k, v)| {
32-
(
33-
k.clone(),
34-
PackageConfig {
35-
transform: modularize_imports::Transform::String(v.transform.clone()),
36-
prevent_full_import: v.prevent_full_import,
37-
skip_default_conversion: v.skip_default_conversion,
38-
handle_default_import: false,
39-
handle_namespace_import: false,
40-
},
41-
)
42-
})
43-
.collect(),
27+
config: Config {
28+
packages: packages
29+
.iter()
30+
.map(|(k, v)| {
31+
(
32+
k.clone(),
33+
PackageConfig {
34+
transform: modularize_imports::Transform::String(
35+
v.transform.clone(),
36+
),
37+
prevent_full_import: v.prevent_full_import,
38+
skip_default_conversion: v.skip_default_conversion,
39+
handle_default_import: false,
40+
handle_namespace_import: false,
41+
},
42+
)
43+
})
44+
.collect(),
45+
},
4446
}
4547
}
4648
}
@@ -49,9 +51,7 @@ impl ModularizeImportsTransformer {
4951
impl CustomTransformer for ModularizeImportsTransformer {
5052
#[tracing::instrument(level = tracing::Level::TRACE, name = "modularize_imports", skip_all)]
5153
async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> {
52-
program.mutate(modularize_imports(Config {
53-
packages: self.packages.clone(),
54-
}));
54+
program.mutate(modularize_imports(&self.config));
5555

5656
Ok(())
5757
}

turbopack/crates/turbopack-ecmascript-plugins/src/transform/styled_components.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ impl CustomTransformer for StyledComponentsTransformer {
9292
#[tracing::instrument(level = tracing::Level::TRACE, name = "styled_components", skip_all)]
9393
async fn transform(&self, program: &mut Program, ctx: &TransformContext<'_>) -> Result<()> {
9494
program.mutate(styled_components::styled_components(
95-
FileName::Real(PathBuf::from(ctx.file_path_str)).into(),
95+
&FileName::Real(PathBuf::from(ctx.file_path_str)),
9696
ctx.file_name_hash,
97-
self.config.clone(),
97+
&self.config,
9898
NoopComments,
9999
));
100100

0 commit comments

Comments
 (0)