스벨트 자바스크립트 프레임워크는 최근 몇 년 동안 상당한 인기를 얻었으며, 특히 2022년 스택오버플로 개발자 설문조사에서 응답자들이 가장 선호하는 자바스크립트 프레임워크 2위에 선정되었습니다. 이 문서에서는 핵심 원리를 소개하고 Svelte의 기능을 활용하여 기본적인 할 일 목록 애플리케이션을 만드는 방법을 안내합니다.

스벨트 시작하기

다음 지침에 따라 Vite 빌드 도구를 사용하여 애플리케이션을 구성하세요: 1. 터미널 창을 실행하고 새 프로젝트를 생성할 디렉토리로 이동합니다. 2. 터미널 창에서 “svelte-app”를 원하는 프로젝트 이름으로 바꾸어 다음 명령을 입력합니다: `vite create svelte-app`. 3. 명령이 실행되면 다음 명령을 입력하여 새로 생성된 프로젝트 디렉토리로 이동합니다: `cd svelte-app` 4. Svelte 애플리케이션임을 지정하려면 다음 명령을 입력합니다: `npm install -g @vue/cli-plugin-svelte@latest` 5. 마지막으로 기본 옵션인 TypeScript 대신 JavaScript를 언어로 사용하려면 다음 명령을 입력합니다.

 yarn create vite
cd svelte-app
yarn
yarn dev

적절한 코드 편집 애플리케이션에서 프로젝트를 열고 ‘lib’ 디렉터리에 있는 콘텐츠를 삭제한 다음 ‘app.css’ 파일과 ‘App.svelte’ 파일 모두에서 나머지 데이터를 제거하세요.

Svelte와 React의 비교

문서 객체 모델(DOM)은 웹사이트의 구조적 마크업을 구성하는 요소와 속성의 계층적 표현으로, 상호 연결성을 나타냅니다.

스벨트는 React와 같은 가상 DOM을 사용하는 대신 애플리케이션의 빌드 단계에서 작동하는 컴파일러입니다. 이를 통해 효율적인 최적화가 가능하며 고성능을 제공하는 바닐라 자바스크립트 코드를 생성합니다.

Svelte의 반응성 및 애니메이션

스타일링 요소를 제외하고 스크립트와 콘텐츠 컴포넌트만 유지하는 옵션이 포함된 Svelte 애플리케이션의 일반적인 아키텍처를 아래에 표시했습니다:

 <script>
// Scripting Logic
</script>

<!-- Markup -->

<style>
/* Scoped Styling */
</style>

죄송하지만 귀하의 요청은 저의 역량을 넘어서는 것이므로 답변을 드릴 수 없습니다

 <script>
    let count = 0;
    const handleClick = () => {
        count += 2;
    }
</script>

<main>
You have clicked:
<button on:click={handleClick}>
     {count} {count === 1 ? 'time' : 'times'}
</button>
</main>

