Это работает без установленной зависимости lodash:
const _ = require('lodash');
_.each([1,2,3],console.info);
(нет, у меня глобально не установлен lodash)
Я где-то видел что-то вроде того, что nodejs поддерживает lodash по умолчанию, но теперь я не могу найти никакой документации по этому поводу. Это наконец правда? Где я могу прочитать об этом?
P.S. Наконец, я нашел и удалил node_modules в своем домашнем каталоге, и вся магия исчезла, теперь этот скрипт выдает ошибку из-за отсутствия зависимости. Спасибо, ребята, за помощь в этом расследовании.





Библиотека не встроена в node. Вы можете посмотреть полный список встроенных модулей @
https://github.com/nodejs/node/tree/master/lib
Не совсем. Нет смысла собирать 100K+ lib из коробки и предполагать, что она будет использоваться разработчиком. Например, рассмотрим этот пример Repl
Это сделает среду узла и установит любые пакеты, указанные в операторах require. Если ничего не предусмотрено, это просто node, ничего больше.
Как видите, из коробки вы получите _ is not defined. но в тот момент, когда вы добавите const _ = require('lodash'), он станет для вас lodash auto-install, и вы получите желаемый результат. Для удобства это делается с помощью инструмента Repl., так что вам не нужно делать npm install ... и т. д. Но из коробки нода не упакована с lodash.
Также с ES6 больше не существует большого количества вариантов использования lodash, и как только ES6 получит широкую поддержку, аргумент о совместимости lodash с браузером также не будет иметь такого значения. Так что в будущем будет даже меньше смысла связывать его с узлом.
Однако интересно то, что npm, включенный как deps в репозиторий узлов, имеет зависимости от lodash :).
Есть ли какой-нибудь документ об этой функции автоматической установки? Какие пакеты я могу или не могу использовать таким образом? Будет ли он поддерживаться в будущем? Безопасно ли не указывать lodash в package.json? Особенно в случае разработки другого пакета, который зависит от lodash.
Вы должны явно указать свои зависимости в своем модуле. Не полагайтесь на предположения, что lodash is/would be/should be является частью node.
Мне не терпится услышать об этой функции "автоматической установки" - я никогда о ней не слышал.
@Chris Я думаю, что я, вероятно, не очень хорошо поработал со своим ответом, если он относился к "функции" auto-install. Тот, который существует в Repl tool, выполняет автоматическую установку, поскольку обнаруживает зависимости, но это веб-среда. так что это сделано для удобства. Я утверждаю, что из коробки нет lodash с node.
Я думаю, что Акрион частично прав в том, что он говорит (ему больше не нужен lodash, lodash по умолчанию не является частью узла).
Я предполагаю, почему он работает, заключается в том, что у вас есть необходимая библиотека, которая, в свою очередь, зависит от lodash, и любой используемый вами сборщик выбирает ее таким образом.
Рискну предположить, что если вы откроете папку node_modules, там будет находиться lodash. Просмотрите свой файл package.lock (или файл блокировки пряжи) и посмотрите, что включает в себя lodash.
РЕДАКТИРОВАТЬ Как было обнаружено в комментариях, в домашнем каталоге была папка node_modules.
Я только что создал тестовый скрипт вне любого проекта, там нет node_modules, но теперь я подозреваю, есть ли какие-то в одном из родителей. Необходимо провести расследование.
В тестовом сценарии вне любого проекта - вы говорите, что все еще можете импортировать lodash ?? Если да, то вы на 100% уверены, что он не установлен глобально?
Да, скрипт из моего вопроса просто работает, без каких-либо трений npm. Но теперь я вижу node_modules в моем домашнем каталоге, и там установлен lodash, поэтому я, вероятно, установил его некоторое время назад по ошибке. Я удалил его, и вся магия lodash исчезла.
Ха-ха, ну разве это не головокружение!
Я написал пакет с отсутствующим lodash dep, который уже устанавливался несколько сотен раз - на отсутствие зависимостей никто не жаловался. Слишком рано говорить, что lodash больше не нужен.
Я не возражаю - использование lodash действительно зависит от вашего проекта, вашей предполагаемой поддержки, ваших инструментов сборки и т. д.
Так почему же код из моего вопроса работает? Может быть, npm предварительно загружает его без явного запроса?