Skip to content

Commit d48437b

Browse files
committed
feat(treeshaking): optimize pure functions
1 parent 86634a0 commit d48437b

File tree

53 files changed

+1652
-382
lines changed

Some content is hidden

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

53 files changed

+1652
-382
lines changed

crates/node_binding/napi-binding.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,7 @@ export declare enum BuiltinPluginName {
569569
EvalSourceMapDevToolPlugin = 'EvalSourceMapDevToolPlugin',
570570
EvalDevToolModulePlugin = 'EvalDevToolModulePlugin',
571571
SideEffectsFlagPlugin = 'SideEffectsFlagPlugin',
572+
InnerGraphPlugin = 'InnerGraphPlugin',
572573
FlagDependencyExportsPlugin = 'FlagDependencyExportsPlugin',
573574
FlagDependencyUsagePlugin = 'FlagDependencyUsagePlugin',
574575
InlineExportsPlugin = 'InlineExportsPlugin',
@@ -2138,6 +2139,7 @@ useInputFileSystem?: false | Array<RegExp>
21382139
css?: boolean
21392140
lazyBarrel: boolean
21402141
deferImport: boolean
2142+
advancedTreeShaking: boolean
21412143
}
21422144

21432145
export interface RawExperimentSnapshotOptions {
@@ -2370,6 +2372,7 @@ typeReexportsPresence?: string
23702372
*/
23712373
jsx?: boolean
23722374
deferImport?: boolean
2375+
sideEffectsFree?: Array<string>
23732376
}
23742377

23752378
export interface RawJsonGeneratorOptions {

crates/rspack/src/builder/builder_context.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ pub(super) enum BuiltinPluginOptions {
5757
EnsureChunkConditionsPlugin,
5858
MergeDuplicateChunksPlugin,
5959
SideEffectsFlagPlugin,
60+
InnerGraphPlugin,
6061
FlagDependencyExportsPlugin,
6162
FlagDependencyUsagePlugin(bool),
6263
ModuleConcatenationPlugin,
@@ -257,6 +258,9 @@ impl BuilderContext {
257258
BuiltinPluginOptions::SideEffectsFlagPlugin => {
258259
plugins.push(rspack_plugin_javascript::SideEffectsFlagPlugin::default().boxed());
259260
}
261+
BuiltinPluginOptions::InnerGraphPlugin => {
262+
plugins.push(rspack_plugin_javascript::InnerGraphPlugin::default().boxed());
263+
}
260264
BuiltinPluginOptions::FlagDependencyExportsPlugin => {
261265
plugins.push(rspack_plugin_javascript::FlagDependencyExportsPlugin::default().boxed());
262266
}

crates/rspack/src/builder/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3601,6 +3601,11 @@ impl OptimizationOptionsBuilder {
36013601
));
36023602
}
36033603
let inner_graph = d!(self.inner_graph, production);
3604+
if inner_graph {
3605+
builder_context
3606+
.plugins
3607+
.push(BuiltinPluginOptions::InnerGraphPlugin);
3608+
}
36043609
if !d!(self.emit_on_errors, !production) {
36053610
builder_context
36063611
.plugins
@@ -3699,6 +3704,7 @@ pub struct ExperimentsBuilder {
36993704
/// Whether to enable async web assembly.
37003705
async_web_assembly: Option<bool>,
37013706
// TODO: lazy compilation
3707+
advanced_tree_shaking: Option<bool>,
37023708
}
37033709

37043710
impl From<Experiments> for ExperimentsBuilder {
@@ -3712,6 +3718,7 @@ impl From<Experiments> for ExperimentsBuilder {
37123718
future_defaults: None,
37133719
css: Some(value.css),
37143720
async_web_assembly: None,
3721+
advanced_tree_shaking: Some(value.advanced_tree_shaking),
37153722
}
37163723
}
37173724
}
@@ -3727,6 +3734,7 @@ impl From<&mut ExperimentsBuilder> for ExperimentsBuilder {
37273734
future_defaults: value.future_defaults.take(),
37283735
css: value.css.take(),
37293736
async_web_assembly: value.async_web_assembly.take(),
3737+
advanced_tree_shaking: value.advanced_tree_shaking.take(),
37303738
}
37313739
}
37323740
}
@@ -3812,6 +3820,7 @@ impl ExperimentsBuilder {
38123820
css: d!(self.css, false),
38133821
lazy_barrel: true,
38143822
defer_import: false,
3823+
advanced_tree_shaking: d!(self.advanced_tree_shaking, false),
38153824
})
38163825
}
38173826
}

