diff --git a/crates/mako/src/module_graph.rs b/crates/mako/src/module_graph.rs index a0d458d69..c374e1fdc 100644 --- a/crates/mako/src/module_graph.rs +++ b/crates/mako/src/module_graph.rs @@ -8,7 +8,7 @@ use mako_core::petgraph::visit::IntoEdgeReferences; use mako_core::petgraph::Direction; use mako_core::tracing::debug; -use crate::module::{Dependencies, Dependency, Module, ModuleId}; +use crate::module::{Dependencies, Dependency, Module, ModuleId, ResolveType}; #[derive(Debug)] pub struct ModuleGraph { @@ -238,13 +238,21 @@ impl ModuleGraph { targets } - pub fn remove_dependency_module_by_source(&mut self, module_id: &ModuleId, source: &String) { + pub fn remove_dependency_module_by_source_and_resolve_type( + &mut self, + module_id: &ModuleId, + source: &String, + resolve_type: ResolveType, + ) { let mut edges = self.get_edges(module_id, Direction::Outgoing); while let Some((edge_index, _node_index)) = edges.next(&self.graph) { let dependencies = self.graph.edge_weight_mut(edge_index).unwrap(); - if let Some(to_del_dep) = dependencies.iter().position(|dep| *source == dep.source) { + if let Some(to_del_dep) = dependencies + .iter() + .position(|dep| *source == dep.source && dep.resolve_type == resolve_type) + { dependencies.take(&dependencies.iter().nth(to_del_dep).unwrap().clone()); if dependencies.is_empty() { diff --git a/crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs b/crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs index 8a37096d4..8719e93e4 100644 --- a/crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs +++ b/crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs @@ -175,10 +175,13 @@ pub(super) fn skip_module_optimize( let mut to_insert = vec![]; let mut to_insert_deps = vec![]; let mut to_delete = false; + let mut resolve_type = None; match &mut stmt { ModuleItem::ModuleDecl(module_decl) => match module_decl { ModuleDecl::Import(import_decl) => { + resolve_type = Some(ResolveType::Import); + for replace in replaces { let mut matched_index = None; let mut matched_ident = None; @@ -230,6 +233,8 @@ pub(super) fn skip_module_optimize( ModuleDecl::ExportDecl(_) => {} ModuleDecl::ExportNamed(export_named) => { if export_named.src.is_some() { + resolve_type = Some(ResolveType::ExportNamed); + for replace in replaces { let mut matched_index = None; let mut matched_ident = None; @@ -307,7 +312,11 @@ pub(super) fn skip_module_optimize( } if to_delete { - module_graph.remove_dependency_module_by_source(module_id, source); + module_graph.remove_dependency_module_by_source_and_resolve_type( + module_id, + source, + resolve_type.unwrap(), + ); } for dep in to_insert_deps { module_graph.add_dependency(module_id, &dep.source.clone().into(), dep); diff --git a/crates/node/index.d.ts b/crates/node/index.d.ts index 7164e29c4..fe4f3c8bb 100644 --- a/crates/node/index.d.ts +++ b/crates/node/index.d.ts @@ -33,14 +33,15 @@ export interface BuildParams { alias?: Record; extensions?: string[]; }; - manifest?: boolean; - manifestConfig?: { - fileName: string; - basePath: string; - }; + manifest?: + | false + | { + fileName: string; + basePath: string; + }; mode?: 'development' | 'production'; define?: Record; - devtool?: 'source-map' | 'inline-source-map' | 'none'; + devtool?: false | 'source-map' | 'inline-source-map'; externals?: Record< string, | string @@ -58,29 +59,28 @@ export interface BuildParams { } >; copy?: string[]; - codeSplitting?: 'auto' | 'none'; + codeSplitting?: false | 'auto'; providers?: Record; publicPath?: string; inlineLimit?: number; targets?: Record; platform?: 'node' | 'browser'; - hmr?: boolean; - hmrPort?: string; - hmrHost?: string; - px2rem?: boolean; - px2remConfig?: { - root: number; - propBlackList: string[]; - propWhiteList: string[]; - selectorBlackList: string[]; - selectorWhiteList: string[]; - }; + hmr?: false | { host?: string; port?: number }; + px2rem?: + | false + | { + root?: number; + propBlackList?: string[]; + propWhiteList?: string[]; + selectorBlackList?: string[]; + selectorWhiteList?: string[]; + }; stats?: boolean; hash?: boolean; autoCSSModules?: boolean; ignoreCSSParserErrors?: boolean; dynamicImportToRequire?: boolean; - umd?: string; + umd?: false | string; transformImport?: { libraryName: string; libraryDirectory?: string; @@ -91,29 +91,33 @@ export interface BuildParams { ignores?: string[]; moduleIdStrategy?: 'hashed' | 'named'; minify?: boolean; - _minifish?: { - mapping: Record; - metaPath?: string; - inject?: Record< - string, - | { from: string; exclude?: string; preferRequire?: boolean } - | { - from: string; - named: string; - exclude?: string; - preferRequire?: boolean; - } - | { - from: string; - namespace: true; - exclude?: string; - preferRequire?: boolean; - } - >; - }; - optimization?: { - skipModules?: boolean; - }; + _minifish?: + | false + | { + mapping: Record; + metaPath?: string; + inject?: Record< + string, + | { from: string; exclude?: string; preferRequire?: boolean } + | { + from: string; + named: string; + exclude?: string; + preferRequire?: boolean; + } + | { + from: string; + namespace: true; + exclude?: string; + preferRequire?: boolean; + } + >; + }; + optimization?: + | false + | { + skipModules?: boolean; + }; }; hooks: JsHooks; watch: boolean; diff --git a/e2e/fixtures/tree-shaking_require_esm/mako.config.json b/e2e/fixtures/tree-shaking_require_esm/mako.config.json index 48669c82c..492310c8b 100644 --- a/e2e/fixtures/tree-shaking_require_esm/mako.config.json +++ b/e2e/fixtures/tree-shaking_require_esm/mako.config.json @@ -2,5 +2,8 @@ "mode": "production", "minify": false, "hmr": false, - "_treeShaking": "basic" + "_treeShaking": "basic", + "optimization": { + "skipModules": true + } }