История с left-pad пробрала JavaScript-сообщество до самых костей. В то время как разбухший код продолжает замедлять наши сайты, сажать наши батареи и делать наш npm install медленным, многие разработчики решили сами провести тщательный аудит зависимостей, которые они привносят в свои проекты. Настало время, чтобы мы как сообщество встали и сказали: «Хватит!» Это сообщество принадлежит всем нам, а не только горстке JavaScript-разработчиков с шикарными длинными волосами.

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

Ember


Ember — это JavaScript-фреймворк, который специализируется на быстром создании todo-списков. У него неплохой размер в 112 килобайт в сжатом виде. Но большинство людей не знают о том, сколько из 112 килобайт тратится ни на что.

Если мы заглянем в зависимости эмбера, то увидим библиотеку под названием glimmer. Сама эта библиотека весит 95KB (или 85% кода эмбера), но ее назначение не сразу понятно (она даже не упоминается на сайте эмбера!).
Что ж, глядя на эту зависимость, я нашел кое-что весьма любопытное:

+-T glimmer@1.1.5
¦ +-T brittanica@13.0.2
¦ ¦ +-- brittanica-a@0.0.1
¦ ¦ +-- brittanica-b@0.1.2
¦ ¦ +-- brittanica-c@0.0.3
¦ ¦ ...

«Brittanica» — модуль весом 93КБ, должно быть, выполняет всю тяжелую работу. Brittanica сама состоит из множества зависимостей: каждый модуль называется «brittanica» + суффикс с буквой английского алфавита (26 штук).

Ковыряясь дальше, я обнаружил, что каждый модуль состоит из одного файла terms.json. Я открыл его в Atom, затем открыл в Sublime, после того как Atom завис. Тарабарщина появилась на экране:

{
    "g": {
        "page": 1018,
        "description": "The seventh letter of the US English..."
    },
    "ga": {
        "page": 1021,
        "description": "a Kwa language of Ghana, spoken in Acc..."
    },

    ...

    "glimmer": {
        "page": 1172,
        "description": "A faint or wavering light, used pri..."
    },

    ...
}

17,648 строк в общей сложности, описывающих различные слова и фразы, которые начинаются с буквы G. Кому на земле может понадобиться это? Ну, знакомьтесь, это glimmer/help.js:

module.exports = function help() {
    var descriptino = require("brittanica-g").glimmer;
    console.log("glimmer (n). " + descriptino);
    console.log("");
    console.log("Copyright (c) 2016 Tilde Inc");
    console.log("");
    ...
}

В случае, если приведенный выше фрагмент кода непонятен, позвольте мне подвести итог:

1. Эмбер гордится использованием модуля «glimmer»: маленькой, быстрой рендеринг-библиотеки.
2. «Glimmer» тянет часть энциклопедии Brittanica, просто чтобы вывести определение слова glimmer в меню «справка».
3. Наши океаны высыхают с пугающей скоростью, а мы все слишком заняты, играя в Покемонов на наших телефонах, вместо того, чтобы поговорить об этом. Просто безумие.

Babel


Babel является компилятором для новой версии JavaScript, который обыграл своих конкурентов, когда кто-то в Facebook сказал, что им Babel нравится больше.

Хотя люди любят Babel, он получил справедливую долю критики. Многие жалуются на его запутанную систему плагинов, чрезмерно сложные конфигурационные файлы и неясные сообщения об ошибках. Любопытно, но не так много людей заметили невероятное количество зависимостей, которые требует Babel.

Я начал свое расследование, установив пакет «babel-preset-es2015». Этот пакет позволяет двадцати с лишним веб-разработчикам в мире писать на новом, худшем варианте JavaScript, который никто в их команде не знает. Затем я подсчитал количество зависимостей, вносимых этим пакетом, а затем общий размер кода. Целых 90 зависимостей на общую сумму 17 мегабайт.

Если всю историю человечества удалось уместить в один мегабайт, то один Babel будет состоять как минимум из семнадцати летописных историй человечества. Но мне стало действительно интересно, что же делает Babel настолько большим?

Один из самых больших преступников — пакет под названием «babel-core» был подозрительно крупным — 13 мегабайт. Я открыл «babel-core» в VIM, потом перезагрузил компьютер, потому что сочетание Ctrl-C не работало, затем открыл «babel-core» в Sublime.

