Разработчики любят подшучивать над раздуванием зависимостей Javascript (и вполне имеют на это право, учитывая историю пакетов наподобие left-pad); при этом часто упоминаются пакеты is-even и is-odd. Поэтому я заинтересовался, кто же на самом деле их использует?

Что такое is-even и is-odd?

В большинстве приложений для выполнения часто встречающихся задач используются общие пакеты, чтобы разработчикам не приходилось переписывать заново код, уже написанный кем-то другим. Такие пакеты часто распространяются через менеджер пакетов (в случае Javascript это npm — node package manager).

is-even и is-odd — это пакеты npm, проверяющие число на чётность или нечётность. Если это всё, что вы о них знаете, то их существование может показаться неоправданным, ведь эту задачу можно решить одной строкой кода: n % 2 === 0. Однако Javascript без проблем позволяет проверять чётность или нечётность строк; в этом случае возникает вопрос, возвращает ли код false из-за какой-то ошибки или потому, что число действительно нечётное.

is-even и is-odd берут на себя эту проблему, выполняя дополнительную проверку ошибок. В частности:

  1. Преобразуяn в положительное число

  2. Проверяя, действительно ли n число

  3. И находится ли n в пределах «Safe Integer», потому что в противном случае окажется, что 12345678978901233 % 2 === 0 возвращает true, хотя число заканчивается на 3.

Кто пользуется is-even и is-odd?

Учитывая популярность шутки, я ожидал встретить их использование в куче пакетов и думал, что написать этот раздел будет очень просто. Однако я приятно удивился, практически не обнаружив их использования. Первым делом я убедился, что сам не использую эти пакеты, поискав их в node_modules проектов, над которыми работаю. Их там не было.

Затем я выполнил проверку через npmgraph. Оказалось, что он показывает пакеты, которые используются is-odd, но не наоборот. Любопытно (хотя, вероятно, это и не должно было меня удивлять), что автор is-even и is-odd сам активно пользуется своими пакетами. Если вы нажмёте на несколько случайных пакетов на странице по ссылке выше, то есть высокая вероятность, что найдёте там имя jonschlinkert.

[Забавный факт: за восемь часов до начала моего исследования владелец запушил регрессию, поломавшую веб-сайт. Мне пришлось создать пул-реквест и надеяться, что он проверит свою почту в субботу в канун Нового года... Веб-сайт оказался не особо полезным для моей задачи, но было бы забавно, если бы моё исследование закончилось в самом начале, как будто некие высшие силы повелели мне прекратить и не идти дальше.]

Затем я подошёл к этой проблеме с двух сторон:

Во-первых, проведя обширный поиск кода на github, чтобы проверить, какие пакеты зависят от них. Поиск всех версий is-odd возвращает 36 тысяч результатов, проверить которые самостоятельно я вряд ли смогу. Ограничившись последней версией, выпущенной больше шести лет назад (3.0.1), я получил всего 98 результатов; все они были лишь маленькими личными проектами. Недостаток такого подхода в том, что я ограничиваю поиски только Github, только последними версиями репозиториев, только репозиториями, которые коммитят файл lock, и только теми, которые используют версию v3.0.1. Плюс в том, что мне не пришлось вручную проверять все 36 тысяч репозиториев.

Также я попробовал поискать репозитории в фреймворках популярных организаций наподобие React и Vuejs. Хотя я и нашёл одну ссылку на пакет в Vue, это транзитивная зависимость и старая версия nyc в выведенном из эксплуатации репозитории примера того, как выполнять юнит-тестирование. Поэтому я с радостью могу сказать, что React, Next, Vue, Nuxt и Svelte в безопасности. Но в то же время я понял, что если действительно хочет быть уверенным, то необходимо проверять самостоятельно, ведь со старыми версиями и малоизвестными пакетами, не так аккуратно обращающимися со своими зависимостями, может произойти что угодно.

Большинство скачиваний связано со старой версией micromatch, тоже написанной jonschlinkert.

