Ir al contenido principal

La función del @ en los imports de Javascript / Typescript

 ¿Por qué hay una '@' en algunos imports?


La @ al principio de una ruta de importación en JavaScript (como en @inertiajs/react o @/components) tiene dos significados principales, dependiendo del contexto, pero ambos buscan hacer las importaciones más claras y fáciles de manejar:


1. @ para Paquetes con "Scope" (Scoped Packages)

Este es el uso más formal y estandarizado en el ecosistema de paquetes de Node.js y npm/Yarn.

  • ¿Qué es? Un paquete "scoped" (con ámbito) es un paquete de npm cuyo nombre comienza con @ seguido del nombre de un "scope" (alcance o ámbito) y una barra (/), y luego el nombre real del paquete.

  • Formato: @scope/package-name

  • Propósito:

    • Organización: Permite que las organizaciones o equipos publiquen múltiples paquetes bajo un mismo "nombre de equipo" o "namespace" sin conflictos de nombres. Por ejemplo, todos los paquetes oficiales de React de Meta se encuentran bajo el scope @types para TypeScript (como @types/react, @types/node).

    • Paquetes Oficiales/Relacionados: A menudo, los scopes se utilizan para denotar paquetes oficiales o relacionados con un proyecto principal. En tu ejemplo, @inertiajs/react es el paquete oficial de React para el framework Inertia.js. Si hubiera un paquete para Vue, probablemente sería @inertiajs/vue.

    • Evitar Colisiones: Garantiza que los nombres de los paquetes sean únicos. Por ejemplo, varias personas podrían querer publicar un paquete llamado utils, pero solo una puede hacerlo. Con scopes, @myorg/utils y @anotherorg/utils pueden coexistir.

Ejemplo:

JavaScript
import { Head, Link, usePage } from '@inertiajs/react'; // Paquete "scoped"

Aquí, @inertiajs es el scope, y react es el nombre del paquete dentro de ese scope. Cuando instalas esto, lo haces con npm install @inertiajs/react.


2. @ para Alias de Rutas (Path Aliases)

Este es un uso más común en proyectos de frontend (como los construidos con Vite, Webpack, Next.js, etc.) y no está directamente relacionado con paquetes de npm.

  • ¿Qué es? Es una convención para definir rutas abreviadas que apuntan a directorios específicos dentro de tu propio proyecto.

  • Propósito:

    • Evitar Rutas Relativas Largas: Imagina que tienes un componente anidado muy profundo: src/pages/dashboard/users/components/UserCard.jsx. Si necesitas importar un utility que está en src/utils/formatters.js, la importación relativa sería ../../../../utils/formatters. Esto es propenso a errores y difícil de leer.

    • Estabilidad: Si mueves el archivo UserCard.jsx, tendrías que actualizar la ruta relativa. Con un alias, la ruta absoluta del alias permanece constante.

    • Claridad: import { formatCurrency } from '@/utils/formatters'; es mucho más claro que la ruta relativa.

  • Configuración: Estos alias se configuran en la herramienta de compilación (bundler) o en el archivo de configuración de TypeScript:

    • Vite: En vite.config.js (usando el plugin @rollup/plugin-alias).

    • Webpack: En webpack.config.js.

    • Next.js: Soporte nativo para @/.

    • TypeScript: En tsconfig.json bajo la sección paths.

Ejemplo:

JavaScript
import MyButton from '@/components/MyButton'; // Alias
import API from '@/api/index';              // Alias

Aquí, @ no significa un scope de npm. En cambio, es un alias configurado que podría apuntar a la carpeta src/ o src/components, dependiendo de tu configuración.


Conclusión

Así que, cuando veas una @ en una importación:

  • Si está seguida de una barra y otro nombre (@scope/package), es un paquete con "scope" de npm.

  • Si está seguida de un nombre de carpeta y luego el nombre de un archivo (@/folder/file), es un alias de ruta configurado en tu proyecto.

Ambos usos contribuyen a un código más organizado, legible y, en el caso de los alias, más fácil de mantener.

Comentarios

Entradas populares de este blog

Crear proyecto de frontend con Vite, React, Tailwind, Typescript y JSX

 ¿Cómo se crea un proyecto exclusivo de frontend con Vite, React, Tailwind, Typescript y JSX? ¡Absolutamente! Entiendo que quieres la guía completa para pasar de cero a tener un proyecto de frontend moderno, vacío y listo para ser llenado con tu código. A continuación, te proporciono un archivo de guía detallada que incluye todos los comandos necesarios para inicializar el proyecto, configurar Tailwind CSS, y los pasos clave para empezar a "poblarlo". Voy a generar un documento Markdown con la guía paso a paso, incluyendo los comandos de terminal y las modificaciones esenciales a los archivos de configuración. Guía: Creación de un Proyecto Frontend Puro (Vite, React, TypeScript, Tailwind) Este documento detalla el proceso para inicializar un proyecto de frontend vacío y optimizado, utilizando Vite como empaquetador, React como librería, TypeScript para tipado y Tailwind CSS para estilizado. 1. Inicialización del Proyecto con Vite Vite es la herramienta más rápida para emp...

Tokens V2

Tokens: Programme to discover tokens, where there are not. Now available at  https://puszcza.gnu.org.ua/projects/tokens/ This is Version 2, for  version 1, go here . Synopsis: use TokensV2; sub printFile; my @FORMAT = ( ['<Message Date=".*?" Time=".*?" DateTime=".*?" SessionID=".*?"><From>(?:<User FriendlyName=".*?"/>)+</From><To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style=".*?")?>.*?</Text></Message>',   sub {     my $fh = $_[1];     my ($d, $t, $f, $s, $T) = $_[0] =~ m|<Message Date="(.*?)" Time="(.*?)" DateTime=".*?" SessionID=".*?">(<From>(?:<User FriendlyName=".*?"/>)+</From>)<To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style="(.*?)")?>(.*?)</Text></Message>|;     my $F = join '<br />', ...

Perl Net::LDAP::SimpleServer

Adaptaciones sobre el módulo LDAP Server para Windows (Strawberry Perl) Lista de adaptaciones (continúa más abajo): - Relajación de condiciones de bind:     - Cuenta principal (principal account)     - Validación de contraseñas Ubicación del archivo: %Strawberry_Perl%\site\lib\net\ldap\SimpleServer\ProtocolHandler.pm CPAN: http://search.cpan.org/~russoz/Net-LDAP-SimpleServer-0.0.17/lib/Net/LDAP/SimpleServer.pm Código: package Net::LDAP::SimpleServer::ProtocolHandler; use strict; use warnings; # ABSTRACT: LDAP protocol handler used with Net::LDAP::SimpleServer our $VERSION = '0.0.17';    # VERSION use Net::LDAP::Server; use base 'Net::LDAP::Server'; use fields qw(store root_dn root_pw allow_anon); use Carp; use Net::LDAP::LDIF; use Net::LDAP::Util qw{canonical_dn}; use Net::LDAP::FilterMatch; use Net::LDAP::Constant (     qw/LDAP_SUCCESS LDAP_AUTH_UNKNOWN LDAP_INVALID_CREDENTIALS/,   ...