vanilla
js
&CSS
๋ง์ ์ฌ์ฉํ๋ฉด์ ๋๊ปด์ง๋ ๋ถํธํจ ๊ฐ์ ํด๋ณด๊ธฐ
- ์ค๋ณต๋๋
html
๋งํฌ์ ์ ๋ฌธ์ ์ - ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ์
- ์ ์ญ์ ์คํ์ผ๋ง๊ณผ ์ค๋ณต
class
naming์ ๋ฌธ์ ์ - ๋ชจ๋ ๊ฒ์ ํ์ฉํด์ฃผ๋ ์ง๋์น๊ฒ ์น์ ํ
js
์ค๋ณต๊ณผ ์ ์ฐจํ ํ๋ก๊ทธ๋๋ฐ โก๏ธ ์ ์ธํ ์ปดํฌ๋ํธ
Component
class
์ ์ธํ ์ปดํฌ๋ํธ
const Container = (children) =>
new Component({
template: `
<div class="${style.box}">
${children}
</div>`,
}).html()
์ปดํฌ๋ํธ ํ์ฉ ๋ฐ ์ฌ์ฌ์ฉ
import { Container } from "์ด๋์ ๊ฐ"
const Section = () =>
new Component({
template: `
<div>
${Container(`
<button>์๋
?</button>
`)}
</div>
`,
}).html()
EventListener
class
์ปดํฌ๋ํธ์ ๋ช ์์ ์ผ๋ก ์ด๋ฒคํธ ๋ถ์ฐฉ ๋ฐ ์ ๊ฑฐ
const Container = (children) => {
const clickHandler = (e) => {
console.log(e.clientX)
}
return new Component({
template: `
<div class="${style.box}">
${children}
</div>`,
})
.addEvent((target) => ({
type: "click",
handler: clickHandler,
}))
.removeEvent((target) => ({
type: "click",
handler: clickHandler,
}))
}
atom
state management
๋ช ์์ ์ธ ๋ณ์๊ด๋ฆฌ์ ์ฅ์
const Counter = () => {
const [count, setCount] = atom(0)
const increase = () => {
setCount(count() + 1)
}
return new Component({
template: `
<button>
Counter is ${count()}
</button>`,
})
.addEvent(() => ({
type: "click",
handler: increase,
}))
.render()
}
์คํ์ผ๋ง โก๏ธ
CSS module
์ ํ์ฉํ scopedCSS
์ปดํฌ๋ํธ ํ์ผ์ ์ปดํฌ๋ํธ ๋ฐ ์คํ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ
๐ฆmy-component
โฃ ๐index.js
โ ๐index.module.css
์ง๋์น ์์ โก๏ธ
jsdoc
๊ณผjsconfig.json
์ผ๋ก ํ์
๋ ๋ ํ ๋ฌด๊ธฐ ์ค๋น jsconfig.json
{
"compilerOptions": {
"strict": true,
"allowJs": true,
"checkJs": true,
"noEmit": true,
"module": "NodeNext",
"moduleResolution": "NodeNext",
"typeRoots": ["./node_modules/@types"],
"forceConsistentCasingInFileNames": true
},
"include": ["src"],
"exclude": ["node_modules", "dist"]
}
๊ธฐ๋งฅํ jsdoc
๊ณผ ์ ์ ํด์ง js
/**@type string */
let ๋ฐ๋์_์คํธ๋ง = "์ด๊ฑฐ ๋ฐ๋์ ๊ธ์์์ฉ"
// โ ๊ฐ๋ฅ์ ํ์ง๋ง, ์ค๋ฅ ๋งค์ธ์ง๊ฐ ๋จ๋ ๋งค์ง
๋ฐ๋์_์คํธ๋ง = 1
- ๋ง์ฐ์ค
hover
์ ์ขํ์๋ฐ๋ผ ๋์ ์ผ๋ก ๋ฐ์ํ๋ ์นด๋ radial gradient
์blur
api๋ฅผ ์ฌ์ฉํ ํจ๊ณผ- ๋ฒํผ ring ํ์
- gradient ํ ์คํธ ๋ณํ ๋ฐ ์ ํ
- ์ ์ธ์ ์ด๋ฉฐ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ํจ์์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ์ ์ํด ๋ง์ ์ค๋ณต์ ์ค์ผ ์ ์์์
- ๋ฐ๋๋ผ js์
DOM
api์ ํ์ฉ๋ฒ์ ๋ํด ๊น๊ฒ ํ์ตํ ์ ์์์ - reactivness๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์นํ๋ ์์ํฌ๋ค์ ์ ๋ต(
compile
/reactiveness
/v-dom & diff
)์ ํ์์ฑ์ ๋๋
-
reactiveness๊ฐ ์์. state๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ์ฌ๋ ๋๋งํ๋ ๋ก์ง์ด ์๊ธฐ์ ์ง์
DOM
api๋ฅผ ํธ์ถํ๊ฑฐ๋CSS variable
๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋ ๋จ์ ์ด ์์Proxy
๋ฅผ ์ด์ฉํ ๋ณ์ ๊ตฌ๋ ๊ณผ ๋ ๋๋ง ๋ฑ์ ๋ฐฉ๋ฒ -
string
์HTML
๋ก ์ฌ์ฉํ๋ฏ๋กjsx
์ ๊ฐ์ ์ง๊ด์ฑ๊ณผ ๊ฐ๋ฐ ํธ์์ฑ์ด ์์. -
render()
ํธ์ถ์parent
๊ฐ ์กด์ฌํ๋ฉฐ,event
๋ฑ์ด ๋ถ์ฐฉ๋ ๋ฐ์์ฑ์ด ์๋ ์ปดํฌ๋ํธ๋ ์ํ๋ ์์น์ ๋ ๋๋งํ๊ธฐ๊ฐ ๊น๋ค๋ก์
๋ ๋๋ง ์์น ์ง์ ํ๊ธฐ โ
const StaticParent = () => new Component({
template: "<div id="์ฌ๊ธฐ์-๋ ๋๋ง">{...}</div>"
})
const ReactiveComponent = () => {...}
// โ DOM-tree์์ id์์๋ฅผ ํ์ ๋ถ๊ฐ๋ฅ
ReactiveComponent.render("์ฌ๊ธฐ์-๋ ๋๋ง")
StaticParent.render()
// โ
DOM-tree์์ id์์๋ฅผ ํ์ ๊ฐ๋ฅ
ReactiveComponent.render("์ฌ๊ธฐ์-๋ ๋๋ง")
๋ ๋๋ง ์ง์ ํ๊ธฐ โ
const ReactiveComponent = () => {...}
const StaticParent = () => new Component({
// โ html ๋ ๋๋ง ๋ถ๊ฐ
template: `${ReactiveComponent.render()}`
template: `${ReactiveComponent.html()}`
})