¿Cuál es el significado del prefijo “at” (@) en los paquetes npm?

En la documentación del Enrutador de componentes angulares, me tropecé con un comando npm que nunca había visto antes y no entiendo lo que está sucediendo:

npm install @angular/router --save 

¿Cuál es el significado de @angular/router ?

¿Toda la cadena es un nombre de paquete? Pero luego no encuentro ese paquete cuando uso la búsqueda en npmjs.com . Y también la búsqueda de línea de comandos no devuelve dicho paquete:

 npm search @angular/router :No match found for "@angular/router" 

Entonces, ¿el @angular/ algún tipo de mecanismo de prefijo en npm? Y, ¿cómo funciona?

Esta es una nueva característica de NPM llamada ‘paquetes de scope’, que permite efectivamente que los paquetes de NPM tengan un espacio de nombres. Todos los usuarios y organizaciones en NPM tienen su propio scope, y son las únicas personas que pueden agregarle paquetes.

Esto es útil por varias razones:

  • Permite a las organizaciones aclarar qué paquetes son ‘oficiales’ y cuáles no.
    • Por ejemplo, si un paquete tiene el scope @angular , usted sabe que fue publicado por el equipo central Angular.
  • El nombre del paquete solo debe ser exclusivo del scope en el que se publica, no del registro completo.
    • Por ejemplo, el nombre del paquete http ya se tomó en el repository principal, pero Angular también puede tener @angular/http .

La razón por la cual los paquetes de scope no aparecen en la búsqueda pública se debe a que muchos de ellos son paquetes privados creados por organizaciones que utilizan los servicios pagados de NPM, y no se sienten cómodos abriendo la búsqueda hasta que pueden estar totalmente seguros de que no están va a hacer algo público que no debería ser público: desde una perspectiva legal, esto es bastante comprensible.

Para obtener más información, consulte los documentos de NPM y los documentos angulares .

EDITAR: ¡Parece que los paquetes de ámbito público ahora aparecen correctamente en la búsqueda!

Básicamente hay dos tipos de módulos de npm que son:

  • Módulos globales: estos son módulos que siguen la convención de nomenclatura que existe hoy en día. Usted require('foo') y hay mucho regocijo. Son propiedad de una o más personas a través del comando npm XYZ .

  • Módulos abarcados: estos son módulos nuevos que tienen un “scope” bajo un nombre de organización que comienza con un @ y seguido de una barra diagonal, por ej. @somescope/somepackagename . Los ámbitos son una forma de agrupar paquetes relacionados, y también afectan algunas cosas sobre la forma en que npm trata el paquete.

Un paquete de ámbito se instala haciendo referencia a él por su nombre, precedido por un símbolo @, en la instalación de npm:

 npm install @myorg/mypackage 

ver también