Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/danpacho/vanilla-vercel-clone
๐ฆ vanilla js๋ก vercel ํ์ด์ง ์ผ๋ถ๋ฅผ ํด๋์ฝ๋ฉ ํด๋ด
๋๋ค!
https://github.com/danpacho/vanilla-vercel-clone
component-based vanilla-javascript vercel-clone
Last synced: 2 days ago
JSON representation
๐ฆ vanilla js๋ก vercel ํ์ด์ง ์ผ๋ถ๋ฅผ ํด๋์ฝ๋ฉ ํด๋ด ๋๋ค!
- Host: GitHub
- URL: https://github.com/danpacho/vanilla-vercel-clone
- Owner: danpacho
- Created: 2022-10-28T07:57:15.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2022-11-02T09:27:59.000Z (about 2 years ago)
- Last Synced: 2024-11-13T01:38:01.872Z (2 days ago)
- Topics: component-based, vanilla-javascript, vercel-clone
- Language: JavaScript
- Homepage:
- Size: 1.2 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Vercel Clone / 7์ผ
## ์ค์ ์ ์ธ ๊ณ ๋ฏผ ์ฌํญ ๐ง
> vanilla `js` & `CSS`๋ง์ ์ฌ์ฉํ๋ฉด์ ๋๊ปด์ง๋ ๋ถํธํจ ๊ฐ์ ํด๋ณด๊ธฐ
1. ์ค๋ณต๋๋ `html` ๋งํฌ์ ์ ๋ฌธ์ ์
2. ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ์
3. ์ ์ญ์ ์คํ์ผ๋ง๊ณผ ์ค๋ณต `class` naming์ ๋ฌธ์ ์
4. ๋ชจ๋ ๊ฒ์ ํ์ฉํด์ฃผ๋ ์ง๋์น๊ฒ ์น์ ํ `js`## ํด๊ฒฐ ๋ฐฉ๋ฒ ๐
> ์ค๋ณต๊ณผ ์ ์ฐจํ ํ๋ก๊ทธ๋๋ฐ โก๏ธ ์ ์ธํ ์ปดํฌ๋ํธ
1. `Component` class
**์ ์ธํ** ์ปดํฌ๋ํธ
```js
const Container = (children) =>
new Component({
template: `
`,
${children}
}).html()
```์ปดํฌ๋ํธ **ํ์ฉ** ๋ฐ **์ฌ์ฌ์ฉ**
```js
import { Container } from "์ด๋์ ๊ฐ"const Section = () =>
new Component({
template: `
${Container(`
์๋ ?
`)}
`,
}).html()
```2. `EventListener` class
์ปดํฌ๋ํธ์ **๋ช ์์ ์ผ๋ก** ์ด๋ฒคํธ ๋ถ์ฐฉ ๋ฐ ์ ๊ฑฐ
```js
const Container = (children) => {
const clickHandler = (e) => {
console.log(e.clientX)
}return new Component({
template: `
`,
${children}
})
.addEvent((target) => ({
type: "click",
handler: clickHandler,
}))
.removeEvent((target) => ({
type: "click",
handler: clickHandler,
}))
}
```3. `atom` state management
๋ช ์์ ์ธ ๋ณ์๊ด๋ฆฌ์ ์ฅ์
```js
const Counter = () => {
const [count, setCount] = atom(0)
const increase = () => {
setCount(count() + 1)
}return new Component({
template: `
Counter is ${count()}
`,
})
.addEvent(() => ({
type: "click",
handler: increase,
}))
.render()
}
```> ์คํ์ผ๋ง โก๏ธ `CSS module`์ ํ์ฉํ scoped `CSS`
์ปดํฌ๋ํธ ํ์ผ์ ์ปดํฌ๋ํธ ๋ฐ ์คํ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ
```
๐ฆmy-component
โฃ ๐index.js
โ ๐index.module.css
```> ์ง๋์น ์์ โก๏ธ `jsdoc`๊ณผ `jsconfig.json`์ผ๋ก ํ์
๋ ๋ ํ ๋ฌด๊ธฐ ์ค๋น `jsconfig.json`
```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`
```js
/**@type string */
let ๋ฐ๋์_์คํธ๋ง = "์ด๊ฑฐ ๋ฐ๋์ ๊ธ์์์ฉ"// โ ๊ฐ๋ฅ์ ํ์ง๋ง, ์ค๋ฅ ๋งค์ธ์ง๊ฐ ๋จ๋ ๋งค์ง
๋ฐ๋์_์คํธ๋ง = 1
```## ๊ตฌํ์ฌํญ โ
1. ๋ง์ฐ์ค `hover`์ ์ขํ์๋ฐ๋ผ ๋์ ์ผ๋ก ๋ฐ์ํ๋ ์นด๋
2. `radial gradient`์ `blur` api๋ฅผ ์ฌ์ฉํ ํจ๊ณผ
3. ๋ฒํผ ring ํ์
4. gradient ํ ์คํธ ๋ณํ ๋ฐ ์ ํ## ๊ตฌํ๊ฒฐ๊ณผ ๐
![์ต์ด ๋ก๋ฉ ํ์ด์ง!](./assets/preview.png)
## ์ข์๋ ์ โ
1. ์ ์ธ์ ์ด๋ฉฐ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ํจ์์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ์ ์ํด ๋ง์ ์ค๋ณต์ ์ค์ผ ์ ์์์
2. ๋ฐ๋๋ผ js์ `DOM` api์ ํ์ฉ๋ฒ์ ๋ํด ๊น๊ฒ ํ์ตํ ์ ์์์
3. **reactivness**๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์นํ๋ ์์ํฌ๋ค์ ์ ๋ต(`compile` / `reactiveness` / `v-dom & diff`)์ ํ์์ฑ์ ๋๋## ๊ฐ์ ํ ์ ๐ธ
1. **reactiveness**๊ฐ ์์. state๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ์ฌ๋ ๋๋งํ๋ ๋ก์ง์ด ์๊ธฐ์ ์ง์ `DOM` api๋ฅผ ํธ์ถํ๊ฑฐ๋ `CSS variable`๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋ ๋จ์ ์ด ์์
> `Proxy`๋ฅผ ์ด์ฉํ ๋ณ์ ๊ตฌ๋ ๊ณผ ๋ ๋๋ง ๋ฑ์ ๋ฐฉ๋ฒ
2. `string`์ `HTML`๋ก ์ฌ์ฉํ๋ฏ๋ก `jsx`์ ๊ฐ์ ์ง๊ด์ฑ๊ณผ ๊ฐ๋ฐ ํธ์์ฑ์ด ์์.
3. `render()`ํธ์ถ์ `parent`๊ฐ ์กด์ฌํ๋ฉฐ, `event`๋ฑ์ด ๋ถ์ฐฉ๋ ๋ฐ์์ฑ์ด ์๋ ์ปดํฌ๋ํธ๋ ์ํ๋ ์์น์ ๋ ๋๋งํ๊ธฐ๊ฐ ๊น๋ค๋ก์
๋ ๋๋ง ์์น ์ง์ ํ๊ธฐ โ
```js
const StaticParent = () => new Component({
template: "{...}"
})const ReactiveComponent = () => {...}
// โ DOM-tree์์ id์์๋ฅผ ํ์ ๋ถ๊ฐ๋ฅ
ReactiveComponent.render("์ฌ๊ธฐ์-๋ ๋๋ง")StaticParent.render()
// โ DOM-tree์์ id์์๋ฅผ ํ์ ๊ฐ๋ฅ
ReactiveComponent.render("์ฌ๊ธฐ์-๋ ๋๋ง")
```๋ ๋๋ง ์ง์ ํ๊ธฐ โ
```js
const ReactiveComponent = () => {...}const StaticParent = () => new Component({
// โ html ๋ ๋๋ง ๋ถ๊ฐ
template: `${ReactiveComponent.render()}`
template: `${ReactiveComponent.html()}`
})
```