Skip to content

Commit 9fd2b1d

Browse files
authored
fix: cjs export require tree shaking (#11758)
1 parent e350b76 commit 9fd2b1d

File tree

5 files changed

+32
-19
lines changed

5 files changed

+32
-19
lines changed

crates/rspack_plugin_javascript/src/dependency/commonjs/common_js_export_require_dependency.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ use rspack_core::{
1010
ExtendedReferencedExport, FactorizeInfo, GetUsedNameParam, ModuleDependency, ModuleGraph,
1111
ModuleGraphCacheArtifact, ModuleIdentifier, Nullable, PrefetchExportsInfoMode, ReferencedExport,
1212
RuntimeGlobals, RuntimeSpec, TemplateContext, TemplateReplaceSource, UsageState, UsedName,
13-
collect_referenced_export_items, module_raw, property_access, to_normal_comment,
13+
collect_referenced_export_items, create_exports_object_referenced, create_no_exports_referenced,
14+
module_raw, property_access, to_normal_comment,
1415
};
1516
use rustc_hash::FxHashSet;
1617
use swc_core::atoms::Atom;
@@ -41,6 +42,7 @@ impl CommonJsExportRequireDependency {
4142
range: DependencyRange,
4243
base: ExportsBase,
4344
names: Vec<Atom>,
45+
ids: Vec<Atom>,
4446
result_used: bool,
4547
) -> Self {
4648
Self {
@@ -50,7 +52,7 @@ impl CommonJsExportRequireDependency {
5052
range,
5153
base,
5254
names,
53-
ids: vec![],
55+
ids,
5456
result_used,
5557
factorize_info: Default::default(),
5658
}
@@ -296,7 +298,7 @@ impl Dependency for CommonJsExportRequireDependency {
296298
let ids = self.get_ids(mg);
297299
let get_full_result = || {
298300
if ids.is_empty() {
299-
vec![ExtendedReferencedExport::Array(vec![])]
301+
create_exports_object_referenced()
300302
} else {
301303
vec![ExtendedReferencedExport::Export(ReferencedExport {
302304
name: ids.to_vec(),
@@ -318,7 +320,7 @@ impl Dependency for CommonJsExportRequireDependency {
318320
let export_info = exports_info.get_read_only_export_info(name);
319321
let used = export_info.get_used(runtime);
320322
if matches!(used, UsageState::Unused) {
321-
return vec![ExtendedReferencedExport::Array(vec![])];
323+
return create_no_exports_referenced();
322324
}
323325
if !matches!(used, UsageState::OnlyPropertiesUsed) {
324326
return get_full_result();

crates/rspack_plugin_javascript/src/parser_plugin/common_js_exports_parse_plugin.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -128,22 +128,22 @@ impl JavascriptParser<'_> {
128128

129129
fn parse_require_call<'a>(
130130
parser: &mut JavascriptParser,
131-
expr: &'a Expr,
131+
mut expr: &'a Expr,
132132
) -> Option<(BasicEvaluatedExpression<'a>, Vec<Atom>)> {
133133
let mut ids = Vec::new();
134-
// while let Some(member) = expr.as_member() {
135-
// if let Some(prop) = member.prop.as_ident() {
136-
// ids.push(prop.sym.clone());
137-
// } else if let Some(prop) = member.prop.as_computed()
138-
// && let prop = parser.evaluate_expression(&*prop.expr)
139-
// && let Some(prop) = prop.as_string()
140-
// {
141-
// ids.push(prop.into());
142-
// } else {
143-
// return None;
144-
// }
145-
// expr = &*member.obj;
146-
// }
134+
while let Some(member) = expr.as_member() {
135+
if let Some(prop) = member.prop.as_ident() {
136+
ids.push(prop.sym.clone());
137+
} else if let Some(prop) = member.prop.as_computed()
138+
&& let prop = parser.evaluate_expression(&prop.expr)
139+
&& let Some(prop) = prop.as_string()
140+
{
141+
ids.push(prop.into());
142+
} else {
143+
return None;
144+
}
145+
expr = &*member.obj;
146+
}
147147
if let Some(call) = expr.as_call()
148148
&& call.args.len() == 1
149149
&& let Some(callee) = call.callee.as_expr()
@@ -172,7 +172,7 @@ fn handle_assign_export(
172172
return None;
173173
}
174174
if (remaining.is_empty() || remaining.first().is_some_and(|i| i != "__esModule"))
175-
&& let Some((arg, _ids)) = parse_require_call(parser, &assign_expr.right)
175+
&& let Some((arg, ids)) = parse_require_call(parser, &assign_expr.right)
176176
&& arg.is_string()
177177
{
178178
parser.enable();
@@ -193,6 +193,7 @@ fn handle_assign_export(
193193
range,
194194
base,
195195
remaining.to_vec(),
196+
ids,
196197
!parser.is_statement_level_expression(assign_expr.span()),
197198
)));
198199
return Some(true);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exports.abc = require("./module?exports-property-assign-require-chain").abc;
2+
exports.def = require("./module?exports-property-assign-require-chain").def;
3+
exports.usedExports = require("./module?exports-property-assign-require-chain").usedExports;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
it("should allow to reexport a imported property (exports)", () => {
2+
expect(require("./exports-property-assign-require-chain").abc).toBe("abc");
3+
expect(require("./exports-property-assign-require-chain").usedExports).toEqual(["abc", "usedExports"]);
4+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exports.abc = "abc";
2+
exports.def = "def";
3+
exports.usedExports = __webpack_exports_info__.usedExports;

0 commit comments

Comments
 (0)