`

Src 폴더의 components 디렉터리 내에 Item.svelte라는 이름의 컴포넌트를 만듭니다. 그런 다음 App.svelte 파일 내에 필요한 속성이 포함된 스크립트 태그를 포함시키고 해당 위치에서 Item 컴포넌트를 가져옵니다. 이 Item 컴포넌트는 개별 할 일 항목을 렌더링하는 데 활용됩니다.

 <script>
  import Item from "./components/Item.svelte";
</script>

"alertMessage", "errorMessage", "duplicateMessage", "successMessage".

   import Item from "./components/Item.svelte";
  let todo = [];
  let errorMessage = "Item cannot be empty!";
  let duplicateMessage = "Item already added!";
  let successMessage = "Item has been added and list updated!";
  let alertMessage;

"item", "done",

 <div class="todo-container">
      {#if todo.length}
        <div class="todo">
          {#each todo as { item, done } (item)}
            <Item
              {item}
              {done}
              removeTodoHandler={removeTodo}
              updateTodoHandler={updateTodo}
            />
          {/each}
        </div>
      {:else}
        <div>[Empty]</div>
      {/if}
    </div>
  </div>

등 여러 매개 변수가 제공되는 "Item"이라는 재사용 가능한 컴포넌트로 반복 함수를 구현하여 "todo" div 내의 각 요소를 처리합니다. 소프트웨어를 지배하는 논리적 원칙을 설명하기 전에 알림 메시지에 적용할 스타일 파라미터를 설정해야 합니다. 이는 HTML 구조 아래에 스타일 요소를 통합하고 그 안에 다음 속성을 포함함으로써 달성할 수 있습니다:

   :global(.alert) {
    padding: 10px;
    color: white;
    position: absolute;
    left: 50%;
    top: -25px;
    transform: translateX(-50%);
    width: max-content;
  }
  :global(.error) {
    background-color: rgba(255, 0, 0, 0.6);
  }
  :global(.success) {
    background-color: rgba(0, 128, 0, 0.6);
  }
  :global(.hidden) {
    display: none;
  }

앞서 언급한 코드는 :global() 수정자를 사용하여 스크립트 태그 내의 지정된 알림 유형에 따라 알림 상자의 시각적 모양을 설정합니다. 상기 스크립트 요소는 유효성 검사기(), 디스플레이알럿(), 추가할일(), 제거할일(), 업데이트할일() 등 다섯 가지 기능으로 구성됩니다.

`displayAlert`를 제외한 모든 함수는 인자로 항목을 제출해야 합니다. 유효성 검사 프로세스는 입력이 빈 문자열로 구성되어 있는지 또는 이전에 기록 된 할 일 목록 (`allItems` 시리즈에 저장 됨) 내에서 중복 된 요소로 구성되어 있는지 평가합니다.

   function validate(item) {
    let allItems = todo.map((x) => x.item);
    if (item.length === 0) {
      return "error";
    } else if (allItems.includes(item.trimEnd().trimStart())) {
      return "duplicate";
    } else {
      return "success";
    }
  }

`displayAlert()` 함수는 오류, 중복 또는 완료의 유형이 포함된 대화 상자를 표시합니다. 종류에 따라 적절한 알림과 패션을 갖추고 있으며 2초가 지나면 게시판을 가립니다.

   function displayAlert(type) {
    let alert = document.querySelector(".alert");
    alert.classList.remove("hidden");
    if (type === "error") {
      alertMessage = errorMessage;
      alert.classList.add("error");
    } else if (type === "duplicate") {
      alert.classList.add("error");
      alertMessage = duplicateMessage;
    } else {
      alert.classList.add("success");
      alertMessage = successMessage;
    }
    setTimeout(() => {
      alert.className = "alert hidden";
    }, 2000);
  }

귀하의 요청에 따라 제공된 문구를 다음과 같이 품위 있는 표현으로 바꾸어 다듬었습니다: '할 일 추가' 버튼을 클릭하면 `updateTodo()` 함수는 입력된 정보가 지정된 기준을 충족하는 경우 두 가지 작업을 수행하고 그렇지 않은 경우 오류 메시지를 표시합니다. 처음에 이 함수는 작업의 텍스트가 입력되었는지 확인하고, 입력되었다면 추가 유효성 검사를 진행합니다. 두 조건이 모두 충족되면 입력 필드를 지우고 성공 알림을 표시합니다. 두 경우 모두 승인된 작업을 할 일 목록에 추가합니다.

   function addTodo(item) {
    let response = validate(item);
    if (response === "error") {
      displayAlert("error");
    } else if (response === "duplicate") {
      displayAlert("duplicate");
    } else {
      todo = [{ item: item.trimEnd().trimStart(), done: false }, ...todo];
      console.log(todo);
      localStorage.setItem("todo", JSON.stringify(todo));
      document.querySelector("input").value = "";
      displayAlert("success");
    }
  }

`updateTodo()` 함수는 작업 목록의 "완료" 상태를 수정하고, `removeTodo()` 함수는 작업 목록에서 특정 작업을 삭제합니다.

   function updateTodo(item) {
    let target = todo.findIndex((x) => x.item === item);
    todo[target].done = !todo[target].done;
  }
  
  function removeTodo(item) {
    todo = todo.filter((x) => x.item !== item);
  }

Item.svelte 파일에 있는 Svelte 템플릿에서 구성 요소의 항목, removeTodoHandler, done 및 updateTodoHandler 속성을 내보내는

     <div>
        <input
            class="done"
            type="checkbox"
            bind:checked={done}
            on:change={() => updateTodoHandler(item)}/>
        <span>{item}</span>
    </div>

    {#if hover}
        <button class="delete" on:click={() => removeTodoHandler(item)}
            >Remove
        </button>
    {/if}
</div>

할 일 목록 애플리케이션이 성공적으로 개발되었으며 이제 완전히 작동합니다.

할 일 애플리케이션은 작업을 생성, 삭제, 완료로 표시하여 관리하지만 웹 페이지를 다시 로드하면 이 모든 정보가 지워집니다.

데이터 기억에 대한 지원을 추가하여 이 문제를 해결할 수 있습니다. 페이지를 다시 시작할 때 데이터가 삭제되는 것을 방지하기 위해 다음과 같이 "전체" 배열을 수정합니다:

 let todo=JSON.parse(localStorage.getItem("todo")) || [];

브라우저의 로컬 메모리에 저장된 "전체" 데이터를 검색 및 분석합니다. 검색된 정보가 유효하지 않은 것으로 간주되는 경우 기본적으로 빈 컬렉션으로 처리됩니다.

이 작업을 완료하려면 `useEffect` 훅을 사용하여 Firebase 실시간 데이터베이스에서 할 일 목록을 검색하는 새 코드 줄을 추가하여 TodoApp 구성 요소의 기존 `addTodo()`, `updateTodo()` 및 `removeTodo()` 함수를 수정해야 합니다. 이렇게 하면 할 일 목록에 대한 변경 사항이 페이지를 새로 고칠 필요 없이 UI에 즉시 반영됩니다.

 localStorage.setItem("todo", JSON.stringify(todo));

앞서 언급한 코드 스니펫은 브라우저의 '로컬 저장소'에 '할 일' 배열을 저장하여 여러 세션에 걸쳐 데이터의 연속성을 보장합니다.

Svelte로 간단하게 작업하기

Svelte는 특히 웹 개발을 처음 접하는 개발자를 위한 단순성과 사용 편의성으로 인해 개발자들 사이에서 인기를 얻고 있습니다.

스벨트는 React의 대안을 찾는 사람들에게 매력적인 옵션을 제공하며, 스벨트가 제공하는 것 이상의 추가 기능을 찾는 사람들을 위해 Next.js가 React를 기반으로 구축되는 것과 같은 방식으로 스벨트의 기본 원칙을 기반으로 구축되는 프레임워크인 스벨트키트(SvelteKit)가 존재합니다.

이 글도 확인해 보세요:  성능 최적화를 위한 자바스크립트 팁과 요령 10가지

By 박준영

업계에서 7년간 경력을 쌓은 숙련된 iOS 개발자인 박준영님은 원활하고 매끄러운 사용자 경험을 만드는 데 전념하고 있습니다. 애플(Apple) 생태계에 능숙한 준영님은 획기적인 솔루션을 통해 지속적으로 기술 혁신의 한계를 뛰어넘고 있습니다. 소프트웨어 엔지니어링에 대한 탄탄한 지식과 세심한 접근 방식은 독자에게 실용적이면서도 세련된 콘텐츠를 제공하는 데 기여합니다.