"๐๐ขเธก๐ก๐ก๐๐จ๐ฉ๐๐๐๐ฃ๐": ์น ๊ตฌ์ฑ ์์๋ฅผ 29% ๋ ์๊ฒ ๋ง๋ค๊ธฐ
15009 ๋จ์ด webdevshowdevwebcomponentsjavascript
<my-counter>
Web Component๋ค์ดํฐ๋ธ ์ฝ๋๋ File Size Ranking์์ 1์๋ฅผ ์ฐจ์งํ์ต๋๋ค.
ํ์ง๋ง... ์ ๋ Svelte ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์ต์ ํํ๊ธฐ ๋๋ฌธ์ Svelte์์ ๋น๊ต์ ์ ์ ์ผ๋ก ๋ฐ๋ํฉ๋๋ค.
๊ทธ๋์ "์ปดํ์ผ๋ฌ ์ฌ์"
๋ค์ดํฐ๋ธ HTMLElement ์ฝ๋๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
(๋ค๋ฅธ ๋ชจ๋ ์์ค ๋ฒ์ ๋ ๋ง์ฐฌ๊ฐ์ง์)
gzip
WebComponents DEV์ ์๋ณธ
476B*
๋ ์ฌํ
1884๋
๋ฆฌํฉํ ๋ง
355B - ์ ๊ฐ์ก: 25%
์ต์ ํ
339 B - ์ ๊ฐ์ก: 29%
*) Web Components DEV ์ฌ์ดํธ์์๋ ํ์ผ์ด 505๋ฐ์ดํธ๋ผ๊ณ ํฉ๋๋ค.
GitHub.io์ ๋ณต์ฌํ ๋ด ๋ณด๊ณ ์๋ 476๋ฐ์ดํธ์ ๋๋ค.
์๋ณธ <my-counter> = 476๋ฐ์ดํธ:
๋ฆฌํฉํฐ๋ง ์ฝ๋
JSFiddle ์์ ํญJavaScript
์ ์ฐธ์กฐํ์ญ์์ค.
JSFiddle ์์ ํญ
JavaScript
์ ์ฐธ์กฐํ์ญ์์ค.\n
์ค๋ฐ๊ฟ์ด ์ฌ์ ํ ์ถ์๋ ํ์ผ์ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋ฐ์ดํธ๋ฅผ ๋นจ์๋ค์
๋๋ค. createElement('template')
๊ฐ ํ์ํ์ง ์์ต๋๋คsuper()
์ด ๋ฒ์attachShadow()
์ค์ ๋ฐ ๋ฐํ this.shadowRoot
๋ชจ๋ ๊ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
constructor() {
super()
.attachShadow({ mode: 'open' })
.innerHTML = "<style>*{font-size:200%}...
ํ ๋ฒ๋ง ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ MyCounter ํด๋์ค ์ ์๊ฐ ํ์ํ์ง ์์ต๋๋ค.
customElements.define('my-counter', class extends HTMLElement {}
๊ฑฐ์ ๋ชจ๋ 51๊ฐ์ ์์ ๋ ์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ(ํ๊ธฐ๋ฒ)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
render() {
return html`
<button @click="${this.dec}">-</button>
<span>${this.count}</span>
<button @click="${this.inc}">+</button>
`;
}
๊ทธ๋ผ ์ฐ๋ฆฌ๋ ํ ์ ์์ด
inc()
๋ฐ dec()
๋ฉ์๋๋ฅผ ์ฐพ๊ธฐ ์ํด ์ถ๊ฐ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค(ํ๋์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ํํจ)id
์ฐธ์กฐ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค. <button onclick="this.getRootNode().host.inc()">
<button onclick="this.getRootNode().host.dec()">
id
์ ๋์์ผ๋ก ํ ์ ์์ผ๋ฏ๋ก <span id="count">
์ <span>
๋ ํ์ํ์ง ์์ต๋๋ค.๋ชจ๋ ๋ฆฌํฉํฐ๋ง
connectedCallback
์ ๋ฒ์ innerHTML์ 0์ผ๋ก ์ค์ ํ๋ ๊ฒ์
๋๋ค. connectedCallback() {
this.update(this.count);
}
HTML์์ ๊ธฐ๋ณธ๊ฐ 0์ ์ค์ ํ๋ฉด connectedCallback์ด ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค.
"<span>0</span>"+
๋ธ๋ผ์ฐ์ ๊ฐ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ HTML ์์ฑ์์ ํ์ํ์ง ์์ ๋ฐ์ดํ๋ฅผ ์ ๊ฑฐํ์ญ์์ค.
<button onclick=this.getRootNode().host.inc()>
<button onclick=this.getRootNode().host.dec()>
๋ฆฌํฉํฐ๋ง๋ ์ฝ๋ = 355๋ฐ์ดํธ:
customElements.define("my-counter", class extends HTMLElement {
constructor() {
super()
.attachShadow({ mode: "open" })
.innerHTML =
"<style>" +
"*{font-size:200%}"+
"span{width:4rem;display:inline-block;text-align:center}" +
"button{width:4rem;height:4rem;border:none;border-radius:10px;background-color:seagreen;color:white}" +
"</style>" +
"<button onclick=this.getRootNode().host.dec()>-</button>" +
"<span>0</span>" +
"<button onclick=this.getRootNode().host.inc()>+</button>";
this.count = 0;
}
inc() {
this.update(++this.count);
}
dec() {
this.update(--this.count);
}
update(count) {
this.shadowRoot.querySelector("span").innerHTML = count;
}
}
);
์ต์ ํ๋ ์ฝ๋ = 339๋ฐ์ดํธ:
์ด ๊ตฌ์ฑ ์์๋ ๋ ์ข๊ณ ๋ ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
customElements.define("my-counter", class extends HTMLElement {
constructor() {
super()
.attachShadow({ mode: "open" })
.innerHTML =
"<style>" +
"*{font-size:200%}"+
"span{width:4rem;display:inline-block;text-align:center}" +
"button{width:4rem;height:4rem;border:none;border-radius:10px;background-color:seagreen;color:white}" +
"</style>" +
"<button onclick=this.getRootNode().host.dec()>-</button>" +
"<span>0</span>" +
"<button onclick=this.getRootNode().host.inc()>+</button>";
this.count = 0;
}
inc() {
this.update(++this.count);
}
dec() {
this.update(--this.count);
}
update(count) {
this.shadowRoot.querySelector("span").innerHTML = count;
}
}
);
์ด ๊ตฌ์ฑ ์์๋ ๋ ์ข๊ณ ๋ ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
inc
, dec
๋ฐ update
๋ฉ์๋๋ ํ์ํ์ง ์์ต๋๋ค.count
๋ 2๊ฐ์ ์์(๋ฒํผ ๋ฐ ์คํฌ)์๋ง ์ ์ฉ๋ฉ๋๋ค.๋ ์์ ๋ชจ๋์
* {font-size:200%}
๋ฅผ ์ค์ ํ๋ฉด ๋ ํฐ ํ์ผ์ด ์์ฑ๋์ง๋ง GZipped ํ์ผ์ ๋ ์์์ง๋๋ค!(๊ทธ๋ฆฌ๊ณ CSS ํ์๋ ํ ์ผ์ด ์ ์ต๋๋ค.)
font-size:200%
๋ .count-- >
์ ์๋ฅผ ๋ซ๊ธฐ ์ํด ์ถ๊ฐ ๊ณต๊ฐ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ต์ํ๊ธฐ๊ฐ onclick
์ด์ค์ผ์ดํ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ 4๋ฐ์ดํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. -
๋ <span>
<p>
๊ฐ ์ํthis.count = 0;
๊ฐ ํ์ํ์ง ์์ต๋๋ค.<p>0</p>
๋ฐ seagreen
๋ฅผ ๋ ์งง์ white
ํ๊ธฐ๋ฒ์ผ๋ก ๋ฐ๊พธ๋ฉด ์ด ๊ฒฝ์ฐ ์ถ๊ฐ ๋ฐ์ดํธ๊ฐ ์ ์ฝ๋์ง ์์ต๋๋ค. ์ฝ๋์ #์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ GZip ์ธ์ฝ๋ฉ ๋นํธ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.customElements.define(
"my-counter",
class extends HTMLElement {
constructor() {
super().attachShadow({
mode: "open",
}).innerHTML =
"<style>" +
"p{font-size:200%;width:4rem;display:inline-block;text-align:center}" +
"button{font-size:200%;width:4rem;height:4rem;border:none;border-radius:10px;background:seagreen;color:white}" +
"</style>" +
"<button onclick=this.getRootNode().host.count-- >-</button>" +
"<p>0</p>" +
"<button onclick=this.getRootNode().host.count++>+</button>";
}
set count(p) {
this.shadowRoot.querySelector("p").innerHTML = p;
}
get count() {
return ~~this.shadowRoot.querySelector("p").innerHTML;
}
}
);
์ฐธ๊ณ : ์ธ๋ผ์ธ ์คํ์ผ์ ์ฌ์ฉํ๋ฉด 6๋ฐ์ดํธ๋ฅผ ๋ ์ ์ฝํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฝ๋ ์ ์ง ๋ณด์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ ค์์ ๊ฒช์ต๋๋ค.
.innerHTML =
"<button style=font-size:200%;width:4rem;height:4rem;border:none;border-radius:10px;background:seagreen;color:white onclick=this.getRootNode().host.count-- >-</button>" +
"<p style=font-size:200%;width:4rem;display:inline-block;text-align:center>0</p>" +
"<button style=font-size:200%;width:4rem;height:4rem;border:none;border-radius:10px;background:seagreen;color:white onclick=this.getRootNode().host.count++>+</button>"
์ต์ํ ๊ฒฐ๋ก
์น ๊ตฌ์ฑ ์์๋ฅผ ๋ฆฌํฉํ ๋งํ๋ฉด ๋ ์๊ณ ๋ ์ข์์ง๋๋ค.
gzip
original by WebComponents.DEV
476B*
๋ ์ฌํ
1884๋
๋ฆฌํฉํ ๋ง
355B - ์ ๊ฐ์ก: 25%
์ต์ ํ
339 B - ์ ๊ฐ์ก: 29%
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ("๐๐ขเธก๐ก๐ก๐๐จ๐ฉ๐๐๐๐ฃ๐": ์น ๊ตฌ์ฑ ์์๋ฅผ 29% ๋ ์๊ฒ ๋ง๋ค๊ธฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://dev.to/dannyengelman/making-a-web-component-29-smaller-jmi
ํ
์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ("๐๐ขเธก๐ก๐ก๐๐จ๐ฉ๐๐๐๐ฃ๐": ์น ๊ตฌ์ฑ ์์๋ฅผ 29% ๋ ์๊ฒ ๋ง๋ค๊ธฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/dannyengelman/making-a-web-component-29-smaller-jmiํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค