Использование символа @в именах модулей 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.
Ответы
Ответ 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?