Skip to content

Commit 552d9aa

Browse files
authoredAug 10, 2023
fix(es/minifier): Do not drop properties used via this (#7785)
**Related issue:** - Closes #7783.
1 parent e90b555 commit 552d9aa

File tree

7 files changed

+149
-1
lines changed

7 files changed

+149
-1
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"jsc": {
3+
"parser": {
4+
"syntax": "ecmascript",
5+
"jsx": true
6+
},
7+
"target": "es2015",
8+
"loose": false,
9+
"minify": {
10+
"compress": {
11+
"arguments": false,
12+
"arrows": true,
13+
"booleans": true,
14+
"booleans_as_integers": false,
15+
"collapse_vars": true,
16+
"comparisons": true,
17+
"computed_props": true,
18+
"conditionals": true,
19+
"dead_code": true,
20+
"directives": true,
21+
"drop_console": false,
22+
"drop_debugger": true,
23+
"evaluate": true,
24+
"expression": false,
25+
"hoist_funs": false,
26+
"hoist_props": true,
27+
"hoist_vars": false,
28+
"if_return": true,
29+
"join_vars": true,
30+
"keep_classnames": false,
31+
"keep_fargs": true,
32+
"keep_fnames": false,
33+
"keep_infinity": false,
34+
"loops": true,
35+
"negate_iife": true,
36+
"properties": true,
37+
"reduce_funcs": false,
38+
"reduce_vars": false,
39+
"side_effects": true,
40+
"switches": true,
41+
"typeofs": true,
42+
"unsafe": false,
43+
"unsafe_arrows": false,
44+
"unsafe_comps": false,
45+
"unsafe_Function": false,
46+
"unsafe_math": false,
47+
"unsafe_symbols": false,
48+
"unsafe_methods": false,
49+
"unsafe_proto": false,
50+
"unsafe_regexp": false,
51+
"unsafe_undefined": false,
52+
"unused": true,
53+
"const_to_let": true,
54+
"pristine_globals": true
55+
},
56+
"mangle": {
57+
"toplevel": false,
58+
"keep_classnames": false,
59+
"keep_fnames": false,
60+
"keep_private_props": false,
61+
"ie8": false,
62+
"safari10": false
63+
}
64+
}
65+
},
66+
"module": {
67+
"type": "es6"
68+
},
69+
"minify": true,
70+
"isModule": true
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export default function Home() {
2+
return (
3+
<div>{foo.a}</div>
4+
)
5+
}
6+
7+
const foo = {
8+
get a() {
9+
return `a ${this.b}`;
10+
},
11+
get b() {
12+
return `b`;
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default function e(){return React.createElement("div",null,foo.a)}let foo={get a(){return`a ${this.b}`},get b(){return"b"}};

‎crates/swc/tests/tsc-references/thisTypeInFunctions.2.minified.js

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ function implicitThis(n) {
2828
return this.m + n + 12;
2929
}
3030
var impl = {
31+
a: 12,
3132
explicitVoid2: function() {
3233
return _this.a;
3334
},

‎crates/swc_ecma_minifier/src/compress/optimize/unused.rs

+40-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
use rustc_hash::FxHashSet;
12
use swc_atoms::{js_word, JsWord};
23
use swc_common::{util::take::Take, DUMMY_SP};
34
use swc_ecma_ast::*;
45
use swc_ecma_usage_analyzer::util::is_global_var_with_pure_property_access;
56
use swc_ecma_utils::{contains_ident_ref, ExprExt};
7+
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
68

79
use super::Optimizer;
810
#[cfg(feature = "debug")]
@@ -785,11 +787,17 @@ impl Optimizer<'_> {
785787
return None;
786788
}
787789

790+
let properties_used_via_this = {
791+
let mut v = ThisPropertyVisitor::default();
792+
obj.visit_with(&mut v);
793+
v.properties
794+
};
795+
788796
let should_preserve_property = |sym: &JsWord| {
789797
if let "toString" = &**sym {
790798
return true;
791799
}
792-
!usage.accessed_props.contains_key(sym)
800+
!usage.accessed_props.contains_key(sym) && !properties_used_via_this.contains(sym)
793801
};
794802
let should_preserve = |key: &PropName| match key {
795803
PropName::Ident(k) => should_preserve_property(&k.sym),
@@ -824,3 +832,34 @@ impl Optimizer<'_> {
824832
None
825833
}
826834
}
835+
836+
#[derive(Default)]
837+
struct ThisPropertyVisitor {
838+
properties: FxHashSet<JsWord>,
839+
840+
should_abort: bool,
841+
}
842+
843+
impl Visit for ThisPropertyVisitor {
844+
noop_visit_type!();
845+
846+
fn visit_member_expr(&mut self, e: &MemberExpr) {
847+
if self.should_abort {
848+
return;
849+
}
850+
851+
e.visit_children_with(self);
852+
853+
if let Expr::This(..) = &*e.obj {
854+
match &e.prop {
855+
MemberProp::Ident(p) => {
856+
self.properties.insert(p.sym.clone());
857+
}
858+
MemberProp::Computed(_) => {
859+
self.should_abort = true;
860+
}
861+
_ => {}
862+
}
863+
}
864+
}
865+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export default function Home() {
2+
return React.createElement("div", null, foo.a);
3+
}
4+
const foo = {
5+
get a() {
6+
return `a ${this.b}`;
7+
},
8+
get b() {
9+
return `b`;
10+
}
11+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export default function Home() {
2+
return React.createElement("div", null, foo.a);
3+
}
4+
const foo = {
5+
get a () {
6+
return `a ${this.b}`;
7+
},
8+
get b () {
9+
return "b";
10+
}
11+
};

1 commit comments

Comments
 (1)

github-actions[bot] commented on Aug 10, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: 552d9aa Previous: eff0cac Ratio
es/full/bugs-1 291272 ns/iter (± 4464) 294983 ns/iter (± 10736) 0.99
es/full/minify/libraries/antd 1314983115 ns/iter (± 8464378) 1393451284 ns/iter (± 12355364) 0.94
es/full/minify/libraries/d3 280107813 ns/iter (± 2503141) 294944366 ns/iter (± 7342342) 0.95
es/full/minify/libraries/echarts 1052310968 ns/iter (± 13384943) 1106663308 ns/iter (± 24141764) 0.95
es/full/minify/libraries/jquery 85123447 ns/iter (± 119507) 85503274 ns/iter (± 716073) 1.00
es/full/minify/libraries/lodash 98535771 ns/iter (± 231091) 100659215 ns/iter (± 918345) 0.98
es/full/minify/libraries/moment 50104968 ns/iter (± 55255) 50414762 ns/iter (± 537849) 0.99
es/full/minify/libraries/react 18055265 ns/iter (± 33558) 18172136 ns/iter (± 122945) 0.99
es/full/minify/libraries/terser 219747790 ns/iter (± 606503) 229593321 ns/iter (± 5006638) 0.96
es/full/minify/libraries/three 385373353 ns/iter (± 1823612) 408699446 ns/iter (± 9219747) 0.94
es/full/minify/libraries/typescript 2672584838 ns/iter (± 6067121) 2747289997 ns/iter (± 21911913) 0.97
es/full/minify/libraries/victory 566346710 ns/iter (± 3034159) 590590452 ns/iter (± 13457291) 0.96
es/full/minify/libraries/vue 120010701 ns/iter (± 268621) 123570004 ns/iter (± 779407) 0.97
es/full/codegen/es3 33508 ns/iter (± 101) 34070 ns/iter (± 59) 0.98
es/full/codegen/es5 33437 ns/iter (± 133) 34039 ns/iter (± 51) 0.98
es/full/codegen/es2015 33583 ns/iter (± 80) 33970 ns/iter (± 108) 0.99
es/full/codegen/es2016 33639 ns/iter (± 86) 33982 ns/iter (± 75) 0.99
es/full/codegen/es2017 33480 ns/iter (± 174) 34028 ns/iter (± 88) 0.98
es/full/codegen/es2018 33579 ns/iter (± 115) 34018 ns/iter (± 106) 0.99
es/full/codegen/es2019 33557 ns/iter (± 114) 34051 ns/iter (± 80) 0.99
es/full/codegen/es2020 33657 ns/iter (± 105) 34087 ns/iter (± 77) 0.99
es/full/all/es3 173524514 ns/iter (± 667633) 171898682 ns/iter (± 607742) 1.01
es/full/all/es5 165788081 ns/iter (± 1321109) 164384543 ns/iter (± 1577156) 1.01
es/full/all/es2015 125089653 ns/iter (± 657250) 123491325 ns/iter (± 447676) 1.01
es/full/all/es2016 124719635 ns/iter (± 784361) 122848446 ns/iter (± 1287123) 1.02
es/full/all/es2017 123607291 ns/iter (± 1283621) 122586959 ns/iter (± 728454) 1.01
es/full/all/es2018 121186685 ns/iter (± 914225) 120143891 ns/iter (± 651318) 1.01
es/full/all/es2019 121073662 ns/iter (± 732299) 119627782 ns/iter (± 1547531) 1.01
es/full/all/es2020 116064653 ns/iter (± 840430) 115429026 ns/iter (± 451329) 1.01
es/full/parser 541613 ns/iter (± 6299) 536594 ns/iter (± 5615) 1.01
es/full/base/fixer 17624 ns/iter (± 53) 18715 ns/iter (± 1036) 0.94
es/full/base/resolver_and_hygiene 78980 ns/iter (± 266) 80956 ns/iter (± 357) 0.98
serialization of serde 290 ns/iter (± 0) 293 ns/iter (± 4) 0.99
css/minify/libraries/bootstrap 28778903 ns/iter (± 83995) 29355574 ns/iter (± 77669) 0.98
css/visitor/compare/clone 1638327 ns/iter (± 3168) 1635441 ns/iter (± 2344) 1.00
css/visitor/compare/visit_mut_span 1764912 ns/iter (± 2148) 1758759 ns/iter (± 1752) 1.00
css/visitor/compare/visit_mut_span_panic 1838390 ns/iter (± 3045) 1850422 ns/iter (± 5631) 0.99
css/visitor/compare/fold_span 2581123 ns/iter (± 17048) 2591087 ns/iter (± 12405) 1.00
css/visitor/compare/fold_span_panic 2763355 ns/iter (± 13929) 2761411 ns/iter (± 10650) 1.00
css/lexer/bootstrap_5_1_3 4467055 ns/iter (± 5674) 4458079 ns/iter (± 4684) 1.00
css/lexer/foundation_6_7_4 3769657 ns/iter (± 2868) 3756489 ns/iter (± 1995) 1.00
css/lexer/tailwind_3_1_1 717062 ns/iter (± 254) 713534 ns/iter (± 532) 1.00
css/parser/bootstrap_5_1_3 19277858 ns/iter (± 175866) 19735381 ns/iter (± 51781) 0.98
css/parser/foundation_6_7_4 15541900 ns/iter (± 36389) 15985505 ns/iter (± 19095) 0.97
css/parser/tailwind_3_1_1 2989800 ns/iter (± 4359) 3060712 ns/iter (± 5656) 0.98
es/codegen/colors 737022 ns/iter (± 405879) 731655 ns/iter (± 395973) 1.01
es/codegen/large 2888458 ns/iter (± 1526052) 2889574 ns/iter (± 1531028) 1.00
es/codegen/with-parser/colors 45367 ns/iter (± 640) 45014 ns/iter (± 128) 1.01
es/codegen/with-parser/large 482467 ns/iter (± 1023) 484317 ns/iter (± 675) 1.00
es/minify/libraries/antd 1146685163 ns/iter (± 10408689) 1153314101 ns/iter (± 9359004) 0.99
es/minify/libraries/d3 241309235 ns/iter (± 530877) 242730983 ns/iter (± 575532) 0.99
es/minify/libraries/echarts 900420376 ns/iter (± 2770669) 906891977 ns/iter (± 2527853) 0.99
es/minify/libraries/jquery 74360904 ns/iter (± 104421) 74745881 ns/iter (± 132608) 0.99
es/minify/libraries/lodash 88441932 ns/iter (± 149972) 88935000 ns/iter (± 294006) 0.99
es/minify/libraries/moment 44097272 ns/iter (± 29822) 44254677 ns/iter (± 42933) 1.00
es/minify/libraries/react 16124293 ns/iter (± 77965) 16164488 ns/iter (± 35719) 1.00
es/minify/libraries/terser 188804560 ns/iter (± 273823) 190080754 ns/iter (± 390454) 0.99
es/minify/libraries/three 321973123 ns/iter (± 511576) 322999123 ns/iter (± 506817) 1.00
es/minify/libraries/typescript 2268351276 ns/iter (± 6210532) 2277740778 ns/iter (± 8549469) 1.00
es/minify/libraries/victory 480717211 ns/iter (± 2295246) 480413938 ns/iter (± 1843816) 1.00
es/minify/libraries/vue 107095727 ns/iter (± 124832) 108209962 ns/iter (± 95334) 0.99
es/visitor/compare/clone 1948787 ns/iter (± 7151) 1947301 ns/iter (± 4848) 1.00
es/visitor/compare/visit_mut_span 2298921 ns/iter (± 6579) 2294285 ns/iter (± 4182) 1.00
es/visitor/compare/visit_mut_span_panic 2319548 ns/iter (± 4964) 2324281 ns/iter (± 5195) 1.00
es/visitor/compare/fold_span 3355158 ns/iter (± 9283) 3352974 ns/iter (± 6416) 1.00
es/visitor/compare/fold_span_panic 3479409 ns/iter (± 9075) 3472470 ns/iter (± 6210) 1.00
es/lexer/colors 13026 ns/iter (± 71) 13173 ns/iter (± 49) 0.99
es/lexer/angular 6127162 ns/iter (± 5173) 6141500 ns/iter (± 6791) 1.00
es/lexer/backbone 788527 ns/iter (± 680) 803811 ns/iter (± 1508) 0.98
es/lexer/jquery 4420627 ns/iter (± 121400) 4545671 ns/iter (± 2193) 0.97
es/lexer/jquery mobile 6750819 ns/iter (± 13640) 6949075 ns/iter (± 3419) 0.97
es/lexer/mootools 3494384 ns/iter (± 4646) 3606903 ns/iter (± 2577) 0.97
es/lexer/underscore 657322 ns/iter (± 509) 684498 ns/iter (± 812) 0.96
es/lexer/three 20971776 ns/iter (± 57305) 21557565 ns/iter (± 90565) 0.97
es/lexer/yui 3779878 ns/iter (± 25139) 3880218 ns/iter (± 4263) 0.97
es/parser/colors 27846 ns/iter (± 67) 27754 ns/iter (± 32) 1.00
es/parser/angular 13685900 ns/iter (± 82460) 13587234 ns/iter (± 67998) 1.01
es/parser/backbone 2033067 ns/iter (± 5565) 2003605 ns/iter (± 9224) 1.01
es/parser/jquery 11124101 ns/iter (± 46852) 10983409 ns/iter (± 50318) 1.01
es/parser/jquery mobile 16949227 ns/iter (± 40758) 16870868 ns/iter (± 152349) 1.00
es/parser/mootools 8550221 ns/iter (± 17908) 8438775 ns/iter (± 16159) 1.01
es/parser/underscore 1755779 ns/iter (± 11259) 1730043 ns/iter (± 8135) 1.01
es/parser/three 47414874 ns/iter (± 201517) 46910176 ns/iter (± 182108) 1.01
es/parser/yui 8457511 ns/iter (± 24921) 8350564 ns/iter (± 26998) 1.01
es/preset-env/usage/builtin_type 139041 ns/iter (± 32442) 138109 ns/iter (± 31782) 1.01
es/preset-env/usage/property 16927 ns/iter (± 56) 16959 ns/iter (± 121) 1.00
es/resolver/typescript 88399126 ns/iter (± 848618) 87530002 ns/iter (± 1201609) 1.01
es/fixer/typescript 63527362 ns/iter (± 506753) 61935767 ns/iter (± 375114) 1.03
es/hygiene/typescript 128919492 ns/iter (± 395514) 129637016 ns/iter (± 858790) 0.99
es/resolver_with_hygiene/typescript 239443564 ns/iter (± 1177961) 239371918 ns/iter (± 1210757) 1.00
es/visitor/base-perf/module_clone 59579 ns/iter (± 215) 58697 ns/iter (± 105) 1.02
es/visitor/base-perf/fold_empty 63465 ns/iter (± 244) 62015 ns/iter (± 388) 1.02
es/visitor/base-perf/fold_noop_impl_all 63542 ns/iter (± 144) 62755 ns/iter (± 201) 1.01
es/visitor/base-perf/fold_noop_impl_vec 63326 ns/iter (± 357) 62197 ns/iter (± 310) 1.02
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 57 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 38 ns/iter (± 0) 38 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 107 ns/iter (± 0) 106 ns/iter (± 0) 1.01
es/visitor/base-perf/boxing_unboxed 75 ns/iter (± 0) 75 ns/iter (± 0) 1
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2521 ns/iter (± 16) 2514 ns/iter (± 10) 1.00
es/base/parallel/resolver/typescript 4228665020 ns/iter (± 266107826) 3649089563 ns/iter (± 232440358) 1.16
es/base/parallel/hygiene/typescript 1446577542 ns/iter (± 12163374) 1460780479 ns/iter (± 24221190) 0.99
misc/visitors/time-complexity/time 5 137 ns/iter (± 0) 133 ns/iter (± 1) 1.03
misc/visitors/time-complexity/time 10 344 ns/iter (± 45) 259 ns/iter (± 0) 1.33
misc/visitors/time-complexity/time 15 522 ns/iter (± 2) 500 ns/iter (± 2) 1.04
misc/visitors/time-complexity/time 20 1061 ns/iter (± 2) 1090 ns/iter (± 23) 0.97
misc/visitors/time-complexity/time 40 3609 ns/iter (± 15) 3555 ns/iter (± 18) 1.02
misc/visitors/time-complexity/time 60 8861 ns/iter (± 6) 7352 ns/iter (± 96) 1.21
es/full-target/es2016 230818 ns/iter (± 1074) 229875 ns/iter (± 330) 1.00
es/full-target/es2017 218633 ns/iter (± 827) 217448 ns/iter (± 981) 1.01
es/full-target/es2018 208039 ns/iter (± 491) 204979 ns/iter (± 682) 1.01
es2020_nullish_coalescing 69889 ns/iter (± 309) 68658 ns/iter (± 565) 1.02
es2020_optional_chaining 78457 ns/iter (± 383) 79088 ns/iter (± 255) 0.99
es2022_class_properties 115982 ns/iter (± 357) 113695 ns/iter (± 420) 1.02
es2018_object_rest_spread 73462 ns/iter (± 905) 73132 ns/iter (± 351) 1.00
es2019_optional_catch_binding 63523 ns/iter (± 248) 61842 ns/iter (± 288) 1.03
es2017_async_to_generator 63720 ns/iter (± 148) 62216 ns/iter (± 265) 1.02
es2016_exponentiation 67712 ns/iter (± 255) 66595 ns/iter (± 552) 1.02
es2015_arrow 71320 ns/iter (± 185) 69565 ns/iter (± 290) 1.03
es2015_block_scoped_fn 66988 ns/iter (± 154) 66215 ns/iter (± 214) 1.01
es2015_block_scoping 120438 ns/iter (± 553) 121310 ns/iter (± 414) 0.99

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.