Когда я приступал к статье, у меня было смутное воспоминание что в приватном режиме сафари localStorage отключен, но к счастью эту фичу убрали еще в сафари 11
Кейс с явным полным отключением localStorage точно нишевый уровня "пользователь отключил js" и покрывается фолбеком аналогично SSR (единственное отличие — в firefox при этом localStorage === null, а не is not defined)
Зависит от кейса, но по дефолту скорее нет чем да — там замороченное (и довольно мерзкое) асинхронное апи + технология менее популярная. Для offline-first приложения попробовать стоит, для настроек / баннеров / кеша лучше не надо.
Миграцией я все таки называю преобразование старых форматов в свежий с сохранением данных (возможно, формально я не прав). Так я один раз упарывался, не понравилось, тк нарастает большая борода конвертаций которые умеют кушать все-все исторические форматы.
Раз мы всегда умеем работать с кейсом "в сторадже пусто", то проще свести кейс "кривые данные" к нему небольшой валидацией. Если это попадает в ваш концепт миграции, то можем называть это так =)
Если подойти к вопросу серьезно, то дело уже попахивает миграциями. Но я все таки пришел к выводу что если состояние стораджа нельзя безболезненно выкинуть и пересоздать заново, то в 95% кейсов мы выбрали неправильный инструмент (за исключением всякой offline-first экзотики)
Пока никак =) На слое данных это не проблема, в arquero есть полный комплект джойнов, но много интерфейсной работы (переключение таблиц, мульти-табличные пайплайны и всё такое). Задача в топе на развитие.
В спецификации со времён ES6 есть специальное поручение (12.14.4.1.e.iii) в такой ситуации доставать name функции из имени переменной (и из многих других мест, ищется по SetFunctionName).
И это легко проверить
А в минифицированном коде имена и функций, и переменных, обфусцируются и ориентироваться в любом случае придется по line:column
Предпочитать любые библиотеки по любому критерию, разумеется, базовое право каждого человека.
Мне второй раз предъявляют за map, но мне нравится это название — отображение же! (возможно, конформные отображения сломали мне мозг) В голом JS под map подразумевается не только то, что вы подумали, но еще и ассоциативный массив Map. В TS есть mapped types, который совсем не про массивы. В rx есть map, и ничего, как-то живут. В общем, если подойти достаточно абстрактно, всё есть map)
size-limit конечно лучше чем жать голый UMD, но мы всё ещё измеряем один бандл, а не разницу с пустым приложением, так что EOCD и непрогретый gzip остаются. К тому же завязка на вебпак, который инжектит свой рантайм — я что-то уже не хочу к нему приближаться вообще
А я честно скажу, что сделал проект вдогонку к BanditStash — библиотеке для работы с localStorage. Для кейса "проверить, не битые ли данные в сторадже" детальной ошибки не нужно, просто игнорируй битые данные. Для валидации форм или (тем более) параметров АПИ, конечно, нужна библиотека с нормальным фидбеком. Каждой проблеме — своё решение.
Тип literal удалил из двух соображений — во-первых, на практике редко подходит только одно значение (зачем его вообще хранить)? Во-вторых, всегда можно создать пользовательский тип literal = <T extends string>(v: T) => enums([v]);
На бенчмарках banditypes — одна из самых быстрых библиотек без кодогенерации, так что аргумент про оптимизатор не принимается) К тому же валидация — вряд ли невероятно горячий код, так что по перформансу я не заморачивался.
Это правда комплимент, обычно переводы на Хабре пишут программисты и получается не очень связно) обидно, что при переводе потеряли мою великолепную блок-схему и нашли "мягкие навыки"
В общем я, как обычно, напомню что нельзя публиковать чужие статьи без разрешения. Хотя у вас получилось гораздо лучше чем обычно, вижу тут работу человека с писательскими задатками
Когда я приступал к статье, у меня было смутное воспоминание что в приватном режиме сафари localStorage отключен, но к счастью эту фичу убрали еще в сафари 11
Кейс с явным полным отключением localStorage точно нишевый уровня "пользователь отключил js" и покрывается фолбеком аналогично SSR (единственное отличие — в firefox при этом localStorage === null, а не is not defined)
Спасибо, хороший пойнт!
Вряд ли стоит об этом сильно переживать, там очень хорошая поддержка https://caniuse.com/?search=localstorage
Зависит от кейса, но по дефолту скорее нет чем да — там замороченное (и довольно мерзкое) асинхронное апи + технология менее популярная. Для offline-first приложения попробовать стоит, для настроек / баннеров / кеша лучше не надо.
Миграцией я все таки называю преобразование старых форматов в свежий с сохранением данных (возможно, формально я не прав). Так я один раз упарывался, не понравилось, тк нарастает большая борода конвертаций которые умеют кушать все-все исторические форматы.
Раз мы всегда умеем работать с кейсом "в сторадже пусто", то проще свести кейс "кривые данные" к нему небольшой валидацией. Если это попадает в ваш концепт миграции, то можем называть это так =)
Если подойти к вопросу серьезно, то дело уже попахивает миграциями. Но я все таки пришел к выводу что если состояние стораджа нельзя безболезненно выкинуть и пересоздать заново, то в 95% кейсов мы выбрали неправильный инструмент (за исключением всякой offline-first экзотики)
Ну или хотя бы среднего и полезного) Спасибо!
Хмм, на самом деле не думал про BI системы для этой задачи! Тогда сегментируемся так, hippotable:
Просто использовать: просто открываешь файл и работаешь, не надо плясать с подключениями, датасетами, чартами.
Работает действительно быстро из-за отсутствия клиент-серверности.
Простой деплой on-premises.
Почти неограниченная нагрузка с низкими операционными костами (S3 по цене грязи).
При этом:
Ограниченный размер датасета
Меньше источников данных и интеграций
Интерактивности маловато, на датасете in-memory размера хочется поиграться с параметрами и чтобы таблица менялась в реальном времени.
Спасибо за отзыв! С локальным запуском мой косяк, имелся в виду
npm ci
(без run) — обновил ридми.Спасибо за багрепорт, исправил! Думаю, перед дальнейшим развитием хорошо бы намазать тестов =)
DuckDB мотивирует SQL-синтаксисом или чем-то еще?
Пока никак =) На слое данных это не проблема, в arquero есть полный комплект джойнов, но много интерфейсной работы (переключение таблиц, мульти-табличные пайплайны и всё такое). Задача в топе на развитие.
В спецификации со времён ES6 есть специальное поручение (12.14.4.1.e.iii) в такой ситуации доставать
name
функции из имени переменной (и из многих других мест, ищется поSetFunctionName
).И это легко проверить
А в минифицированном коде имена и функций, и переменных, обфусцируются и ориентироваться в любом случае придется по
line:column
Предпочитать любые библиотеки по любому критерию, разумеется, базовое право каждого человека.
Я обдумаю это предложение, спасибо)
> Там в
preset-small-lib
используетсяesbuild
Благая весть! Вот я дед
Спасибо!
Мне второй раз предъявляют за
map
, но мне нравится это название — отображение же! (возможно, конформные отображения сломали мне мозг) В голом JS под map подразумевается не только то, что вы подумали, но еще и ассоциативный массивMap
. В TS есть mapped types, который совсем не про массивы. В rx есть map, и ничего, как-то живут. В общем, если подойти достаточно абстрактно, всё есть map)size-limit конечно лучше чем жать голый UMD, но мы всё ещё измеряем один бандл, а не разницу с пустым приложением, так что EOCD и непрогретый gzip остаются. К тому же завязка на вебпак, который инжектит свой рантайм — я что-то уже не хочу к нему приближаться вообще
Я ждал этого комментария) "Просто валидация" — растяжимое понятие, хотел дополнительно уточнить что речь не о валидации форм
А я честно скажу, что сделал проект вдогонку к BanditStash — библиотеке для работы с localStorage. Для кейса "проверить, не битые ли данные в сторадже" детальной ошибки не нужно, просто игнорируй битые данные. Для валидации форм или (тем более) параметров АПИ, конечно, нужна библиотека с нормальным фидбеком. Каждой проблеме — своё решение.
Тип literal удалил из двух соображений — во-первых, на практике редко подходит только одно значение (зачем его вообще хранить)? Во-вторых, всегда можно создать пользовательский тип
literal = <T extends string>(v: T) => enums([v]);
На бенчмарках banditypes — одна из самых быстрых библиотек без кодогенерации, так что аргумент про оптимизатор не принимается) К тому же валидация — вряд ли невероятно горячий код, так что по перформансу я не заморачивался.
О чем бы это могло говорить?
Это правда комплимент, обычно переводы на Хабре пишут программисты и получается не очень связно) обидно, что при переводе потеряли мою великолепную блок-схему и нашли "мягкие навыки"
В общем я, как обычно, напомню что нельзя публиковать чужие статьи без разрешения. Хотя у вас получилось гораздо лучше чем обычно, вижу тут работу человека с писательскими задатками
Плохо, что знания алгоритмов-и-структур-данных обычно коррелируют с техническим образованием, и вроде спрашивать об этом ещё раз необязательно.
Коррелирует ли техническое образование со способностью программировать — вопрос открытый ?