Визуализация алгоритмов поиска пути на 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
:
После завершения анимации ключ удаляется из очереди и удаляется класс, чтобы анимация могла быть вызвана еще раз.
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
с использованием тега
.
...
{#if env.PUBLIC_GTAG_KEY}
{/if}
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. Если у вас есть вопросы по проекту, буду рад ответить в комментариях.