Как стать автором
Обновить

Визуализация алгоритмов поиска пути на Svelte: Практические заметки

Уровень сложности Простой
Время на прочтение 2 мин
Количество просмотров 2.3K

Привет, Хабр! В этом посте делюсь опытом разработки на Svelte, демонстрируя это на моем пет-проекте.

Код проекта: GitHub
Лайв демо:
ivan-sem.com

1. Как реализована анимация сетки?

Анимация нодов
Анимация нодов

Анимация нодов осуществляется с использованием keyframes CSS анимации, вынесенной в отдельный класс:

@keyframes touch {
    0% {
        transform: scale(0.7);
    }
    35% {
        transform: scale(0.9);
    }
    100% {
        transform: scale(1);
    }
  }

  .inAnimation {
      animation: touch 0.5s ease-in-out;
  }

Каждый нод в сетке представлен div элементом с уникальным id. Для анимации нодов используется writable store из Svelte, animationQ:

<div
	id={node.key}
    ...
	class:inAnimation={$animationQ.has(node.key)}
/>

После завершения анимации ключ удаляется из очереди и удаляется класс, чтобы анимация могла быть вызвана еще раз.

const animateNode = (node) => {
      queueAnimation(node.id);

      node.addEventListener('animationend', () => removeFromAnimation(node.id), {
          once: true
      });

      node.addEventListener('animationcancel', () => removeFromAnimationQ(node.id), {
          once: true
      });
  };

2. Темная и светлая темы

Цвета проекта определены с помощью CSS переменных в layout.svelte и состояние темы вынесено в отдельный стор.

<script lang="ts">
	import { theme } from '$lib/stores/theme';
</script>

<div class:light={$theme === 'light'}>
	<slot />
</div>

<style>
	div {
		--main-white: #f0e8f4;
		--bg-body: #160f1d;
      	--bg-not-visited: #3b2d52;
        ...
    }

	.light {
		--bg-not-visited: var(--main-white);
	}
</style>

3. Как добавить Google Analytics?

Для интеграции Google Analytics, мета информация проекта и соответствующие скрипты размещаются в компоненте Head с использованием тега <svelte:head>.

<script lang="ts">
    // API ключ передается с помощью env переменной
	import { env } from '$env/dynamic/public';
	import { onMount } from 'svelte';

	onMount(() => {
        // Настройка гугл аналитики, по гайду из официальных доков
		window.dataLayer = window.dataLayer || [];

		function gtag() {
			dataLayer.push(arguments);
		}

		gtag('js', new Date());
		gtag('config', env.PUBLIC_GTAG_KEY);
	});
</script>

<svelte:head>
	<meta name="author" content="Ivan Semochkin" />
    ...
    {#if env.PUBLIC_GTAG_KEY}
  	    <script async src="https://www.googletagmanager.com/gtag/js?id={env.PUBLIC_GTAG_KEY}"></script>
    {/if}
</svelte:head>

4. Продакшн билд

Проект создан на основе SvelteKit. Для сборки продакшн версии используется команда npm run build. Запуск билда происходит через pm2:

pm2 start build/index.js

Конфигурация Nginx:

upstream sveltekit-server {
  server 127.0.0.1:3000;
  keepalive 8;
}

server {
  listen 80;
  server_name mydomain.com;

  root /home/deploy/frontend/build/client;

  location / {
    try_files $uri $uri/ @sveltekit;
  }

  location @sveltekit {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Sendfile-Type X-Accel-Redirect;

    proxy_pass http://sveltekit-server;
    proxy_redirect off;

    # error_page 502 = @static;
  }

  location ^~ /_app/immutable/ {
    # gzip_static on;
    expires max;
    add_header Cache-Control public;
    access_log off;
    try_files $uri $uri/ @sveltekit;
  }
}

Надеюсь, эти заметки окажутся полезными для тех, кто изучает Svelte. Если у вас есть вопросы по проекту, буду рад ответить в комментариях.

Теги:
Хабы:
+2
Комментарии 11
Комментарии Комментарии 11

Публикации

Истории

Работа

Ближайшие события