it-swarm.com.ru

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

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

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

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

Error: Cannot find module '@company/config'

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

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

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

Обновление : 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.
49
Derek Janni

Так что я решил это сам.

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

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

11
Derek Janni

Пакетам с областями видимости в npm предшествует символ «@»: https://docs.npmjs.com/misc/scope

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

Требование пакетов с областью действия

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

require('@myorg/mypackage')

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

27
vaer-k

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

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

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

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

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

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

2
user5402942

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

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

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

"_moduleAliases": {
  "@root"      : ".", // Application's 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');

Обратитесь сюда для получения подробной информации: псевдоним модуля

0
Pransh Tiwari

Область действия указывает на владение пакетом

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

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

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

@angular/cli

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

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

angular-cli

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