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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет, Хабр! В этом посте делюсь опытом разработки на 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 переменных в app.css:

body {
	--main-white: #f0e8f4;
	--bg-body: #160f1d;
	--bg-interface: #22192b;
...
}

Изменение темы осуществляется добавлением или удалением класса .light к body. Тема контролируется через Svelte store:

body.light {
    ...
	--bg-not-visited: var(--main-white);
}

Подписка на theme store создается в +page в onMount ивенте:

onMount(() => {
  const themeSub = theme.subscribe((theme) => {
    	if (theme === 'light') {
			document.body.classList.remove('dark');
			document.body.classList.add('light');
      	} else {
			document.body.classList.remove('light');
			document.body.classList.add('dark');
		}

		return () => {
			themeSub();
		};
});

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. Если у вас есть вопросы по проекту, буду рад ответить в комментариях.

Источник: https://habr.com/ru/articles/789402/


Интересные статьи

Интересные статьи

Если в начале проекта вы не знаете, как и когда он закончится, а только можете перекреститься, если после встреч с заказчиками вы обнаруживаете себя плачущим в туалете, если лучшие сотрудники уходят о...
Привет, друзья! В этой статье я продолжаю (и заканчиваю) делиться с вами заметками о Docker. Заметки состоят из 4 частей: 2 теоретических и 2 практических. Если быть более конкретным: первая...
Все мы в какой-то степени подвержены Троянской угрозе сегодня. Любой девайс, который был куплен в ближайшем магазине под домом, может служить не только Вам, как потребите...
20 марта 2010 года началось извержение вулкана Эйяфьядлайёкюдль в Исландии. 14 июля 2015 года межпланетная станция New Horizons передала на Землю фотографии Плутона. 15 апреля 2019 го...
VK предоставляет очень неплохие инструменты для таргетирования рекламы, которые позволяют найти людей нужного пола, возраста, социального и семейного положения, подписанных на определенные группы...