스벨트 공식 사이트에서는 REPL(Read-Eval-Print Loop)을 제공합니다. 또한 degit을 사용하여 롤업(Rollup) 기반의 프로젝트를 생성할 수 있습니다.
npx degit sveltejs/template my-svelte-project
cd my-svelte-project
npm install
npm run dev
스벨트에서 애플리케이션은 하나 이상의 컴포넌트로 구성됩니다. HTML의 수퍼셋을 사용하여 .svelte 파일에 작성됩니다. 스크립트·스타일·마크업의 세 섹션으로 나뉘며 각 섹션은 모두 선택 사항입니다.
<script>
// logic goes here
</script>
<style>
/* style go here */
</style>
마크업의 중괄호 안에 원하는 자바스크립트를 넣을 수 있습니다.
<script>
let name='world';
</script>
hello {name}!
또한 중괄호를 사용하여 요소 속성을 제어할 수 있습니다.
<script>
let src='tutorial/image.gif';
</script>
<img src = { src }>
<style> 태그를 사용하여 스타일을 추가할 수 있습니다. 스타일은 해당 컴포넌트에만 적용됩니다. 앱의 다른 곳에서 p 요소의 스타일을 변경하지 않습니다.
This is paragraph.
<style>
p {
color: purple;
font-family: 'comic Sans MS', cursive;
font-size: 2em;
}
</style>
요소를 포함하는 것처럼 다른 파일에서 컴포넌트를 가져와 포함할 수 있습니다. 또한 컴포넌트 이름은 대문자로 표시합니다. 이는 사용자 정의 컴포넌트와 HTML 태그를 구분할 수 있도록 하기 위해서입니다.
App.svelte
<script>
import Nested from './Nested.svelte';
</script>
This is paragraph.
><Nested/>
Nested.svelte
일반적인 문자열은 일반 텍스트로 삽입합니다. 때로는 HTML을 직접 렌더링해야 하는 경우도 있습니다. 이 때는 특별한 {@html …} 태그를 사용합니다.
<script>
let string = 'this string contains some HTML!!!';
</script>
{@html string}
스벨트의 중심에는 이벤트에 대한 응답과 같이 돔을 애플리케이션 상태와 동기화하기 위한 강력한 반응성 시스템이 있습니다. 스벨트는 변수 값 할당을 계측하여 돔을 업데이트해야 한다고 알려줍니다.
<script>
let count = 0';
function incrementCount() {
count +=1;
}
</script>
<button on : click = { incrementCount }>
Clicked {count} {count ===1? 'time': 'times'}
</button>
스벨트는 컴포넌트의 상태가 변경될 때 돔을 자동으로 업데이트합니다. 종종 컴포넌트의 상태 일부는 다른 부분에서 계산 및 변경될 때마다 다시 계산되어야 합니다. 이를 위한 반응성 선언 $:이 있습니다. 반응성 값은 여러 번 참조해야 하거나 다른 반응성 값에 의존하는 값이 있는 경우에 유용합니다.
<script>
let count = 0';
$: double = count * 2;
function handleClick() {
count +=1;
}
</script>
<button on:click={handleClick}>>
Clicked {count} {count ===1? 'time': 'times'}
</button>
{count} double is {doubled}
스벨트의 반응성은 할당에 의해 트리거되기 때문에 push 및 splice와 같은 배열 메서드를 사용하면 자동으로 업데이트가 발생하지 않습니다. 이를 수정하는 한 가지 방법은 아래 예시와 같이 중복되는 할당을 추가하는 것입니다.
<script>
let numbers = [1, 2, 3, 4];
function addNumber() {
numbers=[...numbers, numbers.length + 1];
}
$: sum - numbers.reduce((t, n) => t + n, 0);
</script>
{numbers.join(' + ')} = {sum}
<button on:click={addnumber}>
add a number
></button>
지금까지의 설명에서 값은 주어진 컴포넌트 내에서만 접근 가능했습니다. 실제 애플리케이션에서는 한 컴포넌트에서 하위 컴포넌트로 데이터를 전달해야 합니다. 그렇게 하려면 일반적으로 props로 축약되는 속성을 선언해야 합니다. 스벨트는 다음과 같이 export 키워드로 이를 수행합니다.
App.svelte
<script>
import Nested from './Nested.svelte';
</script>
<Nested answer={42}/>
Nested.svelte
<script>
export let answer;
</script>
<p>The answer is {answer}</p>
HTML에는 조건문 및 루프와 같은 논리를 표현하는 방법이 없습니다. 마크업을 조건부로 렌더링하기 위해 if 블록으로 감쌉니다.
<script>
let user ={ loggedin: false };;
function toggle() {
user.loggin = !user.loggIn;
}
</script>
{#If user.loggIn}
<button on:click={toggle}>>
Log out
</button>
{/if}
{#If !user.loggIn}
<button on:click={toggle}>
Log in
</button>
{/if}
상호 배타적인 두 조건이 있을 경우 else 블록을 사용할 수 있습니다.
<script>
let user ={ loggedin: false };;
function toggle() {
user.loggin = !user.loggIn;
}
</script>
{#If user.loggIn}
<button on:click={toggle}>>
Log out
</button>
{/else}
<button on:click={toggle}>
Log in
</button>
{/if}
여러 조건일 경우 else if와 함께 연결할 수 있습니다.
<script>
let x=7;
</script>
{#if x > 10}
{x} is greater than 10
{:else if 5 > x}
{x} is less than 5
{:else}
{x} is between 5 and 10
{.if}
데이터 목록을 반복해야 하는 경우 each 블록을 사용합니다. 두 번째 인수로 현재 인덱스를 가져올 수 있습니다.
<script>
let cats= [
{ id: 'j---aiyznGQ', name: 'Keyboard Cat' },
{ id: 'z---AbfPXTKms', name: 'Maru' },
{ id: 'j---OUtn3pvWmpg', name: 'Henri The Existential Cat' },
스벨트는 3대 프론트엔드 프레임워크와 다른 방향성을 가지고 만들어진 프레임워크로 빠른 속도와 간결한 코드를 자랑하고 러닝 커브가 높지 않은 편입니다. 아직은 한창 성장하고 있는 기술이나 뛰어난 장점으로 인해 전세계적으로 큰 주목을 받고 있는 만큼 조만간 3대 프레임워크에 지각 변동을 일으키며 등극할 가능성도 충분하다고 생각합니다. 새로운 트렌드와 신기술에 관심이 많은 프론트엔드 개발자라면 스벨트를 익혀보고 신규 프로젝트에 적용해 보는 것을 권하는 바입니다.