module.exports = require("./lib/api/node.js");

Примерно через 2 часа, я успешно нашел /lib/api/node.js и понял суть вопроса.


Это правда. Каждая установка Babel включает в себя фотографию Гая Фиери, и вы ничего не можете с этим поделать.

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

Express


Позади самого быстрого, нежирного JavaScript веб-фреймворка скрывается куча зависимостей, каждая со своей кучей зависимостей. В самом деле, простой «npm install express» приводит к установке 291 модуля.

Итак, что же входит в список этих зависимостей? Многие самоочевидны: «range-parser» разбирает http range, «escape-html» экранирует HTML, а "negotiator" делает другие важные дела. Тем не менее, одна зависимость — «yummy» («вкуснятина») — привлекла мое внимание.

+-- yummy
¦ +-- LICENSE
¦ +-- README.md
¦ +-- like-tweet.js
¦ +-- index.js
¦ L-- package.json

Интересно. Помимо обычных index.js и package.json, мы находим подозрительный like-tweet.js. Я решил взглянуть поближе.

var http = require("http")

http.request({
  method: "POST",
  hostname: "api.twitter.com",
  path: "/hotpockets/status/501511389320470528",
})

Секундочку like-tweet.js, который выполняется каждый раз, когда ваше приложение загружает популярную библиотеку Express, делает post-запрос к API Твиттера. Зачем? Я двинулся вперед и загрузил этот маршрут сам.



Конечно, это твит от Hot Pockets, и я уже добавил его в избранное. В самом деле, каждый раз, когда вы загружаете Express, вы добавляете в избранное этот твит от Hot Pockets. Какое чудовище заключило такую рекламную сделку? Я пропускаю конфиденциальные данные клиентов через Express, а они продают «добавление в избранное» в Hot Pockets? Разумеется, я не буду больше использовать Express.

Выводы


Хочу быть понятым — я не считаю, что внешние зависимости являются признаком конца света. Я просто думаю, что максимально важно, чтобы мы как сообщество начали заботиться о чистоте кода так же, как мы заботимся о крутых функциях и красивых логотипах.

Мы можем работать лучше. Мертвый код занимает пространство, съедает пропускную способность и может даже убить твой стартап.

