mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-10-30 09:19:41

Svelte

스벨트에서 넘어옴
웹 프레임워크 기술
{{{#!wiki style="margin:0 -10px"
{{{#!folding [ 펼치기 / 접기 ]
{{{#!wiki style="margin:-5px 0px -10px; word-break:keep-all"
$ 유료 포함 • 취소선 단종 및 중단
<colbgcolor=#f6f6f9,#2f3241> 프론트엔드 <colbgcolor=#fcfcfd,#272935> CSS Bootstrap Tailwind CSS Bulma Foundation Skeleton Pico
JSX React SolidJS Astro Preact Gatsby Remix Inferno Qwik
JS Angular Svelte Backbone.js jQuery Astro htmx Ember.js Lit 11ty Marko VanJS Alpine.js
Vue Vue.js VuePress Gridsome Quasar Astro
Python Reflex
백엔드 Java Spring Struts GWT Grails Jooby Play! Framework Scala
Kotlin Ktor
JS Express NestJS koa Hono fastify
.NET ASP.NET$
PHP Laravel Codeigniter Reasonable phalcon Symfony zend CakePHP FuelPHP Yii Slim PHPixe
Python Django Flask FastAPI
Ruby Ruby on Rails Sinatra
Go Gin echo Fiber
풀스택 JSX Next.js Astro SolidStart Remix Qwik City
JS SvelteKit Fresh Astro Marko
Vue Nuxt.js Astro
Java Vaadin$
Python Streamlit Reflex
Rust Rocket Actix Leptos Axum
하이브리드 .NET Blazor
Dart Flutter
Kotlin Kotlin Multiplatform
}}}}}}}}} ||


<colbgcolor=#ffffff,#1f2023><colcolor=#4A4A55,#ddd> 스벨트
Svelte
파일:Svelte 로고.svg
제작자 리치 해리스(Rich Harris)
분류 웹 프레임워크
출시 2016년 11월 26일
언어 JavaScript
버전 5.1.4
라이선스 MIT 라이선스
파일:홈페이지 아이콘.svg | 파일:GitHub 아이콘.svg 파일:GitHub 아이콘 화이트.svg | | 파일:디스코드 아이콘.svg
1. 개요2. 특징
2.1. 4.02.2. 5.0
3. 룬(Rune)
3.1. 최초 발표(5.0 이전)3.2. 정식 발표(5.0 이후)
4. 예시5. SvelteKit6. Svelte를 사용하는 웹 사이트/프로그램7. 학습
7.1. 유튜브7.2. 웹페이지
7.2.1. 공식 튜토리얼7.2.2. 블로그7.2.3. 기타 웹페이지
7.3. 도서
8. 기타9. 관련 문서

[clearfix]

1. 개요


Svelte는 2016년 출시한 오픈 소스 프론트엔드 웹 프레임워크이다. 기존의 React Vue.js 등의 널리 알려진 웹 프레임워크와 달리, 가상 DOM을 사용하지 않으며 빌드 단계에서 구성 요소를 컴파일하여 성능이 향상되었다.

2. 특징

2.1. 4.0

한국 시간으로 2023년 6월 23일, 4.0이 출시되었다. 4.0 은 3.x 의 호환성을 유지하면서, 5.0의 디딤돌 역할을 한다고 밝혔다. 3.0 버전이 출시한지 4년 만에 새 메이저 버전으로 많은 우여곡절 끝에, 메인 개발진들의 안착 이후 적극적 활동이 빛을 발하는 셈.
주요 변경 사항은 아래와 같다.
스벨트 3 프로젝트나 라이브러리 등은 최소 요구사항만 충족하면 대부분 npx svelte-migrate@latest svelte-4 명령어를 통해 바로 4.0으로 간편하게 마이그레이션할 수 있다.
4.0 버전을 발표하면서 5.0에 대한 언급을 추가적으로 한 내용에 의하면, 핵심 컴파일러와 런타임을 재구성하여 더 빠르고 가벼운 기술이 되도록 할 예정이라 밝혔다.

