Подтвердить что ты не робот

Использование символа @в именах модулей Node

Я смотрю на код, написанный коллегой, и она использует символ @ в запросах. Это первая строка одного из этих файлов:

var restServer = require('@company/config')

Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке:

Error: Cannot find module '@company/config'

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

Все, что я могу догадаться, заключается в том, что либо это какой-то непонятный трюк npm или Node, с которым я не подвергался, или, может быть, там есть другое темное искусство конфигурации, которое я не получаю. Любая информация, оцененная, даже если это просто объяснение того, как работает @, требует.

Другие идеи: шеф-повар вовлечен где-то во все это, так что это может быть актуально.

Обновление: 99% уверены, что это проблема с тем, как работает npm config, но все еще не уверен, как это сделать.

Update2 на основе некоторых вещей, которые я раскрыл:

Dereks-MacBook-Pro:project-dir derekjanni$ npm config set //registry.npmjs.org/:authtoken $SECRET_TOKEN

Dereks-MacBook-Pro:project-dir derekjanni$ npm install
npm ERR! Darwin 15.0.0
npm ERR! argv "/usr/local/Cellar/node/5.5.0/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v5.5.0
npm ERR! npm  v3.5.3
npm ERR! code E404
npm ERR! 404 Not found : @company/config
npm ERR! 404  '@company/config' is not in the npm registry.
4b9b3361

Ответ 1

Итак, я решил это сам.

Выключает @company/config - это один из наших частных репозиториев NPM, размещенный на npm и определенный этим псевдонимом для внутреннего репозитория GitHub: он не имеет никакого отношения к тому, как работает require.

Использование @ может быть или не быть протоколом, который я не знал о частных репозиториях NPM, помните об этом, если вы столкнетесь с этим.

Ответ 2

Пакетным пакетам в npm предшествует символ "@": https://docs.npmjs.com/misc/scope

Документы включают дополнительную информацию о требованиях к областям: https://docs.npmjs.com/misc/scope#requiring-scoped-packages

Необходимые пакеты

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

require('@myorg/mypackage')

Нет ничего особенного в том, как Node обрабатывает области папок, это просто указывает на необходимость использования модуля mypackage в папке с именем @myorg.

Ответ 3

Когда вы вызываете require(), он читает маршрут. Поскольку, кажется, нет проблем, если вы назовете папку как @company, вы можете потребовать что-то с @.

Возможно, ваш коллега пожелал сохранить @company/config.js для себя, потому что конфигурации обычно являются персональными и не могут быть одинаковыми для другого пользователя.

require будет вызывать файлы внутри папки проекта с подробной информацией:

  • Если вы вызываете файлы внутри папок проекта, вы должны добавить ./ перед вашим маршрутом.
  • Если вы вызываете любой глобальный пакет, например http или любые npm модули (которые установлены в node_modules), вы можете опустить ./.

Я создал маршрут @company/config внутри моей тестовой папки проекта. Это позволило мне потребовать его с помощью ./@company/config. Только когда я переместил папку внутри node_modules, это позволило мне require('@company/config');.

Я бы не рекомендовал размещать какой-либо модуль внутри node_modules, это просто "контейнер" для пакетов npm. Попробуйте создать новый файл конфигурации и изменить требуемый маршрут или просто удалить запрос и создать объект конфигурации в основном файле.

Ответ 4

Помимо пакетов с областью действия, "@" может возникнуть из -за пакета модулей с псевдонимом в npm. С помощью модульного сглаживания вы можете использовать часто используемые модули, не требуя полного пути. Также он эффективен, когда структура каталогов длинна. например) require('../../../../some/very/deep/module')

Вместо этого вы можете использовать: var module = require('@deep/module')

В пакете.json вы можете предоставить модули, для которых вы предоставляете псевдоним:

"_moduleAliases": {
  "@root"      : ".", // Application root
  "@deep"      : "src/some/very/deep/directory/or/file",
  "@my_module" : "lib/some-file.js",
  "something"  : "src/foo", // Or without @. Actually, it could be any string
}

И в главном файле приложения используйте это:

require('module-alias/register');

Подробнее см. Здесь: module-alias

Ответ 5

@ Scope обозначает владение пакетом

Основное преимущество областей, которые я видел до сих пор, заключается в том, что каждая область контролируется учетной записью npm организации/пользователя, так же, как имена пользователей/имена организаций GitHub.

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

Например, если вы видите:

@angular/cli

тогда вы знаете, что это исходит от команды Angular и вам можно доверять.

С другой стороны, то же самое нельзя сказать о:

angular-cli

Смотрите также: Что означает префикс "at" (@) в пакетах npm?