Я призываю вас посмотреть внутрь вашей папки /node_modules в следующий раз, когда у вас будет несколько свободных часов, и компьютер с 16 гигабайт оперативной памяти. Результаты могут вас просто удивить.
Поделиться с друзьями
-->

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


  1. stavinsky
    16.08.2016 12:18
    +4

    Вот интересно, эта статья — частитично реклама sublime или мне показалось? Аж 2 упоминания что только он спас.

    Я открыл «babel-core» в VIM, потом перезагрузил компьютер, потому что сочетание Ctrl-C не работало, затем открыл «babel-core» в Sublime.

    kill из соседней консоли не пробовали?) Первый раз такое слышу что бы комп перегружали из-за vim в котором ctrl-c не сработал.
    Ну а по делу, интересно обстоят ли так дела только с npm или в composer, pip, gem(подставить нужное) та же история. Спасибо за статью


    1. stavinsky
      16.08.2016 12:35
      +1

      Блин надо было читать теги)


    1. Sild
      16.08.2016 12:45

      А чего его рекламировать? Те, кто пробовали открыть несколько метров текстовыми редакторами, знают как печально это может закончится. И сублайм — один из немногих, кто это стойчески переносит. Комментарии автора внесли свою каплю юмора «для тех, кто в теме», не более.


      1. stavinsky
        16.08.2016 12:47

        Когда я писал коммент, я еще не видел тегов )


      1. mihmig
        16.08.2016 13:51
        +20

        2002-й год, Visual Fox Pro 6.0, Windows 98, 16 МБайт ОЗУ
        Спокойно открывается текстовый файл на 100 МБайт в режиме редактирования.

        Напьются смузи, напрограммируют мышкой, а потом у людей текстовый редактор зависает…


        1. Fox_exe
          16.08.2016 14:12
          +1

          nano на ARM девайсе с 32 метрами оперы… Спокойно ковыряюсь в гигабайтных логах одной кривой софтины…


          1. mva
            16.08.2016 16:20
            +3

            Более того, я делаю то же самое на MIPS, и… в VIM!
            // просто оригинальный автор статьи загадил вим кучей бандлов-плагинов, которые имеют ту же самую, описанную самой статье проблему :)


            1. kahi4
              16.08.2016 16:57
              +32

              Я полагаю, что шутка тут была про то, что он не смог выйти из VIM, а не что VIM завис.


        1. DartMedved
          17.08.2016 12:19
          -1

          best comment :)


        1. stavenko
          23.08.2016 10:09

          Я позанудствую…
          Исходник здорового человека крайне редко больше 1000 строчек. Поэтому у меня вим настроен со всеми возможными свистоперделками и работает быстро пока не попадется такая вот загогулина.

          А потом да — если резет не нажать — день программирования потерян.


          1. asolntsev
            24.08.2016 07:13

            Да ладно! А что, там нет плагина автосохранения?
            Я не нажимал Ctrl+S уже лет 7 — с тех пор, как пересел на Intellij IDEA. Всё само сохраняется. День программирования никогда не будет потерян.


            1. stavenko
              25.08.2016 09:18

              Это была ирония — вим висит, работать невозможно.


      1. w4r_dr1v3r
        16.08.2016 18:45

        Notepad++ вот кто стоически переносит что угодно, когда угодно и где угодно.


        1. Zenitchik
          16.08.2016 21:06

          Не всегда. Мне случалось nodejs-ом резать файлы на куски вменяемого размера...


        1. serega011
          16.08.2016 22:52
          +3

          Нет, Notepad++ дамп sql на 500 мб или чуть больше он уже отказывается открывать (он выкидывает какое-то ограничение на размер файла). А вот FAR (total comander и т.п.) открывает все мгновенно и в куда большем размере.


          1. Zenitchik
            16.08.2016 23:56

            Он самый. Дамп. У меня — просто рушится.


        1. Silm
          17.08.2016 12:08
          +3

          image

          Хоть сам пользуюсь Notepad++ но sublime с большими файлами справляется лучше (быстрее в том числе).


          1. AlexanderG
            25.08.2016 14:01

            Сайблайм на файлах 50-100+ МБ тоже становится на колени.


        1. arhangelsoft
          17.08.2016 18:39

          Notepad++ team заблокировали эту возможность, т.к. Scintilla не может обрабатывать гигабайтные данные. А потому объём файла который может считать NPP это где-то 20-25% от вашей ОЗУ :) На 4гб ОЗУ и загруженностью оной на 60%, файлы жирнее 250 мб оно уже не открывает.

          Такие дела.


      1. poxu
        16.08.2016 19:05

        Вим открывает гигабайтные файлы. Так что странно, что так вышло.


        1. stavenko
          23.08.2016 10:12

          Плагины и бандлы — подсветка синтаксиса и автодополнения… Если привычным движением открыть что-то непривычное — можно очень долго ждать.


    1. friday
      16.08.2016 18:19
      +14

      А вы разве не знали, что из vim можно выйти только перезагрузкой? Иначе он будет пищать и всё портить:-)


      1. stavinsky
        16.08.2016 18:26
        +2

        Это было утро. Я еще не проснулся и принял сей материал за чистую правду. Вот и набросился. Каюсь.


  1. dim_s
    16.08.2016 12:18
    +8

    Случай с express поразил меня больше всего.


    1. VasilioRuzanni
      16.08.2016 12:24
      +4

      Ну, вы же не поверили, тому что написано в статье, правильно? :)


      1. stavinsky
        16.08.2016 12:29
        +11

        Эм это что шутка все?)


        1. VasilioRuzanni
          16.08.2016 12:32
          +8

          Само собой :) Даже в команде Ember сидят не настолько прагматики, чтобы тащить Британнику ради одного определения. Но с чувством юмора у автора все круто — такое еще надо было придумать :D


        1. zapolnoch
          16.08.2016 12:33

          Т.е. вы поверили в Гая Фиери и Британнику и вас поразил только авто-твит?


          1. FFiX
            16.08.2016 13:03
            +20

            Здесь бывают не только js-разработчики. :)


          1. jakobz
            16.08.2016 13:47
            +38

            Я вот, лично, поверил вообще всему, и реально пошел эту фотку искать.

            В это реально несложно поверить. Такое ощущение что 95% процентов ноды делают конченные малолетние идиоты, причем специально делают не так как все, чтобы посердить папу. А 95% потребителей ноды и библиотек — это неизбалованные нормальным языком и библиотеками PHP-шники.

            Потому что если человек хоть на чем-нибудь кроме PHP писал в жизни, он реально не поймет предложение писать сервер на ноде. Ну реально — это же самое дно из всего что есть вообще (кроме может PHP того же)


            1. Rathil
              16.08.2016 14:26
              +4

              Сколько обиды, в одном то комментарии :)


              1. jakobz
                16.08.2016 23:04
                +7

                Есть обида, да. Потому что мне приходится с этим говном пересекаться, из-за фронтенд-тулчейна (webpack, typescript, npm, и т.п.). Там деваться особо некуда. Сервер на C#.

                И я в шоке от инженерной культуры вокруг node.js. Например, прилетают мажорные релизы библиотек с critical-багами. NPM недетерменировано раскладывает модули по папкам. Все это весит сотни мегабайт, и отжирает гигабайты памяти просто чтобы собрать 1 мегабайт JS-ников. Авторы библиотек ломают совместимость API по три раза за год. Я уж молчу что в NPM-2 папки в винде стереть нельзя было из-за длины имен, спасибо хоть это починили.

                На фоне .NET-а (в котором тоже местами адище) — от node волосы на жопе шевелятся. А если уж JS-ники склеить — уже проблема, то я не могу себе даже преставить что творится у тех кто сервера на ноде делает.


                1. Dreyk
                  16.08.2016 23:33

                  есть такое, я вот так привык к культуре кода в руби-сообществе, что прям офигел, когда открыл исходник какого-то npm пакета, а там ни одного коментария =)


                1. Zenitchik
                  17.08.2016 00:01

                  Ага. Я хоть и JavaScript-ер, не люблю микромодули. Благо, пока ничего большого писать на nodejs не случалось, пока могу всё просматривать. А у нас-то во front-end'e всё по другому, чисто, аккуратно, без внешних зависимостей (требования — возможность работы в интранате), и в продакшене — пожато в небольшое количество файлов.


                1. vtulin
                  17.08.2016 11:56

                  В качестве шутки и не очень:

                  npm install -g rimraf
                  

                  Прекрасно справляется с удалением своих же длинных папок)


            1. bohdan4ik
              16.08.2016 14:26
              +11

              Осмелюсь вступиться за PHP.

              Современный PHP это уже не тот язык, что был в далёком 2008. Здесь тоже есть кровавый энтерпрайз (привет, Симфони!) с декомпозицией всего и вся, с поддержкой статической типизации и хорошим пакетным менеджером.

              Конечно, можно писать и без фреймворков, по-старинке складывая всё в один файлик, но тут уж всё зависит от программиста.


              1. impwx
                16.08.2016 14:56
                +2

                Осмелюсь с вами поспорить. Прогресс действительно был, но большинство вещей из фрактала плохого дизайна по-прежнему актуальны.

                Экосистема в целом напоминает «зону» Стругацких: поверх враждебной для пользователя среды выросла защита в виде Symfony и иже с ними, но когда приходится выходить за ее пределы, даже старые прожженые сталкеры нет-нет да и напорются на какой-нибудь нежданчик.


                1. stavinsky
                  16.08.2016 15:04
                  +22

                  Почему даже статья про JS вызывает холивары про пых?)


                  1. XimikS
                    16.08.2016 15:35
                    +2

                    PHP страдает от закона Гудвина.


                1. bohdan4ik
                  16.08.2016 15:52

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

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

                  > $var['smth'] = null;
                  > isset($var['smth']) // false
                  > array_key_exists('smth', $var) // true

                  Как-то убил пару часов на отладку этого :)


                  1. dovg
                    16.08.2016 20:29
                    +4

                    Это вообще-то в документации описано (второй пример).
                    Удивительно, как много php программистов ни разу не читали мануал php.


                    1. bohdan4ik
                      16.08.2016 21:51
                      +1

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

                      Удивительно как много людей не читают чужих сообщений.

                      Наверное, нужно повторить.

                      > В самом начале своей карьеры, помнится, я читал об этом нюансе

                      Но за давностью ознакомления сей нюанс вылетел из головы.


                      1. bohdan4ik
                        16.08.2016 22:07
                        +5

                        Вроде бы, уже не первый год на Хабре, но всё не устаю поражаться русскоязычному коммьюнити. Все такие напыщенные и высокомерные, что стоит поделиться кусочком своих знаний (https://habrahabr.ru/post/307248/#comment_9738110) или раскаяться в незнании и забывчивости (https://habrahabr.ru/post/307822/#comment_9753478), как тебя тут же забросают фекалиями всех сортов и попытаются выставить дурачком.


                      1. dovg
                        17.08.2016 09:29
                        -1

                        > В самом начале своей карьеры, помнится, я читал об этом нюансе

                        Но за давностью ознакомления сей нюанс вылетел из головы.

                        Поэтому я и перечитываю мануалы время от времени. Человеческий мозг несовершенен.
                        ПДД кстати тоже стоит перечитывать.


                        1. bohdan4ik
                          17.08.2016 09:55
                          +2

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

                          «Два часа» из моего сообщения, на самом деле, длились не более 20 минут (хотелось указать на драматизм ситуации с неочевидностями PHP), и, конечно же, я полез читать документацию. Нестоит осуждать людей, если не знаете всей их истории.


                    1. vlreshet
                      17.08.2016 09:15
                      +2

                      А зачем вы дали ссылку на «PLEASURE BOAT ‘’HERCOGS JEKABS”»?


                      1. dovg
                        17.08.2016 09:27
                        +1

                        Лол, вот правильная ссылка — http://php.net/manual/en/function.array-key-exists.php
                        В буфере оказалось не то, что я планировал.

                        btw Вентспилс — очень приятный город.


                  1. i-o
                    16.08.2016 21:42

                    Вы считали, что isset() и array_key_exists() — это одна и та же функция?


                    1. bohdan4ik
                      16.08.2016 21:45

                      Нет, что вы. Я не ожидал, что isset() вернёт false на установленное (хоть и в null) значение.


                      1. Rathil
                        16.08.2016 23:30

                        А Вас не смущает, что в SQL-е null != null? Конечно нет, это же описанно и Вы уже на это натыкались.

                        К чему это я? К тому, что все имеет свои нюансы и свои тонкости, вот для выявления этих аспектов и нужно читать книги и документацию.


                        1. wing_pin
                          17.08.2016 15:18
                          +1

                          Описание нюансов и тонкостей в документации не отменяет и не оправдывает ущербности дизайна и исполнения.


                  1. den_rad
                    16.08.2016 21:56

                    «Особенность языка», я так-же убил час, понимая разницу между empty() и !isset()


                    1. Rathil
                      16.08.2016 23:27
                      -1

                      А можно было почитать документацию и потратить на 90% времени меньше…


                1. symbix
                  16.08.2016 17:23

                  Не очень актуальны, на самом деле.

                  Те неконсистентности, которые можно было исправить, не ломая обратную совместимость, исправили в PHP7.
                  Остальное большей частью либо исправлено на уровне фреймворков/библиотек (что, кто-то вручную пользуется curl?), либо просто вкусовщина.


            1. AlexMac
              16.08.2016 15:46
              +5

              jakobz Хм, и что же не дно по вашему? Был как-то не коференции, где главный разработчик aviasales сказал, что они перешли на python с rails (потому-что каждый запрос кушал 300Мб памяти!!!), и когда его спросили почему не node.js, он сказал что node это г… но. Это не вы случаем были:)?


              1. Fedcomp
                16.08.2016 23:35

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


            1. movl
              16.08.2016 16:05
              +5

              Ну реально — это же самое дно из всего что есть вообще

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


              Скрытый текст

              95% НОДЫ ДЕЛАЮТ КОНЧЕННЫЕ МАЛОЛЕТКИ-ИДИОТЫ
              95% ПОТРЕБИТЕЛЕЙ НОДЫ ЖРУТ ГАВНО
              НОДА САМОЕ ДНО — НУ РЕАЛЬНО
              РЕАААЛЬНOOО000!!!!111
              image


      1. dim_s
        16.08.2016 13:39
        +1

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


  1. pengyou
    16.08.2016 12:18

    максимально важно, чтобы мы как сообщество начали заботиться о чистоте кода

    Рынок решил, что и так сойдёт.


    1. pengyou
      16.08.2016 12:25
      +13

      ...и так сойдёт
      image


  1. 1nt3g3r
    16.08.2016 12:20
    +1

    Если мы заглянем в зависимости эмбера, то увидим библиотеку под названием glimmer. Сама эта библиотека весит 95KB (или 95% кода эмбера)

    Не 95%, а (95/112*100) = 85%



  1. VasilioRuzanni
    16.08.2016 12:30
    +1

    На самом деле, забавно и круто (читал эту статью в оригинале). Кстати, автору тоннами сыплются комментарии по поводу того, что хоть где-то стоило упомянуть, что это стеб (ну, кроме Гая Фиери частично) — впрочем, может тогда не было бы так весело :)


  1. Igogo2012
    16.08.2016 12:33

    У меня в проекте используется express и никакого yummy в зависимостях и в node_modules в помине нет!


    1. franzose
      16.08.2016 12:56
      -2

      В этом и прикол)


  1. Strate
    16.08.2016 12:39
    +27

    Взял на себя смелость проверить доводы в статье.
    express (последний релиз 2 месяца назад) не ставит yummy.
    Поставил руками yummy (последний релиз 8 месяцев назад) — в нём нет like-tweet.js
    Поставил ember — он не ставит glimmer (или я не тот ember поставил), окей, ставлю glimmer (релиз год назад) — в нём нет brittanica
    Окей, смотрим babel-core. Есть вот такой коммит: https://github.com/babel/babel/commit/f36d07d30334f86412a9d2771880cb566a82a9b6
    Что-то похожее на правду. Открываем историю файла: https://github.com/babel/babel/commits/f36d07d30334f86412a9d2771880cb566a82a9b6/packages/babel-core/src/api/node.js
    Берём самую первую версию файла: https://github.com/babel/babel/blob/3ef9bffcc240e60085fbb120de07d884448fbea3/packages/babel-core/src/api/node.js
    В нём нет картинки.
    Итого — ни один довод из статьи я не смог подтвердить.
    Судя по всему статья — просто штука, не принимайте всерьёз :)


    1. VasilioRuzanni
      16.08.2016 12:40
      +8

      Ну вы уж заморочились, Шерлок)


      1. zapolnoch
        16.08.2016 13:27
        +22

        В этом и есть смысл статьи — взять и заморочиться. Открыть наконец папку node_modules и посмотреть что в ней происходит. Чтобы история с left-pad больше не повторилась.


        1. VasilioRuzanni
          16.08.2016 14:14
          +2

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


        1. Nikelandjelo
          17.08.2016 00:48

          И как это помогло бы с left-pad? Это как-то помогло бы предовратить какого-то левого разработчика удалить опубликованный пакет с npm?


    1. Zenitchik
      16.08.2016 12:43

      Как говорится, за такие шутки...


      1. franzose
        16.08.2016 12:56
        +1

        Меж зубов бывают промежутки? :)


    1. Bashkinator
      16.08.2016 13:27

      Ну есть коммит, где картинка таки добавляется. Может thejameskyle просто поддержал шутку? :-)


    1. Ununtrium
      17.08.2016 16:09

      Меня только твиттер смутил. Что можно лайкать твиты без авторизации.


  1. aezhko
    16.08.2016 12:42
    +29

    Блин, а ведь в начале статьи я правда думал, что это правда.


    1. artemiycpp
      17.08.2016 11:56
      +8

      я думал, что это правда до тех пор, пока в комменты не посмотрел


  1. vconst
    16.08.2016 12:51
    +1

    Все самое интересное — в тегах :)


    1. FFiX
      16.08.2016 13:05
      +5

      Мобильная версия хабра не показывает теги. =/


  1. bjornd
    16.08.2016 13:27
    +7

    А еще раз я как-то открыл зависимость из node_modules и у меня ноут сгорел.


    1. folkyatina
      17.08.2016 16:08

      Главное, что брат от этого не умер.


  1. ekubyshin
    16.08.2016 13:39

    читая статью, задумался о переходе на go вместо node, но потом все встало на свои места


  1. Desprit
    16.08.2016 13:43
    +18

    Блин, а меня даже тэги не стразу убедили, что это шутка… :(


  1. AccessGranted
    16.08.2016 14:38

    На небольшом проекте, который мы сейчас разрабатываем

    $ ls -l frontend/app/node_modules/ | wc -l
    840


    1. an9eldust
      16.08.2016 15:48

      Прозреваю npm@3.x. Но все равно дофига.


  1. Starche
    16.08.2016 15:49

    npm настолько страшная вещь, что я тоже подумал, что это не шутки всё. Только про эмбер не поверил. Не, ну он же на фронтенде, там не может быть столько бесцельных байтов. Если бы не это, я бы принял статью за чистую монету.


    1. Lockal
      16.08.2016 16:35
      +2

      I wanted to start a simple hello world app for AngularJS 2.

      When I followed the instructions in the official quickstart the installation created 32,000 files in my project.

      I figured this is some mistake or I missed something, so I decided to use angular-cli, but after setting up the project I counted 41,000 files.

      Where did I go wrong? Am I missing something really really obvious?

      Источник. И это только фронтенд.


      1. Starche
        16.08.2016 16:59

        Ну это ж всё не тянется в браузер. Там стандартный набор адского количества зависимостей для разработки. Знаем, проходили. В статье же написано так, что мол 85% всего эмбера (из 112гзипнутых килобайт) — это энциклопедия британика.


        1. Lockal
          17.08.2016 11:22

          Эмбер модульный, всё вполне можно было бы теоретически свалить на систему сборки и тесты, которые до клиента не дойдут, но при этом всё равно присутствуют в поставке эмбера по воле разработчиков.

          Реальный пример: bower и многие другие пакеты npm имеют набор зависимостей, которые в определённый момент содержат пакет «wordwrap», который выставляет папку tests. А там рассказ Бертрана Рассела «In Praise of Idleness».

          Apparently this module is quite popular with other NPM authors. I have 202 copies of «In Praise of Idleness» by Bertrand Russell on my computer

          Занавес.


  1. Shamov
    16.08.2016 17:02
    +4

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


    1. alexkunin
      16.08.2016 17:15
      +2

      Тогда модуль каждого слова в зависимостях должен иметь модули слов, составляющих его определение. Т.е. с любого слова можно потянуть по зависимостям всю Британику — это ж энЦИКЛопедия!


      1. Shamov
        16.08.2016 18:03

        Такой вариант модуля должен быть доступен в качестве альтернативы простому. На тот случай, если кому-нибудь нужно вывести определение слова, сделав все слова кликабельными.


  1. DjOnline
    16.08.2016 20:43

    Как же мучаются люди без F3 в Total Commander.


  1. ChALkeRx
    17.08.2016 08:52
    +1

    А где скриншоты с glitter? В оригинале были.


    1. Exxeption
      17.08.2016 12:43
      +1

      в оригинале много чего еще было


      1. ChALkeRx
        17.08.2016 15:28
        +1

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


  1. angru
    17.08.2016 12:43
    +2

    Из части про Ember куда-то пропал забавный кусок истории команд:


    $ tree node_modules/ | count
    zsh: command not found: count
    $ tree node_modules/ | lines
    zsh: command not found: lines
    $ tree node_modules/ | wc -lines
    wc: illegal option — i
    usage: wc [-clmw] [file …]
    $ tree node_modules/ | wc -countlines
    wc: illegal option — o
    usage: wc [-clmw] [file …]
    $ man wc
    $ tree node_modules/ | wc -l
      292


  1. yurash
    17.08.2016 13:33
    +2

    Шутки-шутками, но на мой взгляд (хотя я в node.js/npm скорее новичок) примерно так дела и обстоят. Возникла у меня на днях не гипотетическая а реальная необходимость уменьшить размер node_modules. Начал с разбора зависимостей модуля request, нашёл и картинки, и папки test и «толстые» .md файлы и кривые .npmignore. Не понимаю, почему нет какой-нибудь штатной опции минификации для деплоя


    1. Ununtrium
      17.08.2016 16:49

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


      1. yurash
        17.08.2016 17:25

        не совсем понял что значит «Это же не для деплоя в любом случае»? Node.js крутится на сервере, обрабатывает запросы, использует в своей работе ряд модулей из node_modules. Есть Backend-As-A-Service платформа(ы), которые предоставляют разработчику возможность использовать node.js, но налагают различные ограничения и квоты, в частности на общий размер кодовой базы, вместе с node_modules. Вот и приходится извращаться, в ручном режиме просеивать. Может я какой-то очевидный простой путь не знаю, поделитесь если есть?


        1. Ununtrium
          18.08.2016 12:27

          Эм, в статье по-моему говориться про npm для фронтэнда (как минимум Ember)? Драма в том, что если ты не используешь node.js на бэкэнде, c npm все равно придется иметь дело или, еще хуже, с каким-нибудь bower. Ну и там вообщем-то знаешь какие файлы тебе нужны и выдергиваешь их из node_modules.
          С бэкэндом: захотели ноду — нате, тут я считаю все честно.


    1. an9eldust
      17.08.2016 21:03

      Возникла у меня на днях не гипотетическая а реальная необходимость уменьшить размер node_modules.

      Связанная с чем?


      1. yurash
        17.08.2016 21:40

    1. DenVdmj
      18.08.2016 03:13

      К тому же npm дублирует зависимости всегда устанавливая их в подкаталоги. Очень сильно увеличивает размер корневого node_modules, и порой, при очень большой вложенности делает невозможной установку модулей под win. Кому такая бредовая идея могла придти в голову?
      В общем по этому поводу добавили npm dedupe — удаляет дубли и может уменьшить глубину вложенности каталогов node_modules.


      1. Zenitchik
        18.08.2016 09:36

        Говорят, замысел был в том, чтобы иметь возможность каждому модулю поставить нужную ему версию зависимости, если разные модули зависят от разных версий одного и того же модуля. Получилось — что получилось…
        Вложенность, кстати, не мешает, npm как-то справляется. А вот штатными средствами винды потом хрен удалишь.


        1. DenVdmj
          18.08.2016 17:08

          Ну это хороший и понятный замысел, и, например, LuaRocks тоже это умеет, но он держит в папках с именем модуля подпапки с номером версии.


  1. tamtakoe
    17.08.2016 14:29

    Я начал свое расследование, установив пакет «babel-preset-es2015». Этот пакет позволяет двадцати с лишним веб-разработчикам в мире писать на новом, худшем варианте JavaScript, который никто в их команде не знает.

    Тонко подмечено. К сожалению, это не шутка. И пользуются этим недоразумением куда больше 20 человек


  1. dolphin4ik
    17.08.2016 18:48
    -2

    Я не пойму, а каким образом я закачивая express делаю что-то с твитом?
    Твитор должен быть в консоли npm? или как?


  1. metaprogressor
    17.08.2016 19:22

    Бывает. Я в только что устанновленном Wordpress в SQL базе в таблице wpha_options нашел 2 мегабайта текстового мусора. К этой таблице постоянно идут 100500 запросов как от самого Вордпресса, так и от разных плагинов. Теперь ясно почему вордпресс так тормозит.


    1. lifestar
      22.08.2016 12:40

      Ну разберись там со своим мусором, потому что после установки WP, таблица wp_options весит ~ 96 KiB


  1. maxlips
    18.08.2016 19:32
    -3

    Да простят меня за гифку

    image


    1. grossws
      18.08.2016 20:00
      +3

      Простили бы, если бы она была под спойлером.


      1. maxlips
        18.08.2016 20:19
        +1

        Всегда было интересно, а где это правило написано?


        1. grossws
          18.08.2016 20:47

          Кроме формальных правил самого хабра есть ещё куча неформальных вещей. Начиная от netiquette (который несколько устарел, но более-менее применим) и заканчивая неформальными правилами конкретного сообщества.


          Например, в https://habrahabr.ru/info/help/other/ есть пункт про хабраэтикет. Базовая вещь, описанная ещё в netiquette, — уважайте чужое время. Как думаете, хорошо ли грузится 1.9 MiB при пингах ~1 s по GPRS?


        1. grossws
          18.08.2016 20:48

          И не рекомендую повторять данный опыт активнообсуждаемой теме, кроме как в качестве хабрасуицида.


        1. Ununtrium
          19.08.2016 12:51
          +1

          Большинству не нравятся картинки где что-то мелькает и дергается. Офигеть, да?


    1. stavinsky
      19.08.2016 20:49
      +2

      А можно для непонятливых, что вы хотели донести? оно мелькает и я не могу уловить смысл. Редко нпм использую что бы понять)