Skip to content

Commit

Permalink
feat(rspack_plugin_javascript): improve provide dependency (#7871)
Browse files Browse the repository at this point in the history
* feat(rspack_plugin_javascript): improve provide dependency

* refactor: use RealDependencyLocation

* chore: remove DependencyRange
  • Loading branch information
shulaoda authored Sep 13, 2024
1 parent d7a15d8 commit 3343471
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 26 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use itertools::Itertools;
use rspack_core::DependencyType;
use rspack_core::{
create_exports_object_referenced, module_raw, Compilation, ExtendedReferencedExport, ModuleGraph,
NormalInitFragment, RuntimeSpec, UsedName,
create_exports_object_referenced, module_raw, Compilation, DependencyType,
ExtendedReferencedExport, ModuleGraph, NormalInitFragment, RealDependencyLocation, RuntimeSpec,
UsedName,
};
use rspack_core::{AsContextDependency, Dependency, InitFragmentKey, InitFragmentStage};
use rspack_core::{DependencyCategory, DependencyId, DependencyTemplate};
Expand All @@ -12,19 +12,22 @@ use swc_core::atoms::Atom;

#[derive(Debug, Clone)]
pub struct ProvideDependency {
start: u32,
end: u32,
id: DependencyId,
request: Atom,
identifier: String,
ids: Vec<Atom>,
range: RealDependencyLocation,
}

impl ProvideDependency {
pub fn new(start: u32, end: u32, request: Atom, identifier: String, ids: Vec<Atom>) -> Self {
pub fn new(
range: RealDependencyLocation,
request: Atom,
identifier: String,
ids: Vec<Atom>,
) -> Self {
Self {
start,
end,
range,
request,
identifier,
ids,
Expand All @@ -38,6 +41,10 @@ impl Dependency for ProvideDependency {
&self.id
}

fn loc(&self) -> Option<String> {
Some(self.range.to_string())
}

fn category(&self) -> &DependencyCategory {
&DependencyCategory::Esm
}
Expand Down Expand Up @@ -116,7 +123,7 @@ impl DependencyTemplate for ProvideDependency {
InitFragmentKey::ModuleExternal(format!("provided {}", self.identifier)),
None,
)));
source.replace(self.start, self.end, &self.identifier, None);
source.replace(self.range.start, self.range.end, &self.identifier, None);
}

fn dependency_id(&self) -> Option<DependencyId> {
Expand Down
36 changes: 19 additions & 17 deletions crates/rspack_plugin_javascript/src/parser_plugin/provide_plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use itertools::Itertools;
use once_cell::sync::OnceCell;
use rspack_core::{
ApplyContext, CompilerOptions, ModuleType, NormalModuleFactoryParser, ParserAndGenerator,
ParserOptions, Plugin, PluginContext, SpanExt,
ParserOptions, Plugin, PluginContext, RealDependencyLocation,
};
use rspack_error::Result;
use rspack_hook::{plugin, plugin_hook};
Expand All @@ -13,20 +13,22 @@ use crate::{
dependency::ProvideDependency, parser_and_generator::JavaScriptParserAndGenerator,
visitors::JavascriptParser, BoxJavascriptParserPlugin,
};

const SOURCE_DOT: &str = r#"."#;
const MODULE_DOT: &str = r#"_dot_"#;

fn dep(value: &ProvideValue, name: &str, start: u32, end: u32) -> Option<ProvideDependency> {
fn create_provide_dep(
name: &str,
value: &ProvideValue,
range: RealDependencyLocation,
) -> Option<ProvideDependency> {
if let Some(requests) = value.get(name) {
let name_identifier = if name.contains(SOURCE_DOT) {
format!("__webpack_provide_{}", name.replace(SOURCE_DOT, MODULE_DOT))
} else {
name.to_string()
};
return Some(ProvideDependency::new(
start,
end,
range,
Atom::from(requests[0].as_str()),
name_identifier,
requests[1..]
Expand Down Expand Up @@ -84,11 +86,11 @@ impl JavascriptParserPlugin for ProvidePlugin {
expr: &swc_core::ecma::ast::CallExpr,
for_name: &str,
) -> Option<bool> {
dep(
&self.provide,
let range: RealDependencyLocation = expr.callee.span().into();
create_provide_dep(
for_name,
expr.callee.span().real_lo(),
expr.callee.span().real_hi(),
&self.provide,
range.with_source(parser.source_map.clone()),
)
.map(|dep| {
parser.dependencies.push(Box::new(dep));
Expand All @@ -104,11 +106,11 @@ impl JavascriptParserPlugin for ProvidePlugin {
expr: &swc_core::ecma::ast::MemberExpr,
for_name: &str,
) -> Option<bool> {
dep(
&self.provide,
let range: RealDependencyLocation = expr.span().into();
create_provide_dep(
for_name,
expr.span().real_lo(),
expr.span().real_hi(),
&self.provide,
range.with_source(parser.source_map.clone()),
)
.map(|dep| {
parser.dependencies.push(Box::new(dep));
Expand All @@ -122,11 +124,11 @@ impl JavascriptParserPlugin for ProvidePlugin {
ident: &swc_core::ecma::ast::Ident,
for_name: &str,
) -> Option<bool> {
dep(
&self.provide,
let range: RealDependencyLocation = ident.span.into();
create_provide_dep(
for_name,
ident.span.real_lo(),
ident.span.real_hi(),
&self.provide,
range.with_source(parser.source_map.clone()),
)
.map(|dep| {
parser.dependencies.push(Box::new(dep));
Expand Down

2 comments on commit 3343471

@rspack-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Benchmark detail: Open

Name Base (2024-09-13 56a30b4) Current Change
10000_development-mode + exec 2.24 s ± 49 ms 2.22 s ± 24 ms -0.83 %
10000_development-mode_hmr + exec 692 ms ± 15 ms 694 ms ± 14 ms +0.34 %
10000_production-mode + exec 2.84 s ± 28 ms 2.85 s ± 41 ms +0.48 %
arco-pro_development-mode + exec 1.85 s ± 66 ms 1.83 s ± 72 ms -1.55 %
arco-pro_development-mode_hmr + exec 435 ms ± 2 ms 435 ms ± 1.3 ms +0.21 %
arco-pro_production-mode + exec 3.23 s ± 46 ms 3.27 s ± 68 ms +1.26 %
arco-pro_production-mode_generate-package-json-webpack-plugin + exec 3.31 s ± 61 ms 3.28 s ± 63 ms -0.75 %
threejs_development-mode_10x + exec 1.7 s ± 12 ms 1.7 s ± 15 ms +0.02 %
threejs_development-mode_10x_hmr + exec 802 ms ± 11 ms 804 ms ± 9 ms +0.21 %
threejs_production-mode_10x + exec 5.18 s ± 26 ms 5.19 s ± 31 ms +0.07 %

@rspack-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Ran ecosystem CI: Open

suite result
modernjs ✅ success
_selftest ✅ success
nx ❌ failure
rspress ✅ success
rslib ❌ failure
rsbuild ❌ failure
examples ✅ success

Please sign in to comment.