Эти методики неидеальны, но я могу вполне уверенно сказать, что если вы пользуетесь чем-то, написанным за последние три года, то, вероятно, у вас нет зависимости от какого-то из этих пакетов. Если бы я сильно хотел разобраться, где используется is-odd, то, скорее всего, мне пришлось бы скачать список всех пакетов с npm и их зависимостей, а затем создать граф зависимостей из двух миллионов узлов. Если у вас появится более умная идея, напишите мне, но пока это всё равно проект на будущее.

Зачем появились is-even и is-odd?

По словам автора, он опубликовал их в 2014 году, когда сам ещё учился кодить. Я не думаю, что когда я начал писать код, мне пришло бы в голову опубликовать что-то в международный централизованный менеджер пакетов, но, вероятно, это больше говорит о моей самоуверенности, чем об авторе пакета.

Удивило меня то, что эти пакеты были добавлены только в 2014 году, почти пять лет спустя после выпуска npm. Учитывая отсутствие препятствий к созданию новых пакетов npm (при условии соблюдения правил использования: https://docs.npmjs.com/policies/open-source-terms#acceptable-use), я удивлён, что пакет с таким простым именем был опубликован спустя столь долгое время.

crates.io был основан в 2014 году и тоже получил свою версию is-odd примерно через четыре года. Я думаю, это неизбежно для любого централизованного реестра пакетов.

Заслуживают ли эти пакеты ненависти?

Не думаю. Никто не заставляет вас их использовать. И они не занимаются «киберсквоттингом» имён, ведь делают именно то, что заявлено в названии (проверяют число на чётность или нечётность). Похоже, на них обрушилась ненависть, непропорциональная наносимому ими урону, который на самом деле намного меньше, чем у других более «полезных» пакетов наподобие left-padeslint-scope и node-ipc.

Комментарии (6)


  1. baldr
    18.01.2024 09:24
    +2

    Ну, 427k загрузок в неделю для is-odd выглядит как довольно популярный пакет...

    И автор еще не видел, наверное, замечательный Docker-service для is-odd.

    Что касается автора, то вот он на Reddit объясняет что, на его взгляд, никакой разницы нет если вы сами напишете такой же код локально, по сравнению с загрузкой из npm.

    У него довольно много похожих модулей. Например, замечательный ansi-yellow.


  1. zorn-v100500
    18.01.2024 09:24
    +9

    Заслуживают ли эти пакеты ненависти?

    Все верно, нет. Заслуживают ненависти кто бездумно делает `npm install everything`


  1. Metotron0
    18.01.2024 09:24
    +1

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

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


  1. vitiok78
    18.01.2024 09:24
    +2

    Сами по себе эти пакеты злом не являются, т.к. они выполняют свою работу.

    Однако популярность этих пакетов является хорошим индикатором настоящего зла, а именно, бездумного использования зависимостей, к сожалению, принятого в JavaScript экосистеме. К сожалению, вся современная культура разработки на JavaScript подталкивает начинающего разработчика всегда сначала искать решение в NPM, не глядя ни на производительность, а зачастую, и на безопасность. И эта привычка остаётся с ним на всю жизнь.

    Я не знаю, чем это объяснить, но когда я пишу на Go, я почему-то всегда сперва пытаюсь написать всё сам, и только если горят сроки либо сильно возрастает сложность, я иду за сторонними библиотеками. Возможно, это связано с тем, что у Go просто великолепная стандартная библиотека. Но как только я переключаюсь на JavaScript, сразу начинаю "npm install everything". Мистика...


  1. gun_dose
    18.01.2024 09:24

    А ведь есть ещё is-odd-number, assert-is-odd, isodd. Также есть, к примеру is-array и isarray, при том, что сейчас нет ни малейшей необходимости ни в одном из них. А если полазить в своих проектах по node_modules, то там найдётся ещё куча is-много-чего. И в большинстве случаев, там кода от 1 до 10 строк. Но к этому ещё может прилагаться 1000 строк документации, юнит-тесты и скрипт для CI. И конечно же, никто это не ставит в свои проекты - оно всегда тянется, как зависимости. Не то чтобы меня это сильно беспокоило, но иногда заставляет задуматься.


  1. Sumned
    18.01.2024 09:24
    -1

    А потом пользователи удивляются, почему их 5g интернет 2 минуты загружает страницу.