Skip to content

Commit 4eb6cfe

Browse files
committed
feat(treeshaking): optimize pure functions
1 parent d424733 commit 4eb6cfe

File tree

55 files changed

+1654
-502
lines changed

Some content is hidden

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

55 files changed

+1654
-502
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/node_binding/rspack.wasi-browser.js

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -63,63 +63,4 @@ const {
6363
},
6464
})
6565
export default __napiModule.exports
66-
export const Assets = __napiModule.exports.Assets
67-
export const AsyncDependenciesBlock = __napiModule.exports.AsyncDependenciesBlock
68-
export const Chunk = __napiModule.exports.Chunk
69-
export const ChunkGraph = __napiModule.exports.ChunkGraph
70-
export const ChunkGroup = __napiModule.exports.ChunkGroup
71-
export const Chunks = __napiModule.exports.Chunks
72-
export const CodeGenerationResult = __napiModule.exports.CodeGenerationResult
73-
export const CodeGenerationResults = __napiModule.exports.CodeGenerationResults
74-
export const ConcatenatedModule = __napiModule.exports.ConcatenatedModule
75-
export const ContextModule = __napiModule.exports.ContextModule
76-
export const Dependency = __napiModule.exports.Dependency
77-
export const Diagnostics = __napiModule.exports.Diagnostics
78-
export const EntryDataDto = __napiModule.exports.EntryDataDto
79-
export const EntryDataDTO = __napiModule.exports.EntryDataDTO
80-
export const EntryDependency = __napiModule.exports.EntryDependency
81-
export const EntryOptionsDto = __napiModule.exports.EntryOptionsDto
82-
export const EntryOptionsDTO = __napiModule.exports.EntryOptionsDTO
83-
export const ExternalModule = __napiModule.exports.ExternalModule
84-
export const JsCompilation = __napiModule.exports.JsCompilation
85-
export const JsCompiler = __napiModule.exports.JsCompiler
86-
export const JsContextModuleFactoryAfterResolveData = __napiModule.exports.JsContextModuleFactoryAfterResolveData
87-
export const JsContextModuleFactoryBeforeResolveData = __napiModule.exports.JsContextModuleFactoryBeforeResolveData
88-
export const JsDependencies = __napiModule.exports.JsDependencies
89-
export const JsEntries = __napiModule.exports.JsEntries
90-
export const JsExportsInfo = __napiModule.exports.JsExportsInfo
91-
export const JsModuleGraph = __napiModule.exports.JsModuleGraph
92-
export const JsResolver = __napiModule.exports.JsResolver
93-
export const JsResolverFactory = __napiModule.exports.JsResolverFactory
94-
export const JsStats = __napiModule.exports.JsStats
95-
export const KnownBuildInfo = __napiModule.exports.KnownBuildInfo
96-
export const Module = __napiModule.exports.Module
97-
export const ModuleGraphConnection = __napiModule.exports.ModuleGraphConnection
98-
export const NativeWatcher = __napiModule.exports.NativeWatcher
99-
export const NativeWatchResult = __napiModule.exports.NativeWatchResult
100-
export const NormalModule = __napiModule.exports.NormalModule
101-
export const RawExternalItemFnCtx = __napiModule.exports.RawExternalItemFnCtx
102-
export const ReadonlyResourceData = __napiModule.exports.ReadonlyResourceData
103-
export const ResolverFactory = __napiModule.exports.ResolverFactory
104-
export const Sources = __napiModule.exports.Sources
105-
export const VirtualFileStore = __napiModule.exports.VirtualFileStore
106-
export const JsVirtualFileStore = __napiModule.exports.JsVirtualFileStore
107-
export const async = __napiModule.exports.async
108-
export const BuiltinPluginName = __napiModule.exports.BuiltinPluginName
109-
export const cleanupGlobalTrace = __napiModule.exports.cleanupGlobalTrace
110-
export const EnforceExtension = __napiModule.exports.EnforceExtension
111-
export const EXPECTED_RSPACK_CORE_VERSION = __napiModule.exports.EXPECTED_RSPACK_CORE_VERSION
112-
export const formatDiagnostic = __napiModule.exports.formatDiagnostic
113-
export const JsLoaderState = __napiModule.exports.JsLoaderState
114-
export const JsRspackSeverity = __napiModule.exports.JsRspackSeverity
115-
export const loadBrowserslist = __napiModule.exports.loadBrowserslist
116-
export const minify = __napiModule.exports.minify
117-
export const minifySync = __napiModule.exports.minifySync
118-
export const RawJavascriptParserCommonjsExports = __napiModule.exports.RawJavascriptParserCommonjsExports
119-
export const RawRuleSetConditionType = __napiModule.exports.RawRuleSetConditionType
120-
export const registerGlobalTrace = __napiModule.exports.registerGlobalTrace
121-
export const RegisterJsTapKind = __napiModule.exports.RegisterJsTapKind
122-
export const sync = __napiModule.exports.sync
123-
export const syncTraceEvent = __napiModule.exports.syncTraceEvent
124-
export const transform = __napiModule.exports.transform
125-
export const transformSync = __napiModule.exports.transformSync
66+

