it-swarm.com.de

Verwendung des @ -Symbols in Knotenmodulnamen

Ich schaue mir einen Code von einem Kollegen an und sie verwendet das @-Symbol in den request-Anweisungen. Dies ist die erste Zeile einer dieser Dateien:

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

Wenn ich versuche, diesen Code auszuführen, erhalte ich eine Fehlermeldung:

Error: Cannot find module '@company/config'

Was ich ehrlich gesagt erwarte, es gibt nichts, was in meinem Verzeichnis so aussieht, als müsste man es erkennen! Es scheint, als ob hier etwas Magie vorgeht, was ich hasse.

Ich kann nur vermuten, dass dies entweder ein obskurer Npm- oder Knotentrick ist, dem ich nicht ausgesetzt war, oder dass es vielleicht eine andere dunkle Konfigurationskunst gibt, die ich nicht bekomme. Alle Informationen werden geschätzt, auch wenn es nur eine Erklärung dafür ist, wie @ damit arbeitet.

Andere Ideen: Der Koch ist irgendwo in diese Sache involviert, so dass dies relevant sein könnte. 

Update : 99% sicher, dass dies ein Problem mit der Funktionsweise von npm config an diesem Punkt ist, aber immer noch unsicher, wie das Problem behoben werden kann. 

Update2 basierend auf einigen Dingen, die ich entdeckt habe: 

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

Also habe ich das selbst gelöst.

Es stellte sich heraus, dass @company/config eines unserer privaten NPM-Repositorys ist, das auf npm gehostet wird und von diesem Alias ​​zu einem internen GitHub-Repository definiert wird: Es hatte nichts mit der Funktionsweise von require zu tun. 

Die Verwendung von @ ist möglicherweise ein Protokoll, das mir für private NPM-Repos nicht bekannt war. Denken Sie daran, wenn Sie auf dieses Problem stoßen.

11
Derek Janni

Umfangreiche Pakete in npm werden durch ein @ -Zeichen vorangestellt: https://docs.npmjs.com/misc/scope

Die Dokumente enthalten zusätzliche Informationen zur Anforderung von Paketen mit Umfang: https://docs.npmjs.com/misc/scope#requiring-scoped-packages

Bedarfspakete anfordern

Da Umfangspakete in einem Bereichsordner installiert werden, müssen Sie Geben Sie den Namen des Bereichs an, wenn Sie ihn in Ihrem Code benötigen, z.

require('@myorg/mypackage')

Es ist nichts Besonderes an der Art und Weise, wie Node Bereichsordner behandelt, dies gibt nur an, dass das Modul mypackage im Ordner .__ erforderlich ist. @myorg genannt.

27
vaer-k

Wenn Sie require() aufrufen, wird eine Route gelesen. Da es anscheinend kein Problem zu sein scheint, wenn Sie einen Ordner als @company benennen, sollten Sie in der Lage sein, etwas mit einem @ anzufordern. 

Ihr Kollege wollte @company/config.js vielleicht für sich behalten, weil Konfigurationen normalerweise persönlich sind und für einen anderen Benutzer nicht gleich sein können. 

require ruft Dateien in Ihrem Projektordner mit einem Detail auf:

  • Wenn Sie Dateien in Ihren Projektordnern aufrufen, müssen Sie ./ vor Ihrer Route hinzufügen. 
  • Wenn Sie ein globales Paket wie http oder beliebige npm-Module (die unter node_modules installiert sind) aufrufen, können Sie den ./ weglassen.

Ich habe eine Route @company/config in meinem Testprojektordner erstellt. Es erlaubte mir nur, es mit ./@company/config zu verlangen. Erst als ich den Ordner in node_modules verschoben habe, konnte ich require('@company/config');

Ich würde nicht empfehlen, ein Modul in node_modules einzufügen, es ist nur ein "Container" für npm-Pakete. Versuchen Sie, eine neue Konfigurationsdatei zu erstellen und die erforderliche Route zu ändern, oder löschen Sie einfach die Anforderung und erstellen Sie ein Konfigurationsobjekt in Ihrer Hauptdatei.

2
user5402942

Abgesehen von Umfangspaketen kann das '@' durch das Paket module-alias in npm entstehen. Durch das Modul-Aliasing können Sie häufig verwendete Module verwenden, ohne ihren gesamten Pfad zu benötigen. Es ist auch effektiv, wenn die Verzeichnisstruktur lang ist. z. B. require('../../../../some/very/deep/module')

Stattdessen können Sie verwenden: var module = require('@deep/module')

In package.json können Sie die Module angeben, für die Sie einen Alias ​​angeben:

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

Und in der Hauptdatei der App verwenden Sie Folgendes:

require('module-alias/register');

Ausführliche Informationen finden Sie hier: module-alias

0
Pransh Tiwari

Der Geltungsbereich zeigt Paketbesitz an

Der größte Vorteil von Geltungsbereichen, die ich bisher gesehen habe, ist, dass jeder Geltungsbereich vom npm-Konto einer Organisation/eines Benutzers gesteuert wird, ähnlich wie bei den GitHub-Benutzernamen.

Auf diese Weise können Sie leicht feststellen, ob das von Ihnen betrachtete Paket zu einer Organisation gehört, der Sie vertrauen, oder ob es sich um ein Tool von Drittanbietern handelt.

Zum Beispiel, wenn Sie sehen:

@angular/cli

dann wissen Sie, dass es vom Angular-Team stammt und dem man vertrauen kann.

Auf der anderen Seite konnte dasselbe nicht gesagt werden über:

angular-cli

Siehe auch: Was bedeutet das "at" (@) - Präfix bei npm-Paketen?