169 похожих чатов

⚠️ Опасность сторов Сложная тема про использование сторов на сервере простым

языком + решение


💁‍♂️ Как это бывает
Порой вам нужно передать уникальные данные между несколькими страницами или компонентами.

Первое, что приходит в голову — использовать стор. Через него легко передавать данные, а подписка позволяет синхронизировать состояние и реагировать на изменения.


🤔 В чём опасность?
- Вы создаёте стор в js файле и импортируете его там, где необходимо.

- Что-то мутирует стор. Это вызывает обновление данных везде, где вы его используете.

—  Мы часто так делаем на клиенте и пока всё в порядке. Но что если вам нужно передать данные на сервере?

Вы захотели поменять лэйаут страниц для авторизированного посетителя:

- Импортируете стор в load функцию и в экшн авторизации;

- Авторизируте посетителя;

- Отмечаете новое состояние в сторе;

- Load функция реагирует на изменения и выводит лэйаут авторизированного посетителя;

— Поздравляю, вы только что показали всем посетителям, что они авторизированны!

🎉🎉🎉


😳 Стоп, а что произошло?
Экспортируя стор из js файла вы создаёте ESM модуль. ESM модуль — синглтон. То есть он импортируется один раз и используется везде, где вы его импортируете.

→ подробнее на русском

Таким образом данные шарятся между компонентами. А использование подписок позволяет реагировать на изменения.


👀 Ну и что?
SvelteKit на сервере — это один процесс. Он обрабатывает запросы от всех посетителей и хранит своё состояние пока вы его не перезапустите.

Стор для всех запросов от посетителей будет использоваться один и тот же

Когда вы поменяете состояние стора для одного посетителя — оно сменится у всех.

🌚🌚🌚


✅ Как правильно передать состояние?
Для этого в серверных функциях вам доступен параметр locals. В него можно записать данные.

→ см. пример использования

Используйте его в load функции и передавайте данные дальше в компоненты через data-параметры.

А поскольку параметр locals используется в load функции, его изменения вызовут инвалидацию данных, что перезапустит load функцию и передаст новые данные странице.


——————

👉 Пример использования
Я написал простой пример использования стора и параметра locals для синхронизации состояния.

→ см. на stackblitz

Откройте одновременно несколько вкладок с приложением и посмотрите как по разному работают эти способы:

👎 Стор синхронизируется между вкладками после их перезагрузки и сохранит своё состояние.

Этого быть не должно, так как каждая вкладка — это изолированное окружение.

→ Чтобы сбросить состояние используйте reset или перезапустите приложение в консоли.

🤟 Параметр locals отобразится только в одной вкладке, а после презагрузки вкладки — обнулится. Это ожидаемое поведение.

Таким образом другие посетители не увидят смены состояния приложения.


#svelte #svelte_stores #svelte_gudes

7 ответов

24 просмотра

да со сторами беда... но без них никуда

тут к слову есть нюанс - рендринг проходит атомарно так что если вы вначале рендрингда перезаписываете сторы то всё будет хорошо

Misha-Rodshtein Автор вопроса
stalkerg
тут к слову есть нюанс - рендринг проходит атомарн...

Это достаточно искусственный пример, никто так не делает авторизацию. Лучше не придумал как просто показать ошибку использования сторов.

Misha Rodshtein
Это достаточно искусственный пример, никто так не ...

Может у locals есть какие-то другие преимущества по сравнению со сторами? Кэширование, например? Замечено, что если в load записывать в стор и устанавливать хедер stale-while-revalidate - ничего не происходит. Может с locals оно начнет работать

Misha Rodshtein
Это достаточно искусственный пример, никто так не ...

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

Misha-Rodshtein Автор вопроса
Danil T
Может у locals есть какие-то другие преимущества п...

Кэширование устанавливается заголовком cache-control через setHeaders: load({ setHeaders }) { setHeaders({ age: […], 'cache-control': […] }); } → см. тут про кеширование

О, классика (с next.js та же проблема), реатом решает это тем что все атомы работают исключительно в выделенном контексте, который нужно в руте засетапить еще.

Похожие вопросы

Обсуждают сегодня

Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Всем привет!) я тут новенький и пытаюсь освоить evolution методом тыка. У меня при переходе между папками файлов выскакивают вот такие уведомления Можете подсказать как их от...
Диман Samoed
10
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Карта сайта