2.2. 5.0

한국시각으로 10월 20일, 갑작스레 5.0 을 발표하였다.
주요 변경 사항은 아래와 같다.

Svelte 4 프로젝트일 경우 npx sv migrate svelte-5 명령어로 자동 마이그레이션이 지원된다. 마이그레이션 가이드
그리고 후술할 룬(rune) 이 정식 차용되어, 명시적인 반응성을 통해 개발자의 혼란을 줄였다는 점이 특징이다.

이외에 또다른 특징이 있는데, .evelte.js.svelte.ts 확장자를 지정하면 스벨트 컴파일러가 이 파일을 인지하여 특히 반응성이 요구되는 로직을 작성할 때 도움이 될 수 있도록 기능이 추가됐다. 특히 후술할 룬 기능을 사용할 때 유용할 것이다.

3. 룬(Rune)

5.0 부터 사용 가능한 신규 문법으로, 접근성 향상과 타입스크립트에 더 유리한 대응이 가능한 신규 문법이다.

3.1. 최초 발표(5.0 이전)


5.0 에 신규 문법으로 사용할 예정인 룬(Rune)을 발표하였다.
공식 블로그에 정리된 목록에 의하면, Rune 기능은 접근성 향상을 위해 아래 기존 문법을 대체할 목적에 있다.

Try it 사이트 에서 <svelte:options runes /> 옵션 태그를 추가하는 것으로 시험해 볼 수 있다.

3.2. 정식 발표(5.0 이후)

Svelte 에서 사용하는 $ 기호가 이전에는 반응성 추적에 그쳤는데, 5.0.0 부터는 룬을 상징하는 기호로 변했다.
$ 접두어는 스벨트 컴파일러의 반응형 매크로가 되어, 별도 import 없이 사용 가능하다.
마치 Vue.js<script setup> 구문과 유사하다.

Svelte 4 에서 사용하던 반응형 선언문은,
#!syntax html
<script>
  let count = 0;
  $: doubled = count * 2;
</script>


<button onclick={() => count++}>
	{doubled}
</button>

<p>{count} doubled is {doubled}</p>

이제 Svelte 5 에서 이렇게 사용하면 된다.
#!syntax html
<script>
  let count = $state(0);
  let doubled = $derived(count * 2);
</script>


<button onclick={() => count++}>
	{doubled}
</button>

<p>{count} doubled is {doubled}</p>

이 때, count 변수는 예나 지금이나 동일한 반응형 변수가 되기 때문에, 이전 버전과 동일하게 값을 재할당하는 식으로 값 변경과 이에 대한 반응성 두마리 토끼를 챙길 수 있다.

이를 통해, Svelte 에 입문하는 개발자에게 '이것이 반응형 구문이구나' 라는 인지를 확실하게 줄 수 있으며,
기존 $ 구문과 Typescript 상의 타입 정의에 대한 모호함을 해소한 효과가 생겼다.
자세한 문서는 여기를 참고하기 바란다.

4. 예시

예를 들어, 두 개의 input 요소에서 숫자를 입력받고 그 숫자들을 더한 값을 출력해주도록 구현을 한다고 가정하자.

React에서는 다음과 같이 구축할 수 있다.
#!syntax javascript
import React, { useState } from 'react';

export default () => {
  const [a, setA] = useState(1);
  const [b, setB] = useState(2);

  return (
    <div>
      <input type="number" value={a} onChange={(e)=>setA(+e.target.value)}/>
      <input type="number" value={b} onChange={(e)=>setB(+e.target.value)}/>

      <p>{a} + {b} = {a + b}</p>
    </div>
  );
};