crates/node_binding/rspack.wasi.cjs

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -108,63 +108,4 @@ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule
108108
},
109109
})
110110
module.exports = __napiModule.exports
111-
module.exports.Assets = __napiModule.exports.Assets
112-
module.exports.AsyncDependenciesBlock = __napiModule.exports.AsyncDependenciesBlock
113-
module.exports.Chunk = __napiModule.exports.Chunk
114-
module.exports.ChunkGraph = __napiModule.exports.ChunkGraph
115-
module.exports.ChunkGroup = __napiModule.exports.ChunkGroup
116-
module.exports.Chunks = __napiModule.exports.Chunks
117-
module.exports.CodeGenerationResult = __napiModule.exports.CodeGenerationResult
118-
module.exports.CodeGenerationResults = __napiModule.exports.CodeGenerationResults
119-
module.exports.ConcatenatedModule = __napiModule.exports.ConcatenatedModule
120-
module.exports.ContextModule = __napiModule.exports.ContextModule
121-
module.exports.Dependency = __napiModule.exports.Dependency
122-
module.exports.Diagnostics = __napiModule.exports.Diagnostics
123-
module.exports.EntryDataDto = __napiModule.exports.EntryDataDto
124-
module.exports.EntryDataDTO = __napiModule.exports.EntryDataDTO
125-
module.exports.EntryDependency = __napiModule.exports.EntryDependency
126-
module.exports.EntryOptionsDto = __napiModule.exports.EntryOptionsDto
127-
module.exports.EntryOptionsDTO = __napiModule.exports.EntryOptionsDTO
128-
module.exports.ExternalModule = __napiModule.exports.ExternalModule
129-
module.exports.JsCompilation = __napiModule.exports.JsCompilation
130-
module.exports.JsCompiler = __napiModule.exports.JsCompiler
131-
module.exports.JsContextModuleFactoryAfterResolveData = __napiModule.exports.JsContextModuleFactoryAfterResolveData
132-
module.exports.JsContextModuleFactoryBeforeResolveData = __napiModule.exports.JsContextModuleFactoryBeforeResolveData
133-
module.exports.JsDependencies = __napiModule.exports.JsDependencies
134-
module.exports.JsEntries = __napiModule.exports.JsEntries
135-
module.exports.JsExportsInfo = __napiModule.exports.JsExportsInfo
136-
module.exports.JsModuleGraph = __napiModule.exports.JsModuleGraph
137-
module.exports.JsResolver = __napiModule.exports.JsResolver
138-
module.exports.JsResolverFactory = __napiModule.exports.JsResolverFactory
139-
module.exports.JsStats = __napiModule.exports.JsStats
140-
module.exports.KnownBuildInfo = __napiModule.exports.KnownBuildInfo
141-
module.exports.Module = __napiModule.exports.Module
142-
module.exports.ModuleGraphConnection = __napiModule.exports.ModuleGraphConnection
143-
module.exports.NativeWatcher = __napiModule.exports.NativeWatcher
144-
module.exports.NativeWatchResult = __napiModule.exports.NativeWatchResult
145-
module.exports.NormalModule = __napiModule.exports.NormalModule
146-
module.exports.RawExternalItemFnCtx = __napiModule.exports.RawExternalItemFnCtx
147-
module.exports.ReadonlyResourceData = __napiModule.exports.ReadonlyResourceData
148-
module.exports.ResolverFactory = __napiModule.exports.ResolverFactory
149-
module.exports.Sources = __napiModule.exports.Sources
150-
module.exports.VirtualFileStore = __napiModule.exports.VirtualFileStore
151-
module.exports.JsVirtualFileStore = __napiModule.exports.JsVirtualFileStore
152-
module.exports.async = __napiModule.exports.async
153-
module.exports.BuiltinPluginName = __napiModule.exports.BuiltinPluginName
154-
module.exports.cleanupGlobalTrace = __napiModule.exports.cleanupGlobalTrace
155-
module.exports.EnforceExtension = __napiModule.exports.EnforceExtension
156-
module.exports.EXPECTED_RSPACK_CORE_VERSION = __napiModule.exports.EXPECTED_RSPACK_CORE_VERSION
157-
module.exports.formatDiagnostic = __napiModule.exports.formatDiagnostic
158-
module.exports.JsLoaderState = __napiModule.exports.JsLoaderState
159-
module.exports.JsRspackSeverity = __napiModule.exports.JsRspackSeverity
160-
module.exports.loadBrowserslist = __napiModule.exports.loadBrowserslist
161-
module.exports.minify = __napiModule.exports.minify
162-
module.exports.minifySync = __napiModule.exports.minifySync
163-
module.exports.RawJavascriptParserCommonjsExports = __napiModule.exports.RawJavascriptParserCommonjsExports
164-
module.exports.RawRuleSetConditionType = __napiModule.exports.RawRuleSetConditionType
165-
module.exports.registerGlobalTrace = __napiModule.exports.registerGlobalTrace
166-
module.exports.RegisterJsTapKind = __napiModule.exports.RegisterJsTapKind
167-
module.exports.sync = __napiModule.exports.sync
168-
module.exports.syncTraceEvent = __napiModule.exports.syncTraceEvent
169-
module.exports.transform = __napiModule.exports.transform
170-
module.exports.transformSync = __napiModule.exports.transformSync
111+

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)