Skip to content

Commit

Permalink
perf: cache SWC loader (web-infra-dev#7965)
Browse files Browse the repository at this point in the history
* cache swc loader

* fix ident

* fix clippy
  • Loading branch information
CPunisher authored Oct 18, 2024
1 parent dc05694 commit 27f197c
Showing 1 changed file with 36 additions and 7 deletions.
43 changes: 36 additions & 7 deletions crates/rspack_binding_options/src/plugins/js_loader/resolver.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use std::sync::Arc;
use std::{
borrow::Cow,
sync::{Arc, LazyLock},
};

use rspack_collections::{Identifiable, Identifier};
use rspack_core::{
Expand All @@ -14,8 +17,10 @@ use rspack_hook::plugin_hook;
use rspack_loader_lightningcss::{config::Config, LIGHTNINGCSS_LOADER_IDENTIFIER};
use rspack_loader_preact_refresh::PREACT_REFRESH_LOADER_IDENTIFIER;
use rspack_loader_react_refresh::REACT_REFRESH_LOADER_IDENTIFIER;
use rspack_loader_swc::SWC_LOADER_IDENTIFIER;
use rspack_loader_swc::{SwcLoader, SWC_LOADER_IDENTIFIER};
use rspack_paths::Utf8Path;
use rustc_hash::FxHashMap;
use tokio::sync::RwLock;

use super::{JsLoaderRspackPlugin, JsLoaderRspackPluginInner};

Expand All @@ -39,15 +44,37 @@ pub fn serde_error_to_miette(
let span = LabeledSpan::at_offset(offset.offset(), e.to_string());
miette!(labels = vec![span], "{msg}").with_source_code(content.clone())
}
pub fn get_builtin_loader(builtin: &str, options: Option<&str>) -> Result<BoxLoader> {

type SwcLoaderCache<'a> = LazyLock<RwLock<FxHashMap<(Cow<'a, str>, Arc<str>), Arc<SwcLoader>>>>;
static SWC_LOADER_CACHE: SwcLoaderCache = LazyLock::new(|| RwLock::new(FxHashMap::default()));

pub async fn get_builtin_loader(builtin: &str, options: Option<&str>) -> Result<BoxLoader> {
let options: Arc<str> = options.unwrap_or("{}").into();
if builtin.starts_with(SWC_LOADER_IDENTIFIER) {
return Ok(Arc::new(
if let Some(loader) = SWC_LOADER_CACHE
.read()
.await
.get(&(Cow::Borrowed(builtin), options.clone()))
{
return Ok(loader.clone());
}

let loader = Arc::new(
rspack_loader_swc::SwcLoader::new(serde_json::from_str(options.as_ref()).map_err(|e| {
serde_error_to_miette(e, options, "failed to parse builtin:swc-loader options")
serde_error_to_miette(
e,
options.clone(),
"failed to parse builtin:swc-loader options",
)
})?)
.with_identifier(builtin.into()),
));
);

SWC_LOADER_CACHE.write().await.insert(
(Cow::Owned(builtin.to_owned()), options.clone()),
loader.clone(),
);
return Ok(loader);
}

if builtin.starts_with(LIGHTNINGCSS_LOADER_IDENTIFIER) {
Expand Down Expand Up @@ -115,7 +142,9 @@ pub(crate) async fn resolve_loader(

// FIXME: not belong to napi
if loader_request.starts_with(BUILTIN_LOADER_PREFIX) {
return get_builtin_loader(loader_request, loader_options).map(Some);
return get_builtin_loader(loader_request, loader_options)
.await
.map(Some);
}

let resolve_result = resolver
Expand Down

0 comments on commit 27f197c

Please sign in to comment.