У вас закончился пробный период!
Для полного доступа к функционалу, пожалуйста, оплатите премиум подписку
Возраст канала
Создан
Язык
Русский
1.07%
Вовлеченность по реакциям средняя за неделю
10.25%
Вовлеченность по просмотрам средняя за неделю

Развернутые ответы на вопросы в чатах, мысли от рабочих процессов.

Вопросы - @artalar.

Сообщения Статистика
Репосты и цитирования
Сети публикаций
Сателлиты
Контакты
История
Топ категорий
Здесь будут отображены главные категории публикаций.
Топ упоминаний
Здесь будут отображены наиболее частые упоминания людей, организаций и мест.
AR
artalog
4 095 подписчиков
16
7
1.3 k
https://ispring-tech-event.timepad.ru/event/3332560/

Буду сегодня выступать! Трансляция есть, запись потом тоже будет.
26.04.2025, 12:31
t.me/artalog/1631 Ссылка
AR
artalog
4 095 подписчиков
29
49
1.7 k
Это случилось, реакт добавил новое апи Activity, которое в проде может ремаунтить ваши компоненты сохраняя их состояния. Это значит, что поведение StrictMode, которое многих бесило и его отключали, теперь из дева пришло в прод.

Что могу сказать. Концепция - отличная! Это очень хорошая оптимизация перфа SPA - вместо того что бы полностью ремаунтить страницы при навигации, просто скрывать не актуальные. Это значительно(!) улучшает UX и из-за уменьшения лага, и из-за сохранения состояния, т.е. в некоторых случаях избежания избыточных (повторных) лоадеров.

Но есть у этого подхода чисто реактовская проблема. Для нормального управления лайфсайклом состояния (в общем смысле) нам необходимы методы его синхронного создания при первом рендере и уничтожения при настоящем анмаунте, а не временном. А этих апи нет. Описывал пример проблемы тут: https://t.me/artalog/1291
24.04.2025, 14:51
t.me/artalog/1630 Ссылка
AR
artalog
4 095 подписчиков
155
76
2.0 k
Встречаются два спикера на конференции
- Как использовать FSD?
- Могу рассказать.
- Рассказать я и сам могу, а как использовать??

Простите...
22.04.2025, 05:20
t.me/artalog/1629 Ссылка
AR
artalog
4 095 подписчиков
13
15
1.7 k
True vibe coding

Стек: Roo, openrouter, Sonet для Architect и Boomerang, Flash для Code.
22.04.2025, 00:13
t.me/artalog/1628 Ссылка
AR
artalog
4 095 подписчиков
17
1.7 k
AMA vibe coding
21.04.2025, 23:21
t.me/artalog/1626 Ссылка
AR
artalog
4 095 подписчиков
18
5
1.8 k
Пробуйте, оставляйте фидбек!

Уточню, ссылка на ютуб: https://www.youtube.com/watch?v=WYHC4bT2E-4

База с 02:50 до 06:40.

А если хочется чего-то поинтересней, вот как делается простое расширение для персиста, которое можно потом использовать на любом атоме:

const withLocalStorage =
(key?: string): GenericExt =>
(target) =>
target.extend(
withInit((state) => {
let snapshot = localStorage.getItem(key ?? target.name)
return snapshot ? JSON.parse(snapshot) : state
}),
withChangeHook((state) => {
localStorage.setItem(key ?? target.name, JSON.stringify(state))
}),
)

const search = atom('', 'search').extend(withLocalStorage())
const page = atom(0, 'page').extend(withLocalStorage())
21.04.2025, 13:51
t.me/artalog/1624 Ссылка
AR
artalog
4 095 подписчиков
80
57
1.9 k
Reatom@1000

Друзья, вариантов больше нет, вопрос стейт менеджмента закрыт раз и навсегда, я серьезно!

Приглашаю всех к тестированию новой альфа версии реатома ❤️

npm i @reatom/core@alpha @reatom/react@alpha

Это стейт менеджер для всех! Просто начать! Надежно и безопасно развивать код до небывалых масштабов. Все быстро, продумано, типобезопасно, LLM френдли и так далее и так далее🤠

https://www.youtube.com/watch?v=WYHC4bT2E-4

