diff --git a/crates/mako/src/analyze_deps.rs b/crates/mako/src/analyze_deps.rs index 9766f41ea..75a097ed7 100644 --- a/crates/mako/src/analyze_deps.rs +++ b/crates/mako/src/analyze_deps.rs @@ -19,7 +19,6 @@ pub enum AnalyzeDepsError { pub struct AnalyzeDepsResult { pub resolved_deps: Vec, pub missing_deps: Vec, - pub ignored_deps: Vec, } #[derive(Debug, Clone)] @@ -46,7 +45,6 @@ impl AnalyzeDeps { let mut resolved_deps = vec![]; let mut missing_deps = vec![]; - let mut ignored_deps = vec![]; let path = file.path.to_str().unwrap(); for dep in deps { let result = resolve( @@ -58,14 +56,10 @@ impl AnalyzeDeps { ); match result { Ok(resolver_resource) => { - if matches!(resolver_resource, ResolverResource::Ignored) { - ignored_deps.push(dep); - } else { - resolved_deps.push(ResolvedDep { - resolver_resource, - dependency: dep, - }); - } + resolved_deps.push(ResolvedDep { + resolver_resource, + dependency: dep, + }); } Err(_err) => { missing_deps.push(dep); @@ -93,7 +87,6 @@ impl AnalyzeDeps { Ok(AnalyzeDepsResult { resolved_deps, missing_deps, - ignored_deps, }) } diff --git a/crates/mako/src/ast_2/file.rs b/crates/mako/src/ast_2/file.rs index 4ff10ba5a..7bdd1661c 100644 --- a/crates/mako/src/ast_2/file.rs +++ b/crates/mako/src/ast_2/file.rs @@ -79,7 +79,8 @@ impl File { // TODO: remove this specific logic params.iter().any(|(k, _)| k == "asmodule"); let is_under_node_modules = path.to_string_lossy().contains("node_modules"); - let extname = PathBuf::from(pathname.clone()) + let extname = pathname + .clone() .extension() .map(|ext| ext.to_string_lossy().to_string()) .unwrap_or_default(); diff --git a/crates/mako/src/build.rs b/crates/mako/src/build.rs index 539b4ae4d..a4fc8605a 100644 --- a/crates/mako/src/build.rs +++ b/crates/mako/src/build.rs @@ -82,19 +82,26 @@ impl Compiler { // handle deps for dep in resolved_deps { let path = dep.resolver_resource.get_resolved_path(); - let is_external = dep.resolver_resource.get_external().is_some(); let dep_module_id = ModuleId::new(path.clone()); if !module_graph.has_module(&dep_module_id) { - let module = if is_external { - Self::create_external_module(&dep.resolver_resource, self.context.clone()) - } else { - Self::create_empty_module(&dep_module_id) + let module = match dep.resolver_resource { + ResolverResource::Resolved(_) => { + count += 1; + + let file = File::new(path.clone(), self.context.clone()); + build_with_pool(file, Some(dep.resolver_resource.clone())); + + Self::create_empty_module(&dep_module_id) + } + ResolverResource::External(_) => Self::create_external_module( + &dep.resolver_resource, + self.context.clone(), + ), + ResolverResource::Ignored(_) => { + Self::create_ignored_module(&path, self.context.clone()) + } }; - if !is_external { - count += 1; - let file = File::new(path.clone(), self.context.clone()); - build_with_pool(file, Some(dep.resolver_resource.clone())); - } + // 拿到依赖之后需要直接添加 module 到 module_graph 里,不能等依赖 build 完再添加 // 是因为由于是异步处理各个模块,后者会导致大量重复任务的 build_module 任务(3 倍左右) module_ids.insert(module.id.clone()); @@ -179,6 +186,31 @@ __mako_require__.loadScript('{}', (e) => e.type === 'load' ? resolve() : reject( Ok(Module::new(module_id, false, Some(info))) } + fn create_ignored_module(path: &str, context: Arc) -> Module { + let module_id = ModuleId::new(path.to_owned()); + + let mut module = Module::new(module_id, false, None); + + let info = { + let file = File::with_content( + path.to_owned(), + Content::Js("".to_string()), + context.clone(), + ); + let ast = Parse::parse(&file, context.clone()).unwrap(); + + ModuleInfo { + file, + ast, + ..Default::default() + } + }; + + module.add_info(Some(info)); + + module + } + pub fn create_empty_module(module_id: &ModuleId) -> Module { Module::new(module_id.clone(), false, None) } @@ -250,7 +282,6 @@ __mako_require__.loadScript('{}', (e) => e.type === 'load' ? resolve() : reject( path, raw, missing_deps: HashMap::new(), - ignored_deps: vec![], import_map: vec![], export_map: vec![], is_barrel: false, diff --git a/crates/mako/src/load.rs b/crates/mako/src/load.rs index 8bfc0fbde..1ba995270 100644 --- a/crates/mako/src/load.rs +++ b/crates/mako/src/load.rs @@ -49,7 +49,7 @@ pub struct Load {} impl Load { pub fn load(file: &File, context: Arc) -> Result { - mako_core::mako_profile_function!(file.path.to_str()); + mako_core::mako_profile_function!(file.path.to_string_lossy()); debug!("load: {:?}", file); // plugin first diff --git a/crates/mako/src/module.rs b/crates/mako/src/module.rs index 3c7be7ed8..a5f6c5ac4 100644 --- a/crates/mako/src/module.rs +++ b/crates/mako/src/module.rs @@ -52,7 +52,6 @@ pub struct ModuleInfo { pub raw: String, pub raw_hash: u64, pub missing_deps: HashMap, - pub ignored_deps: Vec, /// Modules with top-level-await pub top_level_await: bool, /// The top-level-await module must be an async module, in addition, for example, wasm is also an async module @@ -77,7 +76,6 @@ impl Default for ModuleInfo { raw: "".to_string(), raw_hash: 0, missing_deps: HashMap::new(), - ignored_deps: vec![], top_level_await: false, is_async: false, resolved_resource: None, diff --git a/crates/mako/src/parse.rs b/crates/mako/src/parse.rs index 5f31afc3c..d35909c7f 100644 --- a/crates/mako/src/parse.rs +++ b/crates/mako/src/parse.rs @@ -21,7 +21,7 @@ pub struct Parse {} impl Parse { pub fn parse(file: &File, context: Arc) -> Result { - mako_core::mako_profile_function!(file.path); + mako_core::mako_profile_function!(file.path.to_string_lossy()); // plugin first let ast = context @@ -49,7 +49,7 @@ impl Parse { if is_asmodule { let mut file = file.clone(); file.set_content(Content::Js(CssAst::generate_css_modules_exports( - &file.pathname.to_string_lossy().to_string(), + &file.pathname.to_string_lossy(), &mut ast.ast, context.config.css_modules_export_only_locales, ))); diff --git a/crates/mako/src/plugins/bundless_compiler.rs b/crates/mako/src/plugins/bundless_compiler.rs index 56ebd0d86..764f6104c 100644 --- a/crates/mako/src/plugins/bundless_compiler.rs +++ b/crates/mako/src/plugins/bundless_compiler.rs @@ -183,7 +183,6 @@ pub fn transform_modules(module_ids: Vec, context: &Arc) -> R let deps_to_replace = DependenciesToReplace { resolved: resolved_deps, missing: info.missing_deps.clone(), - ignored: vec![], }; if let ModuleAst::Script(ast) = ast { diff --git a/crates/mako/src/plugins/context_module.rs b/crates/mako/src/plugins/context_module.rs index 68b19e069..1a05eef83 100644 --- a/crates/mako/src/plugins/context_module.rs +++ b/crates/mako/src/plugins/context_module.rs @@ -1,4 +1,3 @@ -use std::path::PathBuf; use std::sync::Arc; use mako_core::anyhow::Result; @@ -32,7 +31,7 @@ impl Plugin for ContextModulePlugin { .find_map(|(k, v)| k.eq("glob").then_some(v)), param.file.path.is_dir(), ) { - let glob_pattern = PathBuf::from(param.file.pathname.clone()).join(glob_pattern); + let glob_pattern = param.file.pathname.clone().join(glob_pattern); let paths = glob(glob_pattern.to_str().unwrap())?; let mut key_values = vec![]; diff --git a/crates/mako/src/plugins/farm_tree_shake/shake/find_export_source.rs b/crates/mako/src/plugins/farm_tree_shake/shake/find_export_source.rs index f028967df..530fb2268 100644 --- a/crates/mako/src/plugins/farm_tree_shake/shake/find_export_source.rs +++ b/crates/mako/src/plugins/farm_tree_shake/shake/find_export_source.rs @@ -470,7 +470,6 @@ mod tests { raw: "".to_string(), raw_hash: 0, missing_deps: Default::default(), - ignored_deps: vec![], top_level_await: false, is_async: false, resolved_resource: None, diff --git a/crates/mako/src/resolve/mod.rs b/crates/mako/src/resolve/mod.rs index bf50d7ed5..2ceb48efb 100644 --- a/crates/mako/src/resolve/mod.rs +++ b/crates/mako/src/resolve/mod.rs @@ -223,9 +223,9 @@ fn do_resolve( } } Err(oxc_resolve_err) => match oxc_resolve_err { - OxcResolveError::Ignored(_) => { + OxcResolveError::Ignored(path) => { debug!("resolve ignored: {:?}", source); - Ok(ResolverResource::Ignored) + Ok(ResolverResource::Ignored(path)) } _ => { eprintln!( diff --git a/crates/mako/src/resolve/resource.rs b/crates/mako/src/resolve/resource.rs index b415ca09d..9f36ccfc6 100644 --- a/crates/mako/src/resolve/resource.rs +++ b/crates/mako/src/resolve/resource.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use oxc_resolver::Resolution; #[derive(Debug, Clone)] @@ -14,7 +16,7 @@ pub struct ResolvedResource(pub Resolution); pub enum ResolverResource { External(ExternalResource), Resolved(ResolvedResource), - Ignored, + Ignored(PathBuf), } impl ResolverResource { @@ -24,21 +26,21 @@ impl ResolverResource { ResolverResource::Resolved(ResolvedResource(resolution)) => { resolution.full_path().to_string_lossy().to_string() } - ResolverResource::Ignored => "".to_string(), + ResolverResource::Ignored(path) => path.to_string_lossy().to_string(), } } pub fn get_external(&self) -> Option { match self { ResolverResource::External(ExternalResource { external, .. }) => Some(external.clone()), ResolverResource::Resolved(_) => None, - ResolverResource::Ignored => None, + ResolverResource::Ignored(_) => None, } } pub fn get_script(&self) -> Option { match self { ResolverResource::External(ExternalResource { script, .. }) => script.clone(), ResolverResource::Resolved(_) => None, - ResolverResource::Ignored => None, + ResolverResource::Ignored(_) => None, } } } diff --git a/crates/mako/src/test_helper.rs b/crates/mako/src/test_helper.rs index 513a89c32..84b99369b 100644 --- a/crates/mako/src/test_helper.rs +++ b/crates/mako/src/test_helper.rs @@ -68,7 +68,6 @@ pub fn create_mock_module(path: PathBuf, code: &str) -> Module { raw_hash: 0, resolved_resource: None, missing_deps: HashMap::new(), - ignored_deps: vec![], top_level_await: false, is_async: false, source_map_chain: vec![], diff --git a/crates/mako/src/transform_in_generate.rs b/crates/mako/src/transform_in_generate.rs index 07e236089..7ccd544c2 100644 --- a/crates/mako/src/transform_in_generate.rs +++ b/crates/mako/src/transform_in_generate.rs @@ -128,7 +128,6 @@ pub fn transform_modules_in_thread( let deps_to_replace = DependenciesToReplace { resolved: resolved_deps, missing: info.missing_deps.clone(), - ignored: info.ignored_deps.clone(), }; if let ModuleAst::Script(mut ast) = ast { let ret = transform_js_generate(TransformJsParam { diff --git a/crates/mako/src/transformers/transform_dep_replacer.rs b/crates/mako/src/transformers/transform_dep_replacer.rs index 3816b4e2f..f96ffdc29 100644 --- a/crates/mako/src/transformers/transform_dep_replacer.rs +++ b/crates/mako/src/transformers/transform_dep_replacer.rs @@ -29,7 +29,6 @@ pub struct DependenciesToReplace { // e.g. "react" => ("hashed_id", "/abs/to/react/index.js") pub resolved: HashMap, pub missing: HashMap, - pub ignored: Vec, } pub fn miss_throw_stmt>(source: T) -> Expr { @@ -179,18 +178,12 @@ impl VisitMut for DepReplacer<'_> { impl DepReplacer<'_> { fn replace_source(&mut self, source: &mut Str) { - let to_replace = - if let Some(replacement) = self.to_replace.resolved.get(&source.value.to_string()) { - replacement.0.clone() - } else if self.to_replace.ignored.contains(&source.value.to_string()) { - "$$IGNORED$$".to_string() - } else { - return; - }; - - let span = source.span; - *source = Str::from(to_replace); - source.span = span; + if let Some(replacement) = self.to_replace.resolved.get(&source.value.to_string()) { + let module_id = replacement.0.clone(); + let span = source.span; + *source = Str::from(module_id); + source.span = span; + } } } @@ -300,7 +293,6 @@ mod tests { ) }, missing: HashMap::new(), - ignored: vec![], }; let cloned = context.clone(); @@ -349,7 +341,6 @@ mod tests { span: None, order: 0, }}, - ignored: vec![], }; let cloned = context.clone(); @@ -395,7 +386,6 @@ mod tests { span: None, order: 0, }}, - ignored: vec![], }; let cloned = context.clone(); @@ -451,7 +441,6 @@ mod tests { ) }, missing: hashmap! {}, - ignored: vec![], }, context: &context, unresolved_mark, diff --git a/crates/mako/templates/app_runtime.stpl b/crates/mako/templates/app_runtime.stpl index 53e171226..676c50823 100644 --- a/crates/mako/templates/app_runtime.stpl +++ b/crates/mako/templates/app_runtime.stpl @@ -3,7 +3,6 @@ function createRuntime(makoModules, entryModuleId) { var modulesRegistry = {}; function requireModule(moduleId) { - if (moduleId === '$$IGNORED$$') return {}; var cachedModule = modulesRegistry[moduleId]; if (cachedModule !== undefined) { diff --git a/e2e/fixtures/resolve.ignored/expect.js b/e2e/fixtures/resolve.ignored/expect.js index 90a0250c4..eee8907e0 100644 --- a/e2e/fixtures/resolve.ignored/expect.js +++ b/e2e/fixtures/resolve.ignored/expect.js @@ -1,7 +1,12 @@ const assert = require("assert"); -const { parseBuildResult, trim, moduleReg } = require("../../../scripts/test-utils"); +const { parseBuildResult } = require("../../../scripts/test-utils"); const { files } = parseBuildResult(__dirname); const content = files["index.js"]; -assert(content.includes(`__mako_require__("$$IGNORED$$")`), `should contain __mako_require__("$$IGNORED$$")`); +assert( + content.includes( + `/*./node_modules/ignored/index.js*/ "node_modules/ignored/index.js": function(module, exports, __mako_require__) {}` + ), + `ignored module should compile to empty module` +);