Как стать автором
Обновить

Комментарии 15

Как "спортивный" проект для уменьшения размера — выглядит очень неплохо. Жалко только, что достигается это ухудшением developer experience:

Хорошие библиотеки валидации возвращают ошибки с приятным сообщением(...). От этой чудесной фичи я сразу же отказался.

Зачем нужен тип literal(42), если enums([42]) делает то же самое?

Зачем делать throw new TypeError('Invalid Banditype'), если можно просто вызвать строку, 'bad banditype'(), и ошибка всё равно вылетит?

И, потенциально, за счет ухудшения возможностей для оптимизатора:

Трюк, которым я горжусь: вместо серии raw => typeof raw === 'string' ? raw : fail() я придумал тип like = tag => raw => typeof raw === typeof tag ? raw : fail().

А я честно скажу, что сделал проект вдогонку к BanditStash — библиотеке для работы с localStorage. Для кейса "проверить, не битые ли данные в сторадже" детальной ошибки не нужно, просто игнорируй битые данные. Для валидации форм или (тем более) параметров АПИ, конечно, нужна библиотека с нормальным фидбеком. Каждой проблеме — своё решение.

Тип literal удалил из двух соображений — во-первых, на практике редко подходит только одно значение (зачем его вообще хранить)? Во-вторых, всегда можно создать пользовательский тип literal = <T extends string>(v: T) => enums([v]);

На бенчмарках banditypes — одна из самых быстрых библиотек без кодогенерации, так что аргумент про оптимизатор не принимается) К тому же валидация — вряд ли невероятно горячий код, так что по перформансу я не заморачивался.

Разумно. Для заявленной задачи - хорошее решение.

Вы недооцениваете оптимизатор ;) В like() уйдет константа, а значит typeof tag тоже станет константой. Оптимизатор легко с таким справляется.

НЛО прилетело и опубликовало эту надпись здесь

Круто! Мне нравятся маленькие библиотеки. Но map это плохое название для метода. Не то, что в js под map подразумевается.

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

https://github.com/ai/size-limit

Спасибо!

Мне второй раз предъявляют за map, но мне нравится это название — отображение же! (возможно, конформные отображения сломали мне мозг) В голом JS под map подразумевается не только то, что вы подумали, но еще и ассоциативный массив Map. В TS есть mapped types, который совсем не про массивы. В rx есть map, и ничего, как-то живут. В общем, если подойти достаточно абстрактно, всё есть map)

size-limit конечно лучше чем жать голый UMD, но мы всё ещё измеряем один бандл, а не разницу с пустым приложением, так что EOCD и непрогретый gzip остаются. К тому же завязка на вебпак, который инжектит свой рантайм — я что-то уже не хочу к нему приближаться вообще

Все же Map и mapped types это совсем другое, чем вызов метода. Сmap в rxjs как раз все хорошо: это обработка элемента последовательности. А вот по примеру из readme библиотеки array(number()).map(... я бы никогда не подумал, что в аргумет map уйдет массив, а не элемент. Это плохой UX, будет сбивать тех, кто не знаком с библиотекой. Прям очень плохой.

Советую поменять до 1.0.0 версии.

К тому же завязка на вебпак,

Там в `preset-small-lib` используется esbuild

Я обдумаю это предложение, спасибо)

> Там в preset-small-lib используется esbuild

Благая весть! Вот я дед

При чём здесь какая-то схема? Вот любят нынче понапихать умных слов в самые обыденные вещи. Смотрю заголовок, думаю: что ещё за валидация схем такая? А это оказывается просто валидация данных... или я что-то не понимаю? )

Я ждал этого комментария) "Просто валидация" — растяжимое понятие, хотел дополнительно уточнить что речь не о валидации форм

Чтобы прокачать маленькость в js можно посмотреть трюки, которые авторы https://js1024.fun/ используют. Или самому поучаствовать и в дискорде ихнем пообщаться.

Эло это ваш con fn = () =>. Понимаю использовать в как временную функцию, но не как название экспортируемой функции. Потом весь код в стактоейсе состоит из anonymous…

Я, пожалуй, предпочту библиотеку где функции создают правильно.

В спецификации со времён ES6 есть специальное поручение (12.14.4.1.e.iii) в такой ситуации доставать name функции из имени переменной (и из многих других мест, ищется по SetFunctionName).

И это легко проверить

А в минифицированном коде имена и функций, и переменных, обфусцируются и ориентироваться в любом случае придется по line:column

Предпочитать любые библиотеки по любому критерию, разумеется, базовое право каждого человека.

Не во всех средах это поручение отрабатывает. Так что такое себе решение

Зарегистрируйтесь на Хабре, чтобы оставить комментарий