02:50 смотрим новое апи
06:40 реалистичный пример
09:50 wrap из tc39/proposal-async-context и проблема SSR
18:28 проблемы императивного кода
23:44 экосистема и .extend

- попробовать пример в репле
- код примера
- документаия (сайт в разработке)
- быстрый старт для LLM
- дока для react пакета
- почему ТЫСЯЧА

Лайк, шер, репост!
21.04.2025, 02:57
t.me/artalog/1623 Ссылка
AR
artalog
4 095 подписчиков
25
6
1.2 k
17.04.2025, 16:22
t.me/artalog/1622 Ссылка
AR
artalog
4 095 подписчиков
64
36
1.5 k
Вот уже пару дней как я работаю на новом Apple MacBook Air 15' M4 24GB Sky Blue и как же это хорошо...

Все эти виндусы и линуксы намного менее предсказуемые. Железо и софт могут работать на 95% хорошо, но только мак дает "99% хорошо", и эта небольшая разница в фактических цифрах, которая включает общее качество подгонки всего и возможный оверхед на ручное обсуживание каких-то недоработок, в эмоциональном плане ощущается не как пятипроцентная разница, а 2-3 кратная разница.

Причем, если у вас нет задач постоянно что-то комплилить или держать локально мощные ЛЛМ, я очень рекомендую именно air. У него и цена безальтернативная, и мощность на грани возможного, и опыт использования более мягкий, как бы, потому что тротлинг тут, в крайнем случае, не скачкообразный а более плавный. Напомню, у air вовсе нет кулера, что делает его абсолютно тихим всегда, и лично я другими лептопами без этой фичи (т.е. всеми) пользуюсь с неприязнью.

Я понимаю людей которым больше подходит вин или линь, но если вы сомневаетесь - эир безальтернативный компьютер.
17.04.2025, 15:34
t.me/artalog/1621 Ссылка
AR
artalog
4 095 подписчиков
1
Вот уже пару дней как я работаю на новом Apple MacBook Air 15' M4 24GB Sky Blue и как же это хорошо...

Все эти виндусы и линуксы намного менее предсказуемые. Железо и софт могут работать на 95% хорошо, но только мак дает "99% хорошо", и эта небольшая разница в фактических цифрах, которая включает общее качество подгонки всего и возможный оверхед на ручное обсуживание каких-то недоработок, в эмоциональном плане ощущается не как пятипроцентная разница, а 2-3 кратная разница.

Причем, если у вас нет задач постоянно что-то комплилить или держать локально мощные ЛЛМ, я очень рекомендую именно air. У него и цена безальтернативная, и мощность на грани возможного, и опыт использования более мягкий, как бы, потому что тротлинг тут, в крайнем случае, не скачкообразный а более плавный. Напомню, у air вовсе нет кулера, что делает его абсолютно тихим всегда, и лично я другими лептопами без этой фичи (т.е. всеми) пользуюсь с неприязнью.

Я понимаю людей которым больше подходит вин или линь, но если вы сомневаетесь - эир безальтернативный компьютер.
17.04.2025, 15:34
t.me/artalog/1620 Ссылка
AR
artalog
4 095 подписчиков
Репост
11
22
1.3 k
Составил список открытых пропоузалов TC39 и соответствующих подходов в Effect — как по мне впечатляет. Особенно первый пункт:

Async ContextR-channel & Context.Reference
TS throws annotationE-channel & expected errors
Record & TupleData module
CompositeEqual trait
Async Iterator helpersStream
Explicit Resource ManagementScope
pipeline operatorpipe function
do-notationEffect.Do | Effect.gen

Но более того — имплементация в Effect гораздо более композабельная и типобезопасная.
16.04.2025, 02:35
t.me/artalog/1619 Ссылка
AR
artalog
4 095 подписчиков
33
18
1.5 k
Я тут постарался запилить реально сложный, а точнее разнообразный бенч динамических переподписок. Он проверяет 6 разных паттернов изменения порядка зависимостей реактивного компьютеда. Результаты (больше - лучше, т.е. 100% - эталон):

MEDIAN for 128,64,64,32,32,32,16,16,16,16,8,8,8,8,8,8,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 subscribers

25% Reatom
40% mobx
42% $mol_wire
66% act
98% alien

