From 3ee323a6cf7f294ea538cf66875e7918616370e6 Mon Sep 17 00:00:00 2001 From: pshu Date: Sat, 22 Nov 2025 01:46:04 +0800 Subject: [PATCH 1/3] refactor: disable pnp when bench --- benches/resolver.rs | 96 +++++++++++++++++++++++++-------------------- src/file_system.rs | 10 +++++ src/lib.rs | 2 +- 3 files changed, 64 insertions(+), 44 deletions(-) diff --git a/benches/resolver.rs b/benches/resolver.rs index 9fe8762..3a664cc 100644 --- a/benches/resolver.rs +++ b/benches/resolver.rs @@ -8,7 +8,7 @@ use std::{ }; use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; -use rspack_resolver::{ResolveOptions, Resolver}; +use rspack_resolver::{FileSystemOptions, FileSystemOs, ResolveOptions, Resolver}; use serde_json::Value; use tokio::{ runtime::{self, Builder}, @@ -53,43 +53,52 @@ fn create_symlinks() -> io::Result { Ok(temp_path) } -fn rspack_resolver() -> rspack_resolver::Resolver { +fn rspack_resolver(enable_pnp: bool) -> rspack_resolver::Resolver { use rspack_resolver::{AliasValue, ResolveOptions, Resolver}; let alias_value = AliasValue::from("./"); - Resolver::new(ResolveOptions { - extensions: vec![".ts".into(), ".js".into(), ".mjs".into()], - condition_names: vec!["import".into(), "webpack".into(), "require".into()], - alias_fields: vec![vec!["browser".into()]], - extension_alias: vec![(".js".into(), vec![".ts".into(), ".js".into()])], - // Real projects LOVE setting these many aliases. - // I saw them with my own eyes. - alias: vec![ - ("/absolute/path".into(), vec![alias_value.clone()]), - ("aaa".into(), vec![alias_value.clone()]), - ("bbb".into(), vec![alias_value.clone()]), - ("ccc".into(), vec![alias_value.clone()]), - ("ddd".into(), vec![alias_value.clone()]), - ("eee".into(), vec![alias_value.clone()]), - ("fff".into(), vec![alias_value.clone()]), - ("ggg".into(), vec![alias_value.clone()]), - ("hhh".into(), vec![alias_value.clone()]), - ("iii".into(), vec![alias_value.clone()]), - ("jjj".into(), vec![alias_value.clone()]), - ("kkk".into(), vec![alias_value.clone()]), - ("lll".into(), vec![alias_value.clone()]), - ("mmm".into(), vec![alias_value.clone()]), - ("nnn".into(), vec![alias_value.clone()]), - ("ooo".into(), vec![alias_value.clone()]), - ("ppp".into(), vec![alias_value.clone()]), - ("qqq".into(), vec![alias_value.clone()]), - ("rrr".into(), vec![alias_value.clone()]), - ("sss".into(), vec![alias_value.clone()]), - ("@".into(), vec![alias_value.clone()]), - ("@@".into(), vec![alias_value.clone()]), - ("@@@".into(), vec![alias_value]), - ], - ..ResolveOptions::default() - }) + + let fs = FileSystemOs::new(FileSystemOptions { + #[cfg(feature = "yarn_pnp")] + enable_pnp, + }); + + Resolver::new_with_file_system( + fs, + ResolveOptions { + extensions: vec![".ts".into(), ".js".into(), ".mjs".into()], + condition_names: vec!["import".into(), "webpack".into(), "require".into()], + alias_fields: vec![vec!["browser".into()]], + extension_alias: vec![(".js".into(), vec![".ts".into(), ".js".into()])], + // Real projects LOVE setting these many aliases. + // I saw them with my own eyes. + alias: vec![ + ("/absolute/path".into(), vec![alias_value.clone()]), + ("aaa".into(), vec![alias_value.clone()]), + ("bbb".into(), vec![alias_value.clone()]), + ("ccc".into(), vec![alias_value.clone()]), + ("ddd".into(), vec![alias_value.clone()]), + ("eee".into(), vec![alias_value.clone()]), + ("fff".into(), vec![alias_value.clone()]), + ("ggg".into(), vec![alias_value.clone()]), + ("hhh".into(), vec![alias_value.clone()]), + ("iii".into(), vec![alias_value.clone()]), + ("jjj".into(), vec![alias_value.clone()]), + ("kkk".into(), vec![alias_value.clone()]), + ("lll".into(), vec![alias_value.clone()]), + ("mmm".into(), vec![alias_value.clone()]), + ("nnn".into(), vec![alias_value.clone()]), + ("ooo".into(), vec![alias_value.clone()]), + ("ppp".into(), vec![alias_value.clone()]), + ("qqq".into(), vec![alias_value.clone()]), + ("rrr".into(), vec![alias_value.clone()]), + ("sss".into(), vec![alias_value.clone()]), + ("@".into(), vec![alias_value.clone()]), + ("@@".into(), vec![alias_value.clone()]), + ("@@@".into(), vec![alias_value]), + ], + ..ResolveOptions::default() + }, + ) } fn resolver_with_many_extensions() -> rspack_resolver::Resolver { @@ -115,6 +124,7 @@ fn resolver_with_many_extensions() -> rspack_resolver::Resolver { ], imports_fields: vec![], exports_fields: vec![], + enable_pnp: false, ..Default::default() }) } @@ -145,7 +155,7 @@ fn bench_resolver(c: &mut Criterion) { // check validity runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(async { for (path, request) in &data { - let r = rspack_resolver().resolve(path, request).await; + let r = rspack_resolver(false).resolve(path, request).await; if !r.is_ok() { panic!("resolve failed {path:?} {request},\n\nplease run `pnpm install --ignore-workspace` in `/benches` before running the benchmarks"); } @@ -164,7 +174,7 @@ fn bench_resolver(c: &mut Criterion) { .block_on(async { for i in symlinks_range.clone() { assert!( - rspack_resolver() + rspack_resolver(false) .resolve(&symlink_test_dir, &format!("./file{i}")) .await .is_ok(), @@ -196,7 +206,7 @@ fn bench_resolver(c: &mut Criterion) { let runner = runtime::Builder::new_current_thread() .build() .expect("failed to create tokio runtime"); - let rspack_resolver = rspack_resolver(); + let rspack_resolver = rspack_resolver(false); b.to_async(runner).iter_with_setup( || { @@ -240,7 +250,7 @@ fn bench_resolver(c: &mut Criterion) { &data, |b, data| { let runner = multi_rt(); - let rspack_resolver = Arc::new(rspack_resolver()); + let rspack_resolver = Arc::new(rspack_resolver(false)); b.iter_with_setup( || { @@ -268,7 +278,7 @@ fn bench_resolver(c: &mut Criterion) { &symlinks_range, |b, data| { let runner = runtime::Runtime::new().expect("failed to create tokio runtime"); - let rspack_resolver = rspack_resolver(); + let rspack_resolver = rspack_resolver(false); b.to_async(runner).iter_with_setup( || { @@ -294,7 +304,7 @@ fn bench_resolver(c: &mut Criterion) { &symlinks_range, |b, data| { let runner = multi_rt(); - let rspack_resolver = Arc::new(rspack_resolver()); + let rspack_resolver = Arc::new(rspack_resolver(false)); let symlink_test_dir = symlink_test_dir.clone(); @@ -321,7 +331,7 @@ fn bench_resolver(c: &mut Criterion) { &root_range, |b, data| { let runner = runtime::Runtime::new().expect("failed to create tokio runtime"); - let rspack_resolver = Arc::new(rspack_resolver()); + let rspack_resolver = Arc::new(rspack_resolver(true)); b.to_async(runner).iter_with_setup( || { diff --git a/src/file_system.rs b/src/file_system.rs index 57edb52..f26c153 100644 --- a/src/file_system.rs +++ b/src/file_system.rs @@ -130,6 +130,16 @@ impl Default for FileSystemOs { } } +impl FileSystemOs { + pub fn new(options: FileSystemOptions) -> Self { + Self { + options, + #[cfg(feature = "yarn_pnp")] + pnp_lru: LruZipCache::new(50, pnp::fs::open_zip_via_read_p), + } + } +} + #[cfg(not(target_arch = "wasm32"))] #[async_trait::async_trait] impl FileSystem for FileSystemOs { diff --git a/src/lib.rs b/src/lib.rs index 7229671..b89cf5c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -78,7 +78,7 @@ use rustc_hash::FxHashSet; pub use crate::{ builtins::NODEJS_BUILTINS, error::{JSONError, ResolveError, SpecifierError}, - file_system::{FileMetadata, FileSystem, FileSystemOs}, + file_system::{FileMetadata, FileSystem, FileSystemOptions, FileSystemOs}, options::{ Alias, AliasValue, EnforceExtension, ResolveOptions, Restriction, TsconfigOptions, TsconfigReferences, From ac07670b5139436d7699c664d79a07da28d98840 Mon Sep 17 00:00:00 2001 From: pshu Date: Sun, 23 Nov 2025 09:52:04 +0800 Subject: [PATCH 2/3] fix: disable resolver's PnP --- benches/resolver.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/benches/resolver.rs b/benches/resolver.rs index 3a664cc..6e75329 100644 --- a/benches/resolver.rs +++ b/benches/resolver.rs @@ -65,6 +65,7 @@ fn rspack_resolver(enable_pnp: bool) -> rspack_resolver::Resolver { Resolver::new_with_file_system( fs, ResolveOptions { + enable_pnp, extensions: vec![".ts".into(), ".js".into(), ".mjs".into()], condition_names: vec!["import".into(), "webpack".into(), "require".into()], alias_fields: vec![vec!["browser".into()]], From cfbf58fc691d5ad59f2ec20add932d3edb315bae Mon Sep 17 00:00:00 2001 From: pshu Date: Sun, 23 Nov 2025 11:14:16 +0800 Subject: [PATCH 3/3] Update benches/resolver.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- benches/resolver.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/benches/resolver.rs b/benches/resolver.rs index 6e75329..92d798f 100644 --- a/benches/resolver.rs +++ b/benches/resolver.rs @@ -65,6 +65,7 @@ fn rspack_resolver(enable_pnp: bool) -> rspack_resolver::Resolver { Resolver::new_with_file_system( fs, ResolveOptions { + #[cfg(feature = "yarn_pnp")] enable_pnp, extensions: vec![".ts".into(), ".js".into(), ".mjs".into()], condition_names: vec!["import".into(), "webpack".into(), "require".into()],