node_modules

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

node_modules — властная директория в проектах на основе Node.js, где хранятся сторонние пакеты и модули нах.

Описание[править]

С самого начала npm использовал директорию node_modules как локальное хранилище зависимостей проекта. В отличие от многих других языковых экосистем того времени, где зависимости устанавливались глобально или в системные директории, Node.js работал весьма херобринно, так, что каждый проект хранит собственную копию всех используемых библиотек.

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

Все пакеты, перечисленные в секциях dependencies и devDependencies файла package.json, после установки размещаются в node_modules. Каждый пакет занимает отдельную поддиректорию, названную по имени пакета. Каждый проект обладает собственным изолированным набором зависимостей. Два разных проекта на одной машине могут использовать разные версии одного и того же пакета без каких-либо конфликтов.

Внутри node_modules существует поддиректория .bin, содержащая симлинки на исполняемые скрипты установленных пакетов. Именно из этой директории npm-скрипты, определённые в секции scripts файла package.json, получают доступ к инструментам. Когда в коде встречается инструкция require('some-package') или import 'some-package', Node.js ищет этот пакет именно в директории node_modules.

Каждая поддиректория пакета обычно содержит собственный package.json, описывающий мета-информацию о пакете, его точки входа и зависимости.

В крупных проектах эта директория легко достигает нескольких гигабайт и содержит десятки тысяч файлов. Ведь пакет A зависит от B, B зависит от C, C — от десятков других пакетов. Граф зависимостей может оказаться значительно шире, чем предполагает клоунидзе на кодере. Многие пакеты всираются с тестами, документацией, исходными файлами TypeScript.

Тяжело нах…

Особенности[править]

  • Помимо официального npm, вполне можно восрать иные менеджеры модулей, скажем Yarn или pnpm. Последний работает несколько иначе, чтобы избавить от скачки одного и того же много раз. Вместо того чтобы копировать файлы пакетов в каждый проект, pnpm создаёт жёсткие ссылки из глобального кэша в локальный node_modules.
  • Первые версии npm создавали строго вложенную структуру node_modules: каждый пакет имел собственную директорию node_modules внутри себя, содержащую все его зависимости. Это приводило к глубокой вложенности, иногда превышавшей ограничение длины пути Windows в 260 символов. Начиная с npm v3 был введён механизм уплощения, когда менеджер пакетов старается поднять зависимости как можно выше по дереву директорий, в корневой node_modules. Вложенные node_modules создаются только в случае реального конфликта версий.
Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикFortran (Профессор)
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++ScalaH и Ё+
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёздыПрограммист (существо)Тернарный операторUnreal MCPИсходный кодSingle-Page ApplicationGiteaForgejoCephIDEДжуниорРепозиторий
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplaceФреймворкБыдлокодIndex.phpОхота за жукамиКуМирКлеточный автоматПроцедурное программированиеПоиск файлов в Unix по содержимомуPetoohФункция активации нейронаПерегрузка операторов в PythonЗерокодинг
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3DКнижный PythonMallocСвязный списокSOLIDООПУказательNULLWeLang++XenonRecompFuse.jsОптимизацияТестированиеAmbreon866Реверс-инжинирингКроссплатформенностьJSON
ЛюдиИлья КанторЮрий КлючевскийЭдуард ЛаасЭдвард СноуденСеймур ПейпертПроблемаK!ockyTypeScriptОтладчикБитЭффективный менеджер (IT)TauriReact NativeWindows APIТипPyTorchTensorFlowПарсерNode.jsFastAPIVue.jsSvelteБэкендElectronBroken Object Level AuthorizationМаппингДжастин ФранкельHex-редакторVisual Basic .NETNext.jsDocker ComposeNode modulesIndexedDB
Прочее++i + ++iДедлайн%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодачХукCurl cffiВибе-кодингFlutterАппликативный оператор