web-dev-qa-db-fra.com

Utilisation du symbole @ dans les noms de module de nœud

Je regarde un code écrit par une collègue et elle utilise le symbole @ dans les instructions require. C'est la première ligne de l'un de ces fichiers:

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

Lorsque j'essaie d'exécuter ce code, j'obtiens une erreur:

Error: Cannot find module '@company/config'

Ce à quoi je m'attends franchement, il n'y a rien qui ressemble à ceci dans mon annuaire pour qu'il soit nécessaire de le reconnaître! On dirait qu'il y a de la magie ici, que je déteste.

Tout ce que je peux deviner, c’est qu’il s’agit d’un truc obscur de NPM ou d’un truc de Nœud auquel je n’ai pas été exposé, ou peut-être qu’il existe un autre art sombre de la configuration que je ne comprends pas. Toute information appréciée, même s’il ne s’agit que d’une explication du fonctionnement de @ avec require.

Autres idées: Chef est impliqué quelque part dans cette affaire, donc cela pourrait être pertinent. 

Mise à jour : 99% sont certains qu'il s'agit d'un problème lié à la façon dont fonctionne npm config à ce stade, mais vous ne savez toujours pas comment y remédier. 

Update2 basé sur des informations que j'ai découvertes: 

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

Alors j'ai résolu celui-ci moi-même.

@company/config est l'un de nos référentiels NPM privés, hébergé sur npm et défini par cet alias dans un référentiel GitHub interne: cela n'a rien à voir avec le fonctionnement de require

Utiliser @ peut être ou ne pas être un protocole que je ne connaissais pas pour les dépôts NPM privés, gardez cela à l'esprit si vous rencontrez ce problème.

11
Derek Janni

Lorsque vous appelez require(), il lit un itinéraire. Comme il semble n'y avoir aucun problème si vous nommez un dossier comme étant @company, vous devriez pouvoir demander quelque chose avec un @

Votre collègue peut avoir voulu garder @company/config.js pour elle-même car les configurations sont généralement personnelles et ne pourraient pas être les mêmes pour un autre utilisateur. 

require appellera des fichiers dans votre dossier de projet, avec un détail:

  • Si vous appelez des fichiers dans vos dossiers de projet, vous devez ajouter ./ devant votre route. 
  • Si vous appelez un package global tel que http ou des modules npm (installés à node_modules), vous pouvez omettre le ./.

J'ai créé un itinéraire @company/config dans le dossier de mon projet de test. Cela m'a seulement permis de l'exiger en utilisant ./@company/config. Ce n’est que lorsque j’ai déplacé le dossier dans node_modules que cela m’a permis de require('@company/config');

Je ne recommanderais pas de mettre n'importe quel module dans node_modules, c'est juste un 'conteneur' pour les paquets npm. Essayez de créer un nouveau fichier de configuration et de modifier l'itinéraire requis ou supprimez-le simplement et créez un objet de configuration dans votre fichier principal.

2
user5402942

Mis à part les paquets scoped, le '@' peut survenir à cause du paquet module-alias dans npm. Grâce aux alias de module, vous pouvez utiliser les modules fréquemment utilisés sans requérir son chemin complet. En outre, il est efficace lorsque la structure de répertoire est longue. par exemple) require('../../../../some/very/deep/module')

À la place, vous pouvez utiliser: var module = require('@deep/module')

Dans package.json, vous pouvez fournir les modules pour lesquels vous fournissez un alias:

"_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
}

Et dans le fichier principal de l'application, utilisez ceci:

require('module-alias/register');

Référez-vous ici pour des informations détaillées: module-alias

0
Pransh Tiwari

La portée indique la propriété du paquet

Le principal avantage des portées que j'ai observées jusqu'à présent est que chaque portée est contrôlée par le compte npm d'une organisation/utilisateur, un peu comme les noms d'utilisateur GitHub.

De cette façon, il est facile de déterminer si le package que vous regardez appartient à une organisation en laquelle vous avez confiance, ou s'il s'agit d'un outil tiers.

Par exemple, si vous voyez:

@angular/cli

alors vous savez que cela vient de l’équipe angulaire et que vous pouvez vous y fier.

Par contre, on ne pouvait pas en dire autant de:

angular-cli

Voir aussi: Quelle est la signification du préfixe "at" (@) sur les packages npm?