javascript - Uso del símbolo @ en los nombres de los módulos de nodo
node.js npm (5)
Además de los paquetes de ámbito, la ''@'' puede surgir debido al paquete de
alias de módulo
en npm.
Mediante el alias de módulos, puede usar módulos de uso frecuente sin requerir su ruta completa.
También es efectivo cuando la estructura del directorio es larga.
ej.)
require(''../../../../some/very/deep/module'')
En su lugar, puede usar:
var module = require(''@deep/module'')
En package.json puede proporcionar los módulos para los que está proporcionando 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
}
Y en el archivo principal de la aplicación use esto:
require(''module-alias/register'');
Consulte aquí para obtener información detallada: module-alias
Estoy mirando un código de un compañero de trabajo que escribió y está usando el símbolo
@
en las declaraciones obligatorias.
Esta es la primera línea de uno de estos archivos:
var restServer = require(''@company/config'')
Cuando intento ejecutar este código, aparece un error:
Error: Cannot find module ''@company/config''
Lo que francamente espero, ¡no hay nada que se vea así en mi directorio que deba reconocer! Parece que hay algo de magia aquí, lo cual odio.
Todo lo que puedo adivinar es que este es un oscuro truco npm o Node al que no he estado expuesto, o tal vez hay algún otro arte oscuro de configuración que no estoy entendiendo.
Cualquier información apreciada, incluso si es solo una explicación de cómo funciona
@
require.
Otras ideas: Chef está involucrado en algún lugar de todo esto, por lo que podría ser relevante.
Actualización
: 99% seguro de que este es un problema con la forma en que funciona
npm config
en este momento, pero aún no está seguro de cómo solucionarlo.
Update2 basado en algunas cosas que descubrí:
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.
Así que lo resolví yo mismo.
Resulta que
@company/config
es uno de nuestros repositorios privados de NPM, alojado en npm y definido por este alias en un repositorio interno de GitHub: no tenía nada que ver con cómo funciona.
Usar
@
puede o no ser un protocolo que desconocía para los repositorios privados de NPM, tenlo en cuenta si te encuentras con esto.
Cuando llamas a
require()
, lee una ruta.
Dado que parece que no hay problema si nombra una carpeta como
@company
, debería poder solicitar algo con una
@
.
Es posible que su compañero de trabajo haya querido quedarse con
@company/config.js
para sí mismo porque las configuraciones generalmente son personales y podrían no ser las mismas para otro usuario.
require
llamará a los archivos dentro de su carpeta de proyecto, con un detalle:
-
Si llama archivos dentro de las carpetas de su proyecto, debe agregar
./
delante de su ruta. -
Si llama a cualquier paquete global como
http
o cualquier módulonpm
(que están instalados ennode_modules
), puede omitir el./
.
Creé una ruta
@company/config
dentro de mi carpeta de proyecto de prueba.
Solo me permitió requerirlo usando
./@company/config
.
Solo cuando moví la carpeta dentro de
node_modules
, me permitió
require(''@company/config'');
.
No recomendaría poner ningún módulo dentro de
node_modules
, es solo un ''contenedor'' para paquetes
npm
.
Intente crear un nuevo archivo de configuración y cambie la ruta requerida o simplemente elimine el requisito y cree un objeto de configuración en su archivo principal.
Los paquetes con ámbito en npm están precedidos por un símbolo ''@'': https://docs.npmjs.com/misc/scope
Los documentos incluyen información adicional sobre la necesidad de paquetes con alcance: https://docs.npmjs.com/misc/scope#requiring-scoped-packages
Requerir paquetes con alcance
Debido a que los paquetes con ámbito se instalan en una carpeta de alcance, debe incluir el nombre del alcance cuando los requiera en su código, p. Ej.
require(''@myorg/mypackage'')
No hay nada especial en la forma en que Node trata las carpetas de alcance, esto solo especifica que se requiere el módulo mypackage en la carpeta llamada @myorg.
El alcance
@
indica la propiedad del paquete
La principal ventaja de los ámbitos que he visto hasta ahora es que cada ámbito está controlado por la cuenta npm de una organización / usuario, al igual que los nombres de usuario / nombres de organizaciones de GitHub.
De esta manera, facilita determinar si el paquete que está buscando pertenece a una organización en la que confía, o si es una herramienta de terceros.
Por ejemplo, si ves:
@angular/cli
entonces sabes que proviene del equipo de Angular y se puede confiar.
Por otro lado, no se podría decir lo mismo sobre:
angular-cli
Consulte también: ¿Cuál es el significado del prefijo "at" (@) en los paquetes npm?