Qwik: κ°μ₯ λΉ λ₯Έ λ‘λ©μλμ μλ°μ€ν¬λ¦½νΈ νλ μμν¬
- #FrontEnd
- #Qwik
- #Framework
- #Performance
μλ νμΈμ. μλμμμ νλ‘ νΈμλ κ°λ°μ νκ³ μλ ν©νΈμ°¬μ λλ€.
μ΄λ²μλ builder.ioμμ λ§λ€μ΄λΈ Qwik Frameworkμ λν μκ°λ₯Ό ν΄λ³ΌκΉ ν©λλ€.
Qwikμ 2021λ μ μ΅μ΄λ‘ pre-release, μ¬ν΄ 5μμ 1.0.0μ΄ λ¦΄λ¦¬μ¦λ λλ¦? λ°λλ°λν νλ μμν¬μ λλ€.
κ°λ°ν λ΄λΆμμλ μλ μ Qwikμ μ 보λ₯Ό κ°μ΄ 곡μ ν νμ€ν λ¦¬κ° μλ€μ.
Qwik Framework?
Qwikμ React.js, Vue.jsμ κ°μ μΉ νλ μμν¬μ λλ€.
Qwikμ μ κ°μ₯ κ°μ μΌλ‘ λ½κ³ μλ λΆλΆμ, λ‘λ©μμ μ΅μ ν¬κΈ°μ μλ°μ€ν¬λ¦½νΈμ κ°μ₯ λΉ λ₯Έ μλμ λλ€.
Qwik is a new kind of web framework that can deliver instant loading web applications at any size or complexity.
Your sites and apps can boot with about 1kb of JS (regardless of application complexity), and achieve consistent performance at scale.
λ¨ 1kbμ μλ°μ€ν¬λ¦½νΈλ§μΌλ‘ νμ΄μ§μ μ΅μ΄ κΈ°λμ΄ κ°λ₯νλ€κ³ νλ€μ. μ΄λ₯Ό κ°λ₯νκ² νλκ²μ λ€λ₯Έ νλ μμν¬μ Qwikμ λμ λ°©μμ μ°¨μ΄μ λλ€.
κΈ°μ‘΄ νλ μμν¬λ μ΅μ΄ κΈ°λμ ν΄λΉ νμ΄μ§μ νμν λͺ¨λ jsνμΌμ λ‘λνκ³ , κ·Έ νμΌλ€μ΄ λ‘λλκΈ° μ κΉμ§λ μ¬μ©μκ° νμ΄μ§λ₯Ό νμΈν μ μμ΅λλ€. νμ§λ§ Qwikμ μ΅μνμ jsνμΌλ§μ κ°μ Έμ€κ³ , νμν λ κ·Έ λμμ μν μ΅μνμ jsνμΌμ κ·Έλκ·Έλ κ°μ Έμ΅λλ€.
μ§μ νμΈν΄λ³΄μ
μ€μ λ‘ λμΌνκ² λμνλμ§ μμ보기μν΄ reactμ qwik λ²μ μ λ€μκ³Ό κ°μ κ°λ¨ν Counterλ₯Ό λ§λ€μ΄λ³΄κ² μ΅λλ€.
λ¨Όμ reactμ λλ€.
npm create vite@latest react --template react-ts
function App() {
const [count, setCount] = useState(0)
return (
<div style={{display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '0.5rem'}}>
<button onClick={() => setCount(count => count - 1)}>minus</button>
<div>{count}</div>
<button onClick={() => setCount(count => count + 1)}>plus</button>
</div>
)
}
λ€μμ qwikμ λλ€.
npm create qwik@latest
export default component$(() => {
const count = useSignal(0);
return (
<div style={{display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '0.5rem'}}>
<button onClick$={() => count.value--}>minus</button>
<div>{count}</div>
<button onClick$={() => count.value++}>plus</button>
</div>
);
});
κ·ΈλΌ μ΄μ κ°λ°μλꡬ λ€νΈμν¬νμ μ΄μ΄μ jsλ‘ νν°λ₯Ό κ±Έκ³ νλ² νμΈν΄λ³΄λ©΄
μκ°λ³΄λ€ λΆλ¬μ€λ jsνμΌμ μκ³Ό ν¬κΈ°μ νμ°νκ² μ°¨μ΄κ° 보μ΄λκ±Έ νμΈν μ μμ΅λλ€. λ¬Όλ‘ νμ¬ νμ΄μ§κ° ν° κΈ°λ₯μ΄ μλ건 μλκ³ μ€μ λ‘ jsλ‘ λ²λ€λ§λλ λ΄μ©λ λ§μ§ μμ νμ΄μ§ λ‘λ©μ ν° μ°¨μ΄κ° μμ΄λ³΄μΌμ μμ§λ§ μλ§μ κΈ°λ₯μ΄ λ€μ΄κ°λ©΄μ νμ΄μ§ λ‘λ© μλλ μ μ λλ €μ§κ³ μ¬μ©μμ μ΄νμ¨λ‘ μ΄μ΄μ§κ² λ©λλ€.
Qwikμ΄ μ΄λ κ² μ΅μ΄ λ‘λ©μμ js μ¬μ΄μ¦λ₯Ό μ€μΈ λ°©λ²μ, μ΅μ΄ νμ΄μ§λ₯Ό λ‘λ©νλλ° νμνμ§ μμ μλ°μ€ν¬λ¦½νΈλ₯Ό λ‘λ©νμ§ μκΈ° λλ¬Έμ λλ€. μ ν¬κ° λ§λ μΉ΄μ΄ν°μ±μμ νμ΄μ§ λ‘λ©μ νλ μμ κΉμ§λ buttonμ λΆμ΄μλ μ΄λ²€νΈ 리μ€λλ νμνμ§ μμ΅λλ€. μ¬μ©μκ° ν΄λ¦νμ§ μμΌλ©΄ μΈμΌ μλ λ΄μ©μ΄κΈ° λλ¬Έμ λλ€.
Qwikμ κ°λ₯ν λͺ¨λ κ²μ λΉλκΈ°λ‘ μ²λ¦¬νκ³ , κΌ νμν λμμ΄ μλ κ²½μ° ν΄λΉ μ½λκ° μ¬μ©λμ§ μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ reactμμλ plus, minus λ²νΌμ λλ¬λ μ무 λ³νκ° μμ§λ§ qwikμμλ ν΄λΉ λ²νΌμ λλ₯΄λ μ¦μ κ·Έ λ²νΌμ ν΄λ¦νμλ λ°μν΄μΌ νλ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό λΆλ¬μ€κ³ νΈμΆμ΄ λλλ©΄ μ€ννκ² λ©λλ€.
Concept
μμμ μ΄ν΄λ³Έ λ΄μ©μ κΈ°μ€μΌλ‘ Qwikμ 컨μ , κ·Έ κ°λ°μλ€μ΄ μ΄λ€κ±Έ μ€μνκ³ μμ μ νλμ§ μμλ³΄λ €κ³ ν©λλ€.
Delay Execution
μ΅μνμ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό λ€μ΄λ‘λνλκ±Έλ‘, μ΄ν리μΌμ΄μ
μ λΉ λ₯΄κ² μ€νμν΅λλ€.
λ‘λ© μκ° ν₯μμ μν΄ μ μ μμ μ½λλ₯Ό λ§β©λ€μ΄λ΄λκ² μλλΌ νμν λ μ½λλ₯Ό κ°μ Έμμ μ¬μ©νλ©°, μ΄λ₯Ό μν΄ Qwikμμλ λͺ¨λ κ²μ λ μ΄μ§λ‘λλ‘ λμνκ² ν μ μμ΅λλ€.
Resumability
Qwikμ κΈ°λ³Έμ μΌλ‘ SSRμ μ§ν₯νλ νλ μμν¬μ
λλ€. μ΄ λ, μλ²μμ μ€μ λ μνκ° ν΄λΌμ΄μΈνΈμμ μ΄κΈ°νλλκ² μλ ν΄λΉ μνλ₯Ό ν΄λΌμ΄μΈνΈμμλ κ·Έλλ‘ μ μ§ν©λλ€.
λ€λ§ νμ΄λλ μ΄μ
μ νμ¬ νμ΄μ§μ κ΄λ ¨λλ λͺ¨λ μ»΄ν¬λνΈ μ½λλ₯Ό λ€μ΄λ‘λν΄μΌνκ³ ,
μΈλΆ μ»΄ν¬λνΈ νΈλ¦¬μ 리μ€λλ₯Ό λ€μ λΉλνκΈ° μν μ»΄ν¬λνΈμ μ°κ΄λ ν
νλ¦Ώμ μ€νμμΌμΌνκΈ° λλ¬Έμ
λ λλ§μ λ무 λ§μ λΉμ©μ΄ λ°μ, νμ΄λλ μ΄μ
μ νμ§ μμ΅λλ€.
Reactivity
μ΄λ€ μ»΄ν¬λνΈκ° μ΄λ€ μνλ₯Ό ꡬλ
νκ³ μλμ§λ₯Ό μκ²νμ¬ λ¦¬λ λλλ μ»΄ν¬λνΈμ μλ₯Ό μ΅μννκ³ , μ΄λ νλ‘μλ₯Ό ν΅ν΄μ κ΄λ¦¬λ©λλ€.
λν Qwik μ»΄ν¬λνΈλ λΆλͺ¨λΆν° μμμ μμλλ‘ λ λλ§μ νμ§ μκ³ κ°κ° λ³κ°μ λ λλ§κ³Όμ μ κ±°μΉλ©°, μ΄λ λΆλͺ¨μ 리λ λλ§μΌλ‘ μΈν μμμ 리λ λλ§μ μλ°©ν©λλ€.
μ΄λ₯Όν΅ν΄, κ°μ²΄λ±μ νμ©νμ¬ νλμ μνλ‘ κ΄λ¦¬νκ³ μμ΄λ, ν΄λΉ μ»΄ν¬λνΈμμ μ¬μ©νμ§ μλ κ°μ λ³κ²½μ 리λ λλ§μ λ°μμν€μ§ μμ΅λλ€. μλ μμ μμ aκ°μ λ³κ²½μμΌ°μλ, propsλ‘ aλ₯Ό μ λ¬λ°λ Childλ§ λ λλ§μ΄ λ€μ λ°μνκ³ , bλ₯Ό μ λ¬λ°λ Childλ 리λ λλ§μ΄ λ°μνμ§ μμ΅λλ€.
export const Child = component$((props: { count: number }) => {
return <span>{props.count}</span>;
});
export const MyApp = component$(() => {
const store = useStore({ a: 0, b: 0, c: 0 });
return (
<>
<button onClick$={() => store.a++}>a++</button>
<button onClick$={() => store.b++}>b++</button>
<button onClick$={() => store.c++}>c++</button>
{JSON.stringify(store)}
<Child count={store.a} />
<Child count={store.b} />
</>
);
});
λ§μΉλ©°
μ΄λ²μ μ κ° κ°μΈμ μΌλ‘ μ£Όλͺ©νκ³ μλ μ°¨μΈλ νλ μμν¬λΌ μκ°λλ Qwik.jsμ λν΄μ κ°λ¨ν μκ°λ₯Ό ν΄λ΄€μ΅λλ€.
νμ¬ ν λ΄ κ°λ°μλ€μ μν qwik λ¬Έμλ₯Ό μμ±νκ³ μμΌλ©°, μΆνμ μμ±λλ₯Ό λμ¬μ ν΄λΉ λ¬Έμλ₯Ό 곡κ°ν μ μλ κΈ°νκ° μμΌλ©΄ μ’κ² μ΅λλ€.
λν μλμμμλ κ°λ¨ν νλ‘μ νΈλ₯Ό λμμΌλ‘ Qwikμ μ μ©ν΄λ³΄λ € νκ³ μκ³ , μ΄λ₯Ό ν΅ν΄ μλμμ΄ κ΄λ¦¬νκ³ μλ νλ‘μ νΈλ€μ λν΄μ μ¬μ©μλ€μ λμ± μΉλ°ν μλΉμ€κ° λλ κΈ°νκ° λ μ μμκ±°λΌ μκ°ν©λλ€.