https://github.com/reatom/reatom/blob/v1000/packages/core/bench_dynamic.ts#L749

Что, зачем я написал бенч, в котором моя либа на самом дне?)) Потому что объективность и совместная работа намного дороже личных побед ❤️

alien-signals - действительно сделали прорыв в перфе и это круто! Такие библиотеки и их авторы двигают всю нашу экосистему.

Хотя, свое решение я все же позащищаю. Что тормозит в реатоме? Строго говоря все. Он весь пропитан дополнительными фичами, которые его замедляют:

- система расширений
- виртуализация (контекст для тестов и ssr)
- иммутабельность для асинхронного контекста (отменить нельзя продолжить)

Все это уникальные фичи, которые открывают новые границы разработки. Очень важно понимать, что добавляя эти фичи не в монолит библиотеки, а дополнительными интерфейсами по необходимости мы дропнете перф эталона не в 4 раза (случай реатома), а в 10-20 раз.

И это не самое худшее, перф - вторичен, особенно при использовании любых сигнальных библиотек (сама архитектура с ними уже производительна).

Самая главная проблема без реатома - в зависимости от необходимости той или иной фичи - вам нужно будет переписывать или как-то еще рефаторить большую часть кода. Реатом же предоставляет единый контракт для ВСЕХ возможных фич, что радикально снижает ментальную нагрузку при игре в долгую 😎

P.S. любой бенч можно повернуть в нужную сторону, если захотеть :D
MEDIAN for 1024 subscribers
40% alien
51% mobx
57% Reatom
58% act
90% $mol_wire
13.04.2025, 02:17
t.me/artalog/1618 Ссылка
AR
artalog
4 095 подписчиков
25
10
1.2 k
В react-router-typed-object добавлена поддержка типизированных хуков для отдельных роутов!

Напомню, в отличии от тенстак роутера и рр7, эта библиотека намного легче и не заставляет вас запускать сервис кодогенерации или придумывать особенное АПИ для типизированных роутов. Эта либа выводит все нужные типы сама из обычного конфига рр!

У меня на проекте файл с конфигом роутов в 2к строк, ниче не лагает :)
11.04.2025, 13:53
t.me/artalog/1617 Ссылка
AR
artalog
4 095 подписчиков
12
1.4 k
10.04.2025, 18:04
t.me/artalog/1616 Ссылка
AR
artalog
4 095 подписчиков
22
12
1.5 k
Качественные библиотеки делать очень сложно. Но и очень интересно 😊

UPD: получить поддержку вывода типов через // ^? можно в vscode через https://marketplace.visualstudio.com/items?itemName=Orta.vscode-twoslash-queries
10.04.2025, 18:04
t.me/artalog/1615 Ссылка
AR
artalog
4 095 подписчиков
29
1
1.5 k
Забыл объявить победителя. Им, конечно, стал @lekzd с https://t.me/korotaev_to_hard/105 спасибо!

Еще из новостей, Reatom переехал в свою организацию на гитхабе https://github.com/reatom/reatom !

Скоро будет очень большой анонс 😉
9.04.2025, 16:18
t.me/artalog/1614 Ссылка
AR
artalog
4 095 подписчиков
24
21
1.4 k
Однако для JS движка создать новый массив нередко быстрее, чем поменять существующий, так как в существующем уже накоплена информация о типах элементов и это может приводить к дополнительным проверкам и действиям, спаливать выполнение в медленные пути.

Но проблема не только в этом, а в том что меняется свойство length. Даже если массив будет изначально пустой (если задать size = 0 в тесте), разница все равно будет существенной (на моей машине Length в 10 раз медленее для size = 0). Это говорит о том, что скорей всего установка значения свойству length не оптимизируется, так как считается редким кейсом (в действительности это редко применяется). Если поиграться с опцией --max-opt для Nodejs, то можно заметить, что при отключении оптимизирующих компиляторов (--max-opt=1) время для Immutable вырастает в разы, а вот для Length на несколько десятков процентов – что поддерживает гипотезу.

Что интересно, если поменять другое свойство у массива, то есть не length, а скажем array[j].foo = 1 – то время тратится существо меньше.