crates/rspack/tests/snapshots/defaults__default_options.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,6 +1480,7 @@ CompilerOptions {
14801480
false,
14811481
),
14821482
defer_import: None,
1483+
side_effects_free: None,
14831484
},
14841485
),
14851486
},
@@ -1518,6 +1519,7 @@ CompilerOptions {
15181519
css: false,
15191520
lazy_barrel: true,
15201521
defer_import: false,
1522+
advanced_tree_shaking: false,
15211523
},
15221524
node: Some(
15231525
NodeOption {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ use rspack_plugin_html::HtmlRspackPlugin;
6666
use rspack_plugin_ignore::IgnorePlugin;
6767
use rspack_plugin_javascript::{
6868
FlagDependencyExportsPlugin, FlagDependencyUsagePlugin, InferAsyncModulesPlugin,
69-
InlineExportsPlugin, JsPlugin, MangleExportsPlugin, ModuleConcatenationPlugin,
69+
InlineExportsPlugin, InnerGraphPlugin, JsPlugin, MangleExportsPlugin, ModuleConcatenationPlugin,
7070
SideEffectsFlagPlugin, api_plugin::APIPlugin, define_plugin::DefinePlugin,
7171
provide_plugin::ProvidePlugin, url_plugin::URLPlugin,
7272
};
@@ -196,6 +196,7 @@ pub enum BuiltinPluginName {
196196
EvalSourceMapDevToolPlugin,
197197
EvalDevToolModulePlugin,
198198
SideEffectsFlagPlugin,
199+
InnerGraphPlugin,
199200
FlagDependencyExportsPlugin,
200201
FlagDependencyUsagePlugin,
201202
InlineExportsPlugin,
@@ -607,6 +608,7 @@ impl<'a> BuiltinPlugin<'a> {
607608
BuiltinPluginName::SideEffectsFlagPlugin => {
608609
plugins.push(SideEffectsFlagPlugin::default().boxed())
609610
}
611+
BuiltinPluginName::InnerGraphPlugin => plugins.push(InnerGraphPlugin::default().boxed()),
610612
BuiltinPluginName::FlagDependencyExportsPlugin => {
611613
plugins.push(FlagDependencyExportsPlugin::default().boxed())
612614
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub struct RawExperiments {
2727
pub css: Option<bool>,
2828
pub lazy_barrel: bool,
2929
pub defer_import: bool,
30+
pub advanced_tree_shaking: bool,
3031
}
3132

3233
impl From<RawExperiments> for Experiments {
@@ -45,6 +46,7 @@ impl From<RawExperiments> for Experiments {
4546
css: value.css.unwrap_or(false),
4647
lazy_barrel: value.lazy_barrel,
4748
defer_import: value.defer_import,
49+
advanced_tree_shaking: value.advanced_tree_shaking,
4850
}
4951
}
5052
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ pub struct RawJavascriptParserOptions {
310310
/// @experimental
311311
pub jsx: Option<bool>,
312312
pub defer_import: Option<bool>,
313+
pub side_effects_free: Option<Vec<String>>,
313314
}
314315

315316
#[napi(object)]
@@ -388,6 +389,9 @@ impl From<RawJavascriptParserOptions> for JavascriptParserOptions {
388389
commonjs_magic_comments: value.commonjs_magic_comments,
389390
jsx: value.jsx,
390391
defer_import: value.defer_import,
392+
side_effects_free: value
393+
.side_effects_free
394+
.map(|functions| functions.into_iter().collect()),
391395
}
392396
}
393397
}

crates/rspack_core/src/dependency/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ impl std::fmt::Debug for DependencyCondition {
198198
}
199199

200200
#[rspack_cacheable::cacheable]
201-
#[derive(Debug, Clone, Serialize, Default)]
201+
#[derive(Debug, Clone, Serialize, Default, PartialEq, Eq)]
202202
pub struct ImportAttributes(FxHashMap<String, String>);
203203

204204
impl FromIterator<(String, String)> for ImportAttributes {

0 commit comments

Comments
 (0)