Skip to content

Commit 1dfd8ce

Browse files
authoredNov 16, 2022
fix(html/minifier): Fix script/style merging (#6443)
1 parent 520c5ca commit 1dfd8ce

File tree

5 files changed

+89
-25
lines changed

5 files changed

+89
-25
lines changed
 

‎crates/swc_html_minifier/src/lib.rs

+18-21
Original file line numberDiff line numberDiff line change
@@ -1827,32 +1827,29 @@ impl Minifier<'_> {
18271827

18281828
let result = child_will_be_retained(&mut child, &mut new_children, children);
18291829

1830-
if result {
1831-
if self.options.remove_empty_metadata_elements
1832-
&& self.is_empty_metadata_element(&child)
1833-
{
1834-
let need_continue = {
1835-
let next_element = if let Some(Child::Element(element)) = children.get(0) {
1836-
Some(element)
1837-
} else if let Some(Child::Element(element)) = children.get(1) {
1838-
Some(element)
1839-
} else {
1840-
None
1841-
};
1830+
if self.options.remove_empty_metadata_elements {
1831+
if let Some(last_child @ Child::Element(_)) = new_children.last() {
1832+
if self.is_empty_metadata_element(last_child) {
1833+
new_children.pop();
18421834

1843-
if let Some(element) = next_element {
1844-
self.options.merge_metadata_elements
1845-
&& !self.allow_elements_to_merge(Some(&child), element)
1846-
} else {
1847-
true
1848-
}
1849-
};
1835+
if let Child::Text(text) = &mut child {
1836+
if let Some(Child::Text(prev_text)) = new_children.last_mut() {
1837+
let mut new_data =
1838+
String::with_capacity(prev_text.data.len() + text.data.len());
18501839

1851-
if need_continue {
1852-
continue;
1840+
new_data.push_str(&prev_text.data);
1841+
new_data.push_str(&text.data);
1842+
1843+
text.data = new_data.into();
1844+
1845+
new_children.pop();
1846+
}
1847+
}
18531848
}
18541849
}
1850+
}
18551851

1852+
if result {
18561853
new_children.push(child);
18571854
}
18581855
}

‎crates/swc_html_minifier/tests/fixture/element/script-group/input.html

+8
Original file line numberDiff line numberDiff line change
@@ -215,5 +215,13 @@
215215
var a = "test";console.log(a);console.log(a);console.log(a);
216216
</script>
217217

218+
<div>breaker</div>
219+
<script></script>
220+
<script></script>
221+
222+
<div>breaker</div>
223+
<script type="module"></script>
224+
<script type="module"></script>
225+
218226
</body>
219227
</html>

‎crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html

+9-1
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,12 @@
9090
<script type=module>var a="test";console.log(a),console.log(a),console.log(a)</script><script>var o="test";console.log(o);console.log(o);console.log(o)</script><script type=module>var a="test";console.log(a),console.log(a),console.log(a)</script>
9191

9292
<div>breaker</div>
93-
<script>var o="test";console.log(o);console.log(o);console.log(o)</script><script type=module>var a="test";console.log(a),console.log(a),console.log(a)</script><script>var o="test";console.log(o);console.log(o);console.log(o)</script>
93+
<script>var o="test";console.log(o);console.log(o);console.log(o)</script><script type=module>var a="test";console.log(a),console.log(a),console.log(a)</script><script>var o="test";console.log(o);console.log(o);console.log(o)</script>
94+
95+
<div>breaker</div>
96+
97+
98+
99+
<div>breaker</div>
100+
<script type=module></script>
101+
<script type=module></script>

‎crates/swc_html_minifier/tests/fixture/element/style-group/input.html

+36
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,41 @@ <h1>Text</h1>
9090
<style type="unknown">a { color: red }</style><style type="unknown"></style>
9191
<div>test</div>
9292
<style type="text/css">a { color: red; }</style><style type=" text/css ">div { color: blue; }</style>
93+
<div>EMPTY breaker</div>
94+
<style></style>
95+
<style></style>
96+
<div>breaker</div>
97+
<style></style>
98+
<style></style>
99+
<style></style>
100+
101+
<div>breaker style tags</div>
102+
103+
<style></style>
104+
105+
<style></style>
106+
107+
<style></style>
108+
109+
<style></style>
110+
111+
<style></style>
112+
113+
<div>breaker style tags</div>
114+
115+
<style></style><style></style><style></style><style></style><style></style>
116+
117+
<div>breaker</div>
118+
<style></style>
119+
<script></script>
120+
<div>breaker</div>
121+
<script></script>
122+
<style></style>
123+
<div>breaker</div>
124+
<style></style>
125+
<span>test</span>
126+
<div>breaker</div>
127+
<span>test</span>
128+
<style></style>
93129
</body>
94130
</html>

‎crates/swc_html_minifier/tests/fixture/element/style-group/output.min.html

+18-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
<style>a{color:red}b{color:blue}</style>
44
<div>test</div>
55
<style>a{color:red}</style>
6-
<div>test</div>
7-
<style>a{color:red}</style>
6+
<div>test</div><style>a{color:red}</style>
87
<div>test</div>
98
<style>a,html,body{color:red}</style>
109
<div>test</div>
@@ -20,4 +19,20 @@
2019
<div>test</div>
2120
<style type=unknown>a { color: red }</style><style type=unknown></style>
2221
<div>test</div>
23-
<style>a{color:red}div{color:blue}</style>
22+
<style>a{color:red}div{color:blue}</style>
23+
<div>EMPTY breaker</div>
24+
<div>breaker</div>
25+
26+
<div>breaker style tags</div>
27+
28+
<div>breaker style tags</div>
29+
30+
31+
32+
<div>breaker</div>
33+
<div>breaker</div>
34+
<div>breaker</div>
35+
36+
<span>test</span>
37+
<div>breaker</div>
38+
<span>test</span>

1 commit comments

Comments
 (1)

github-actions[bot] commented on Nov 16, 2022

@github-actions[bot]

Benchmark

Benchmark suite Current: 1dfd8ce Previous: f14b156 Ratio
es/full/bugs-1 357899 ns/iter (± 29349) 345189 ns/iter (± 42761) 1.04
es/full/minify/libraries/antd 1995326402 ns/iter (± 79291138) 1819852473 ns/iter (± 27054128) 1.10
es/full/minify/libraries/d3 456519937 ns/iter (± 44126815) 389347779 ns/iter (± 30587483) 1.17
es/full/minify/libraries/echarts 1939151547 ns/iter (± 124765219) 1558999784 ns/iter (± 38200656) 1.24
es/full/minify/libraries/jquery 129731158 ns/iter (± 10642916) 102809901 ns/iter (± 5741564) 1.26
es/full/minify/libraries/lodash 155720302 ns/iter (± 20475401) 117651409 ns/iter (± 6854053) 1.32
es/full/minify/libraries/moment 75765692 ns/iter (± 5778983) 58271594 ns/iter (± 5713954) 1.30
es/full/minify/libraries/react 24480300 ns/iter (± 2005651) 20904927 ns/iter (± 1869975) 1.17
es/full/minify/libraries/terser 388452515 ns/iter (± 23837383) 303249132 ns/iter (± 2655768) 1.28
es/full/minify/libraries/three 627710057 ns/iter (± 29120172) 560791522 ns/iter (± 35093236) 1.12
es/full/minify/libraries/typescript 4048571408 ns/iter (± 1382412454) 3358717570 ns/iter (± 60724272) 1.21
es/full/minify/libraries/victory 976403133 ns/iter (± 35867447) 825875173 ns/iter (± 143880561) 1.18
es/full/minify/libraries/vue 195630668 ns/iter (± 21116209) 163197364 ns/iter (± 4058444) 1.20
es/full/codegen/es3 39693 ns/iter (± 6405) 33432 ns/iter (± 2137) 1.19
es/full/codegen/es5 38896 ns/iter (± 5542) 33279 ns/iter (± 1618) 1.17
es/full/codegen/es2015 37283 ns/iter (± 5955) 34263 ns/iter (± 1650) 1.09
es/full/codegen/es2016 40515 ns/iter (± 10345) 34067 ns/iter (± 2221) 1.19
es/full/codegen/es2017 36930 ns/iter (± 7646) 34051 ns/iter (± 1925) 1.08
es/full/codegen/es2018 37856 ns/iter (± 6874) 34159 ns/iter (± 2412) 1.11
es/full/codegen/es2019 45958 ns/iter (± 23401) 34169 ns/iter (± 1989) 1.35
es/full/codegen/es2020 38990 ns/iter (± 6135) 34209 ns/iter (± 1853) 1.14
es/full/all/es3 238580830 ns/iter (± 28722168) 232287311 ns/iter (± 26942820) 1.03
es/full/all/es5 224927333 ns/iter (± 26666477) 221893523 ns/iter (± 26236479) 1.01
es/full/all/es2015 177884956 ns/iter (± 23786388) 174231272 ns/iter (± 16141004) 1.02
es/full/all/es2016 179526493 ns/iter (± 24409673) 171969918 ns/iter (± 16465334) 1.04
es/full/all/es2017 176323122 ns/iter (± 22744149) 171881926 ns/iter (± 18447525) 1.03
es/full/all/es2018 174981188 ns/iter (± 25129657) 167931726 ns/iter (± 14315490) 1.04
es/full/all/es2019 174284662 ns/iter (± 20953279) 165847920 ns/iter (± 14247141) 1.05
es/full/all/es2020 163635784 ns/iter (± 13875128) 159574806 ns/iter (± 19683453) 1.03
es/full/parser 830683 ns/iter (± 123839) 735682 ns/iter (± 60487) 1.13
es/full/base/fixer 31749 ns/iter (± 6214) 27651 ns/iter (± 1330) 1.15
es/full/base/resolver_and_hygiene 101760 ns/iter (± 18473) 94419 ns/iter (± 9773) 1.08
serialization of ast node 261 ns/iter (± 44) 217 ns/iter (± 6) 1.20
serialization of serde 275 ns/iter (± 58) 222 ns/iter (± 7) 1.24

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

Please sign in to comment.