В современных движках, часто результаты зависят не от того насколько одно быстрее другого с точки зрения логики, а насколько одно или другое хорошо оптимизируется движком – оптимизируют в основном частые патерны.
2.04.2025, 21:20
t.me/artalog/1613 Ссылка
AR
artalog
4 095 подписчиков
8
22
1.2 k
Вот так и рождаются мифы о том как работают JS движки 🙂

> array.length = 0 не просто удаляет элементы, а изменяет capacity массива, т.е. дефрагментирует выделенный под него кусок памяти. Важно, что происходит это синхронно, т.к. ссылка на массив меняться не должна и сразу для всего пользовательского кода должна выдавать новый вариант массива.

Начнем с того, что выделенные фрагменты памяти не дефрагментируются, максимум помечаются как более не используемые, но и этого не делается. Так "используемость" определяется по наличию ссылок на фрагмент, в зону отвественности объекта (массив тоже объект) входит только задача убрать ссылки. Признание фрагмента неиспользуемым (мертвым) - это задача GC, который проверяет количество ссылок на объект (фрагмент памяти).

Дефрагментация про другое – это процесс переукладки используемых фрагментов памяти более компактно, обычно в начало спейса, так чтобы свободная часть была представлена одним фрагментом. Процесс не применяет к объектам точечно, но применяется к области памяти (спейсу). В V8 этот процесс называется compat и является частью Major GC, одним из финальных его этапов. Так как процесс недешевый (нужно не только перенести много памяти с одного места в другое, но и обновить все ссылки, то есть прописать новые адреса), то он выполняется не на каждый Major GC, а только когда в этом действительно есть необходимость. При этом, "дефрагментация" осуществляется не для всех спейсов, в основном для старого поколения, и для некоторых других (например, large object space). Для молодого поколения необходимости в дефрагментации нет, так как когда заканчивается память в этом спейсе, то срабатывает Minor GC – из него эвакуируются выжившие объекты (переносятся во вторую молодую или в старую), а сам спейс зачищается и начинает наполняться заново, объектами которые создаются.

Массив это не монолит - он представляет из себя несколько объектов. "Входной точкой" является объект JS Array (типичный JS объект), под капотом опционально elements (массив значений фиксированной длины - fixed array) и другие объекты (например, для хранения собственных свойств, когда делается array.foo = 1). У массива действительно есть capacity, а именно свойство хранящее число используемых слотов в elements, так как elements может быть больше чем используется (обычно выделяется с запасом, чтобы не пересоздавать elements на каждый добавляемый элемент). Если размера не хватает, то создается новый fixed array большей длины, поле elements меняется на него - со старого ссылка снимается и он может быть собран GC. Таким образом, при изменении длины массива (в том числе через length), движку не нужно обновлять ссылки на массив, так как другие объекты ссылаются на JS Array, а его адрес сохраняется (адрес меняется только при миграции между спейсами и при "дефрагментации"). Свойство elements является внутренним, и к нему нет доступа из JS.

