Я заглянул в папку node_modules, и вы не поверите, что произошло

https://medium.com/friendship-dot-js/i-peeked-into-my-node-modules-directory-and-you-wont-believe-what-happened-next-b89f63d21558
  • Перевод
История с left-pad пробрала JavaScript-сообщество до самых костей. В то время как разбухший код продолжает замедлять наши сайты, сажать наши батареи и делать наш npm install медленным, многие разработчики решили сами провести тщательный аудит зависимостей, которые они привносят в свои проекты. Настало время, чтобы мы как сообщество встали и сказали: «Хватит!» Это сообщество принадлежит всем нам, а не только горстке JavaScript-разработчиков с шикарными длинными волосами.

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

Ember


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

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

├─┬ glimmer@1.1.5
│ ├─┬ 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
│ └── 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 гигабайт оперативной памяти. Результаты могут вас просто удивить.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 116
  • +4
    Вот интересно, эта статья — частитично реклама sublime или мне показалось? Аж 2 упоминания что только он спас.
    Я открыл «babel-core» в VIM, потом перезагрузил компьютер, потому что сочетание Ctrl-C не работало, затем открыл «babel-core» в Sublime.

    kill из соседней консоли не пробовали?) Первый раз такое слышу что бы комп перегружали из-за vim в котором ctrl-c не сработал.
    Ну а по делу, интересно обстоят ли так дела только с npm или в composer, pip, gem(подставить нужное) та же история. Спасибо за статью
    • +1
      Блин надо было читать теги)
      • 0
        А чего его рекламировать? Те, кто пробовали открыть несколько метров текстовыми редакторами, знают как печально это может закончится. И сублайм — один из немногих, кто это стойчески переносит. Комментарии автора внесли свою каплю юмора «для тех, кто в теме», не более.
        • 0
          Когда я писал коммент, я еще не видел тегов )
          • +20
            2002-й год, Visual Fox Pro 6.0, Windows 98, 16 МБайт ОЗУ
            Спокойно открывается текстовый файл на 100 МБайт в режиме редактирования.

            Напьются смузи, напрограммируют мышкой, а потом у людей текстовый редактор зависает…
            • +1
              nano на ARM девайсе с 32 метрами оперы… Спокойно ковыряюсь в гигабайтных логах одной кривой софтины…
              • +3

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

                • +32
                  Я полагаю, что шутка тут была про то, что он не смог выйти из VIM, а не что VIM завис.
              • НЛО прилетело и опубликовало эту надпись здесь
                • 0
                  Я позанудствую…
                  Исходник здорового человека крайне редко больше 1000 строчек. Поэтому у меня вим настроен со всеми возможными свистоперделками и работает быстро пока не попадется такая вот загогулина.

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

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

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

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

                      • +3
                        image

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

                          Такие дела.
                        • 0

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

                          • 0
                            Плагины и бандлы — подсветка синтаксиса и автодополнения… Если привычным движением открыть что-то непривычное — можно очень долго ждать.
                        • +14
                          А вы разве не знали, что из vim можно выйти только перезагрузкой? Иначе он будет пищать и всё портить:-)
                          • +2
                            Это было утро. Я еще не проснулся и принял сей материал за чистую правду. Вот и набросился. Каюсь.
                        • +8
                          Случай с express поразил меня больше всего.
                          • +4
                            Ну, вы же не поверили, тому что написано в статье, правильно? :)
                            • +11
                              Эм это что шутка все?)
                              • +8
                                Само собой :) Даже в команде Ember сидят не настолько прагматики, чтобы тащить Британнику ради одного определения. Но с чувством юмора у автора все круто — такое еще надо было придумать :D
                                • 0
                                  Т.е. вы поверили в Гая Фиери и Британнику и вас поразил только авто-твит?
                                  • +20
                                    Здесь бывают не только js-разработчики. :)
                                    • +38
                                      Я вот, лично, поверил вообще всему, и реально пошел эту фотку искать.

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

                                      Потому что если человек хоть на чем-нибудь кроме PHP писал в жизни, он реально не поймет предложение писать сервер на ноде. Ну реально — это же самое дно из всего что есть вообще (кроме может PHP того же)
                                      • +4
                                        Сколько обиды, в одном то комментарии :)
                                        • +7
                                          Есть обида, да. Потому что мне приходится с этим говном пересекаться, из-за фронтенд-тулчейна (webpack, typescript, npm, и т.п.). Там деваться особо некуда. Сервер на C#.

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

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

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

                                            • 0

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

                                              • 0
                                                В качестве шутки и не очень:
                                                npm install -g rimraf
                                                

                                                Прекрасно справляется с удалением своих же длинных папок)
                                            • +11
                                              Осмелюсь вступиться за PHP.

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

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

                                                Экосистема в целом напоминает «зону» Стругацких: поверх враждебной для пользователя среды выросла защита в виде Symfony и иже с ними, но когда приходится выходить за ее пределы, даже старые прожженые сталкеры нет-нет да и напорются на какой-нибудь нежданчик.
                                                • +22
                                                  Почему даже статья про JS вызывает холивары про пых?)
                                                • 0
                                                  Я абсолютно согласен и не отрицаю, что у языка есть существенные недостатки, связанные с тяжёлым грузом легаси, но всё ведь ненастолько печально, как описываете это вы и в своей нише ему сложно найти конкурентов :)

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

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

                                                  Как-то убил пару часов на отладку этого :)
                                                  • +4
                                                    Это вообще-то в документации описано (второй пример).
                                                    Удивительно, как много php программистов ни разу не читали мануал php.
                                                    • +1
                                                      Удивительно как много людей пытаются поставить себя выше других при малейшей возможности.

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

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

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

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

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

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

                                                            «Два часа» из моего сообщения, на самом деле, длились не более 20 минут (хотелось указать на драматизм ситуации с неочевидностями PHP), и, конечно же, я полез читать документацию. Нестоит осуждать людей, если не знаете всей их истории.
                                                        • +2
                                                          А зачем вы дали ссылку на «PLEASURE BOAT ‘’HERCOGS JĒKABS”»?
                                                          • +1
                                                            Лол, вот правильная ссылка — http://php.net/manual/en/function.array-key-exists.php
                                                            В буфере оказалось не то, что я планировал.

                                                            btw Вентспилс — очень приятный город.
                                                        • 0
                                                          Вы считали, что isset() и array_key_exists() — это одна и та же функция?
                                                          • 0
                                                            Нет, что вы. Я не ожидал, что isset() вернёт false на установленное (хоть и в null) значение.
                                                            • 0
                                                              А Вас не смущает, что в SQL-е null != null? Конечно нет, это же описанно и Вы уже на это натыкались.

                                                              К чему это я? К тому, что все имеет свои нюансы и свои тонкости, вот для выявления этих аспектов и нужно читать книги и документацию.
                                                              • +1
                                                                Описание нюансов и тонкостей в документации не отменяет и не оправдывает ущербности дизайна и исполнения.
                                                          • 0
                                                            «Особенность языка», я так-же убил час, понимая разницу между empty() и !isset()
                                                            • –1
                                                              А можно было почитать документацию и потратить на 90% времени меньше…
                                                          • 0
                                                            Не очень актуальны, на самом деле.

                                                            Те неконсистентности, которые можно было исправить, не ломая обратную совместимость, исправили в PHP7.
                                                            Остальное большей частью либо исправлено на уровне фреймворков/библиотек (что, кто-то вручную пользуется curl?), либо просто вкусовщина.
                                                        • +5
                                                          jakobz Хм, и что же не дно по вашему? Был как-то не коференции, где главный разработчик aviasales сказал, что они перешли на python с rails (потому-что каждый запрос кушал 300Мб памяти!!!), и когда его спросили почему не node.js, он сказал что node это г… но. Это не вы случаем были:)?
                                                          • 0
                                                            запрос? не может быть. Если мы берем допустим puma, то много воркеров живут в достаточно адекватных рамках оперативной памяти.
                                                          • +5
                                                            Ну реально — это же самое дно из всего что есть вообще

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


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

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

                                                      • +1
                                                        Это ни о чем не говорит, зависимости тянут другие зависимости, надо проверять все дерево зависимостей, каждого модуля и т.д.
                                                    • 0
                                                      максимально важно, чтобы мы как сообщество начали заботиться о чистоте кода

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

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

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

                                                        • +1
                                                          На самом деле, забавно и круто (читал эту статью в оригинале). Кстати, автору тоннами сыплются комментарии по поводу того, что хоть где-то стоило упомянуть, что это стеб (ну, кроме Гая Фиери частично) — впрочем, может тогда не было бы так весело :)
                                                          • 0
                                                            У меня в проекте используется express и никакого yummy в зависимостях и в node_modules в помине нет!
                                                          • +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
                                                            В нём нет картинки.
                                                            Итого — ни один довод из статьи я не смог подтвердить.
                                                            Судя по всему статья — просто штука, не принимайте всерьёз :)

                                                            • +8
                                                              Ну вы уж заморочились, Шерлок)
                                                              • +22
                                                                В этом и есть смысл статьи — взять и заморочиться. Открыть наконец папку node_modules и посмотреть что в ней происходит. Чтобы история с left-pad больше не повторилась.
                                                                • +2
                                                                  Ну а кто с этим спорит — я про то, что и более поверхностного взгляда на статью достаточно, чтобы понять, что это стеб (для тех, кто использует эти инструменты, конечно же, хотя тема с твитом ну очень уж очевидная в любом случае).
                                                                  • 0
                                                                    И как это помогло бы с left-pad? Это как-то помогло бы предовратить какого-то левого разработчика удалить опубликованный пакет с npm?
                                                                • 0

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

                                                                  • +1
                                                                    Меж зубов бывают промежутки? :)
                                                                  • 0
                                                                    Ну есть коммит, где картинка таки добавляется. Может thejameskyle просто поддержал шутку? :-)
                                                                    • 0
                                                                      Меня только твиттер смутил. Что можно лайкать твиты без авторизации.
                                                                    • +29
                                                                      Блин, а ведь в начале статьи я правда думал, что это правда.
                                                                      • +8
                                                                        я думал, что это правда до тех пор, пока в комменты не посмотрел
                                                                      • +1
                                                                        Все самое интересное — в тегах :)
                                                                        • +5
                                                                          Мобильная версия хабра не показывает теги. =/
                                                                        • +7
                                                                          А еще раз я как-то открыл зависимость из node_modules и у меня ноут сгорел.
                                                                          • 0
                                                                            Главное, что брат от этого не умер.
                                                                          • 0
                                                                            читая статью, задумался о переходе на go вместо node, но потом все встало на свои места
                                                                            • +18
                                                                              Блин, а меня даже тэги не стразу убедили, что это шутка… :(
                                                                              • 0
                                                                                На небольшом проекте, который мы сейчас разрабатываем

                                                                                $ ls -l frontend/app/node_modules/ | wc -l
                                                                                840
                                                                                • 0
                                                                                  Прозреваю npm@3.x. Но все равно дофига.
                                                                                • 0
                                                                                  npm настолько страшная вещь, что я тоже подумал, что это не шутки всё. Только про эмбер не поверил. Не, ну он же на фронтенде, там не может быть столько бесцельных байтов. Если бы не это, я бы принял статью за чистую монету.
                                                                                  • +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?

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

                                                                                        Реальный пример: 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

                                                                                        Занавес.
                                                                                  • +4
                                                                                    Бриттаника спроектирована не по-нодовски. Нужно было для каждого слова сделать отдельный модуль. Чтобы тот, кому нужно определение только одного слова, зависел только от модуля с этим словом.
                                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                                      • 0
                                                                                        Такой вариант модуля должен быть доступен в качестве альтернативы простому. На тот случай, если кому-нибудь нужно вывести определение слова, сделав все слова кликабельными.
                                                                                    • 0
                                                                                      Как же мучаются люди без F3 в Total Commander.
                                                                                      • +1

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

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

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

                                                                                        • +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
                                                                                          • +2
                                                                                            Шутки-шутками, но на мой взгляд (хотя я в node.js/npm скорее новичок) примерно так дела и обстоят. Возникла у меня на днях не гипотетическая а реальная необходимость уменьшить размер node_modules. Начал с разбора зависимостей модуля request, нашёл и картинки, и папки test и «толстые» .md файлы и кривые .npmignore. Не понимаю, почему нет какой-нибудь штатной опции минификации для деплоя
                                                                                            • 0
                                                                                              Это же не для деплоя в любом случае. Не могу представить людей, которые заливают весь node_modules в продакшн.
                                                                                              • 0
                                                                                                не совсем понял что значит «Это же не для деплоя в любом случае»? Node.js крутится на сервере, обрабатывает запросы, использует в своей работе ряд модулей из node_modules. Есть Backend-As-A-Service платформа(ы), которые предоставляют разработчику возможность использовать node.js, но налагают различные ограничения и квоты, в частности на общий размер кодовой базы, вместе с node_modules. Вот и приходится извращаться, в ручном режиме просеивать. Может я какой-то очевидный простой путь не знаю, поделитесь если есть?
                                                                                                • 0
                                                                                                  Эм, в статье по-моему говориться про npm для фронтэнда (как минимум Ember)? Драма в том, что если ты не используешь node.js на бэкэнде, c npm все равно придется иметь дело или, еще хуже, с каким-нибудь bower. Ну и там вообщем-то знаешь какие файлы тебе нужны и выдергиваешь их из node_modules.
                                                                                                  С бэкэндом: захотели ноду — нате, тут я считаю все честно.
                                                                                              • 0
                                                                                                Возникла у меня на днях не гипотетическая а реальная необходимость уменьшить размер node_modules.

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

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

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

                                                                                                Тонко подмечено. К сожалению, это не шутка. И пользуются этим недоразумением куда больше 20 человек
                                                                                                • –2
                                                                                                  Я не пойму, а каким образом я закачивая express делаю что-то с твитом?
                                                                                                  Твитор должен быть в консоли npm? или как?
                                                                                                  • 0
                                                                                                    Бывает. Я в только что устанновленном Wordpress в SQL базе в таблице wpha_options нашел 2 мегабайта текстового мусора. К этой таблице постоянно идут 100500 запросов как от самого Вордпресса, так и от разных плагинов. Теперь ясно почему вордпресс так тормозит.
                                                                                                    • 0
                                                                                                      Ну разберись там со своим мусором, потому что после установки WP, таблица wp_options весит ~ 96 KiB
                                                                                                    • –3
                                                                                                      Да простят меня за гифку

                                                                                                      image
                                                                                                      • +3

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

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

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


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

                                                                                                            • 0

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

                                                                                                              • +1
                                                                                                                Большинству не нравятся картинки где что-то мелькает и дергается. Офигеть, да?
                                                                                                            • +2
                                                                                                              А можно для непонятливых, что вы хотели донести? оно мелькает и я не могу уловить смысл. Редко нпм использую что бы понять)

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