Vue.js(버전 2 기준)에서는 아래와 같다.
#!syntax xml
<template>
  <div>
    <input type="number" v-model.number="a">
    <input type="number" v-model.number="b">

    <p>{{a}} + {{b}} = {{a + b}}</p>
  </div>
</template>

<script>
  export default {
    data: function() {
      return {
        a: 1,
        b: 2
      };
    }
  };
</script>

이를 Svelte 4.0에서 똑같이 구현을 하면 아래와 같다.
#!syntax xml
<script>
  let [a, b] = [1, 2];
</script>

<input type="number" bind:value={a}>
<input type="number" bind:value={b}>

<p>{a} + {b} = {a + b}</p>

React는 442자, Vue.js는 263자의 코드를 작성해야 하지만, Svelte는 145자만 사용하여 동일한 결과물을 만들 수 있다. 이와 같이 Svelte는 훨씬 적은 양의 코드로 간결하게 표현하여 구축할 수 있는 장점 덕분에 작업에 있어 가독성을 향상시키고 시간도 절약할 수 있다.

해당 소스를 살펴보자면,
  1. React에서는 input 태그에서의 양방향 바인딩을 지원하지 않아, input에 onchange 이벤트를 일일이 걸어 변수값을 변경해주도록 만들어줘야 하며, 또한 변수의 초기값 외에 setter 함수로 쓰일 변수와 useState라는 특유의 선언함수를 이용해야 한다(React Hooks). 그나마 과거 class 기반의 방식보다는 간단해진 버전이다. class 기반에서는 react.component 상속 및 생성자에서의 변수 설정이 추가적으로 필요했다. 또한 일반적인 html 렌더링 방식이 아닌 JSX(JavaScript eXtension)라는 특수한 방식으로 결과를 반환해주고 있다. (svelte에서는 @html과 비슷하다.[2])
  2. vue에서는 v-model이라는 양방향 바인딩 지원으로 onchange를 선언할 필요는 없지만, 여전히 template 태그를 별도로 선언해야 하며, 일반적인 자바스크립트 방식의 방식과 다르게 객체 선언 등으로 데이터를 초기화해주고 있다.
    참고로 반응형 문법을 쓰는 방식으로도 구현할 수 있다.[3]
    svelte에서는 $:로 끝나지만, vue.js에서는 'computed, watch'로 별도로 선언해야 하며, react에서는 해당 기능이 존재하지 않으며, 해당 효과를 흉내내기 위하여 일반적으로 useeffect(이전의 componentDidUpdate)등의 생명주기 hook를 이용해야 한다.
#!syntax xml
<script>
  let [a, b] = [1, 2];
  $: c = a + b;
</script>

<input type="number" bind:value={a}>
<input type="number" bind:value={b}>

<p>{a} + {b} = {c}</p>

5. SvelteKit

Svelte에 기반하여 만들어진 풀스택 웹 프레임워크이다.

6. Svelte를 사용하는 웹 사이트/프로그램

7. 학습

7.1. 유튜브

7.2. 웹페이지

7.2.1. 공식 튜토리얼

7.2.2. 블로그

7.2.3. 기타 웹페이지

7.3. 도서

8. 기타

제작자 리치 해리스(Rich Harris)가 최근 Next.js 프레임워크로 유명한 독일 기업 Vercel에 합류하면서, Svelte 개발에 더 많은 시간을 할애할 수 있다고 밝혔다. # 기여자 위주의 제한적인 개발과 얼어붙은 커뮤니티에 활기를 불어넣어 줄 것으로 기대하고 있다.

9. 관련 문서



[1] Rich Harris가 기존 Typescript로 개발하던 체계를 모두 Javascript로 바꾼 덕분이라고 Hacker News 에 언급했다. 물론 타입스크립트 사용을 고려하여 타입을 적용하도록 대응했기 때문에 타입스크립트 사용에도 문제가 없다. [2] https://svelte.dev/tutorial/html-tags [3] https://svelte.dev/tutorial/reactive-declarations