В V8 случай array.length = 0 обычно обрабатывается отдельно, в этом случае создается пустой elements (https://github.com/v8/v8/blob/2ff8d15b64f4840a1987b005fddaadb7b6fb87ae/src/objects/elements.cc#L1578). Почему "обычно", потому что в V8 (и других движках) есть множество внутренних типов для elements (по сути самого массива), в зависимости от того какие в нем хранятся значения и есть ли "дырки" (типы: https://github.com/v8/v8/blob/2ff8d15b64f4840a1987b005fddaadb7b6fb87ae/src/objects/elements-kind.h#L105). От типа elements зависит внутреняя логика и, в частности, применяемые оптимизации. Так массив чисел и массив объектов могут иметь совсем разные профили.

> А при array = [] старый массив может быть обработан сборщиком мусора асинхронно, а может даже и параллельно.

С точки зрения механики управления памятью (в плане сборки мусора, ее синхронности и т.д.), в обоих случаях разницы не будет. Разве что при создании нового массива будет создавать больше объектов (новые JS Array), которые позже могут эвакуироваться из молодой памяти – поэтому GC будет немного медленней, но в данном случае незначительно так как сами объекты крохотные.
2.04.2025, 21:20
t.me/artalog/1612 Ссылка
AR
artalog
4 095 подписчиков
1
5
1.3 k
Прожарили https://t.me/artalog/1604 :)
Спасибо @gorshochekvarit!
2.04.2025, 21:20
t.me/artalog/1611 Ссылка
AR
artalog
4 095 подписчиков
1.4 k
2.04.2025, 18:50
t.me/artalog/1610 Ссылка
AR
artalog
4 095 подписчиков
13
1.4 k
Вангую "скин" для переносного ЛЛМ в виде волейбольного мяча.
2.04.2025, 18:50
t.me/artalog/1609 Ссылка
AR
artalog
4 095 подписчиков
13
20
1.5 k
В докладе я упоминал про "пять виртуальных очередей", помимо тасков и микротасков, и в комментариях люди начали этим интересоваться. Рассказываю.

Пять самых явных описаны в 8.1.7.4 Generic task sources. Хотя, скорее всего, их больше.

Самое главное в этом то что приоритет обработки разных task source в спецификации не описан, а остается на усмотрение UA (User Agent, т.е. среда выполнения, т.е. браузер).

Накидал простенькие тесты для наглядности: https://stackblitz.com/edit/task-sources-test?file=index.html
2.04.2025, 13:40
t.me/artalog/1608 Ссылка
AR
artalog
4 095 подписчиков
46
7
1.5 k
Следующая версия реатома практически готова и это будет самая простая и самая эффективная (фичастая) библиотека для работы с сотсояниями и эффектами.

И это НЕ шутка на первое апреля 🙂
1.04.2025, 13:10
t.me/artalog/1605 Ссылка
AR
artalog
4 095 подписчиков
7
1.5 k
1.04.2025, 13:10
t.me/artalog/1606 Ссылка
AR
artalog
4 095 подписчиков
7
1.5 k
1.04.2025, 13:10
t.me/artalog/1607 Ссылка
AR
artalog
4 095 подписчиков
55
35
1.7 k
Как быстрее очистить массив, обнулив его или пересоздав? Например, queue.length = 0 или queue = []?

Спасибо @cevek, он предоставил тесты и их объяснение:

array.length = 0 не просто удаляет элементы, а изменяет capacity массива, т.е. дефрагментирует выделенный под него кусок памяти. Важно, что происходит это синхронно, т.к. ссылка на массив меняться не должна и сразу для всего пользовательского кода должна выдавать новый вариант массива. А при array = [] старый массив может быть обработан сборщиком мусора асинхронно, а может даже и параллельно.

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

Иначе говоря, пересоздание массива быстрее сразу по паре причин, да и в своем коде с этим удобнее и безопаснее работать.

setTimeout(() => main(true))
setTimeout(() => main(false))

function main(immutable) {
const size = 1e5;
const arr = Array.from({ length: size }, () => ({}));
const time = [];
const gctime = [];
global.gc();
for (let i = 0; i < 20; i++) {
const arrs = [];
for (let j = 0; j < 1000; j++) {
arrs.push(arr.slice());
}
const start = process.hrtime.bigint();
for (let j = 0; j < arrs.length; j++) {
if (immutable) arrs[j] = [];
else arrs[j].length = 0;

}
const end = process.hrtime.bigint();
time.push(Number(end - start) / arrs.length);
global.gc();
gctime.push(Number(process.hrtime.bigint() - end) / arrs.length);
}
console.log(immutable ? 'Immutable' : 'Length');
console.log('script:',Math.min(...time));
console.log('gc:', Math.min(...gctime));
}

> node --expose-gc test.js
Immutable
script: 20.2
gc: 28870.873
Length
script: 522.224
gc: 28798.743
31.03.2025, 17:23
t.me/artalog/1604 Ссылка
AR
artalog
4 095 подписчиков
35
28
1.6 k
Опчк, опубликовали 🤩
https://youtu.be/evt4KVG8BbQ
31.03.2025, 15:19
t.me/artalog/1603 Ссылка
Результаты поиска ограничены до 100 публикаций.
Некоторые возможности доступны только премиум пользователям.
Необходимо оплатить подписку, чтобы пользоваться этим функционалом.
Фильтр
Тип публикаций
Хронология похожих публикаций:
Сначала новые
Похожие публикации не найдены
Сообщения
Найти похожие аватары
Каналы 0
Высокий
Название
Подписчики
По вашему запросу ничего не подошло