Skip to content

Commit

Permalink
hotfix(tree-shaking): skip module delete required dependency in edge (#…
Browse files Browse the repository at this point in the history
…842)

* fix: 🐛 skip module delete wrong dependence

* test: ✅ 显式开启 skip modules

* chore: ✏️ update binding types
  • Loading branch information
stormslowly authored Jan 4, 2024
1 parent e8feba3 commit b1b80cf
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 47 deletions.
14 changes: 11 additions & 3 deletions crates/mako/src/module_graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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() {
Expand Down
11 changes: 10 additions & 1 deletion crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
88 changes: 46 additions & 42 deletions crates/node/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,15 @@ export interface BuildParams {
alias?: Record<string, string>;
extensions?: string[];
};
manifest?: boolean;
manifestConfig?: {
fileName: string;
basePath: string;
};
manifest?:
| false
| {
fileName: string;
basePath: string;
};
mode?: 'development' | 'production';
define?: Record<string, string>;
devtool?: 'source-map' | 'inline-source-map' | 'none';
devtool?: false | 'source-map' | 'inline-source-map';
externals?: Record<
string,
| string
Expand All @@ -58,29 +59,28 @@ export interface BuildParams {
}
>;
copy?: string[];
codeSplitting?: 'auto' | 'none';
codeSplitting?: false | 'auto';
providers?: Record<string, string[]>;
publicPath?: string;
inlineLimit?: number;
targets?: Record<string, number>;
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;
Expand All @@ -91,29 +91,33 @@ export interface BuildParams {
ignores?: string[];
moduleIdStrategy?: 'hashed' | 'named';
minify?: boolean;
_minifish?: {
mapping: Record<string, string>;
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<string, string>;
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;
Expand Down
5 changes: 4 additions & 1 deletion e2e/fixtures/tree-shaking_require_esm/mako.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,8 @@
"mode": "production",
"minify": false,
"hmr": false,
"_treeShaking": "basic"
"_treeShaking": "basic",
"optimization": {
"skipModules": true
}
}

0 comments on commit b1b80cf

Please sign in to comment.