Anuncios

Bienvenidos sean a este post, continuemos con la saga de modulos.

Anuncios

Pero antes de meternos de ello hagamos un breve repaso de los identificadores y nombres de path, los siguientes aplican a require, import e import():

  • identificador de modulo relativo, estos estan representados por ./ o ../ seguido del nombre del modulo, siemprre el primero equivalente al directorio actual y el siguiente al directorio anterior.
  • identificador de modulo absoluto, estos siempre tienen el path completo y comienzan con /, en el caso de ES6 con file://, pero es la menos recomendable por temas de seguridad
  • identificadores de modulo top-level, estas no comienzan con ningun identificador de path sino que tienen el nombre identificador y estos deben estar en los directorios node_modules correspondientes como vimos en el post anterior.
  • modulos core, son similares a los anteriores pero estan compilados en node.js
Anuncios

En todos los casos, salvo el ultimo, los identificadores de modulos resuelven el archivo que contiene el modulo a cargar, es decir que este se encarga de mapear el modulo con el archivo para que podamos utilizarlo, pasemos a ver el primer tema.

Anuncios

Hasta ahora sabemos que podemos acceder a un modulo mediante:

require('foo')
Anuncios
Anuncios

Pero a su vez node.js nos permite acceder directamente a modulos contenidos en un paquete, cuando nos referimos a esto es la capacidad de poder agregar otro nombre que representa al modulo que deseamos utilizar, a esto se le llama path de importe profundo, tomemos como ejemplo al paquete mime, este nos permite manipular distintos tipos de datos y los desarrolladores agregaron una version mas ligera donde no carga todo los tipos de datos a manipular sino algunos basicos, para poder cargar este modulo debemos hacerlo de la siguiente manera:

require('mime/lite')
Anuncios

Obviamente este es para CommonJS pero para ES6 deben hacerlo de la siguiente manera:

import 'mime/lite'
Anuncios

En este caso al igual que siempre primero identificaremos cual es el node_modules que contienen al paquete principal, mime, el importe profundo es un simple path relativo al directorio del paquete, si tuvieramos que hacer una comparacion seria algo similar a esto:

/path/a/node_modules/mime/lite
Anuncios

Esto aplicara todo lo que vimos anteriormente y solo quedara completo cuando encuentre un archivo con el nombre de lite.js o un directorio con el nombre de lite y este contenga el archivo index.js o index.mjs, aunque nosotros podemos anular esta conducta.

Anuncios

Para hacer esto debemos utilizar a package.json mediante declaraciones donde indiquemos el path de cada identificador de importacion profunda, vamos a suponer el siguiente ejemplo:

{
 "exports": {
   "./cjsmodulo": "./src/cjs-modulo.js",
   "./es6modulo": "./src/es6-modulo.mjs"
 }
}
Anuncios

En este caso agregamos el campo exports y en este tendremos dos valores, donde uno apuntara a un modulo de CommonJS, cjsmodulo, y el otro sera para ES6, es6modulo, por lo tanto ahora para importar al primer modulo debemos hacerlo de la siguiente manera:

require('modulo/cjsmodulo')
Anuncios

Y para el segundo lo haremos de la siguiente manera:

import 'modulo/es6modulo'
Anuncios

Como tenemos ese campo en el archivo package.json, las funciones encargadas de importar los modulos en lugar de buscarlos como hace habitualmente utilizara el path informado en el archivo json, pero si nosotros hicieramos lo siguiente:

require('modulo/src/cjs-modulo.js')
Anuncios

De esta forma fallara porque al no encontrarlo en el archivo package.json y no respetar lo hablado anteriormente no podra encontrarlo, recuerden que al momento de pasar un modulo interno debe ser el identificador y este debe satisfacer cualquiera de los tres requerimientos anteriores de lo contrario fallara, pasemos al siguiente tema.

Anuncios

Estructura de un directorio de proyecto

Con todo lo hablado anteriormente podemos decir que todo proyecto de node.js es un directorio con un archivo package.json donde se declaran todas las caracteristicas del paquete, haciendo mas enfoque en sus dependencias.

Anuncios

Esto que describimos corresponde a un modulo por lo cual podemos decir que cada modulo en si es un proyecto propio, veamos un ejemplo

Anuncios

Este es un ejemplo de aplicacion express, sobre esto hablaremos un poco mas adelante, conteniendo unos pocos modulos instalados en el directorio node_modules, para una aplicacicon de este estilo usualmente se utiliza a app.js como el modulo principal y tiene codigo y assets distribuidos en los siguientes directorios:

  • public
  • routes
  • views
Anuncios

Y todas nuestras dependencias instaladas en el directorio node_modules, si observamos la imagen veremos que se selecciono al modulo express, y contiene los archivos package.json e index.js, esto hara que al momento de importarlo mediante la siguiente funcion:

require('express') // por citar un ejemplo
Anuncios
Anuncios

Este se importara correctamente debido a que tenemos en el directorio, el archivo json e index.js los cuales satisfacen la busqueda del mismo, a su vez podemos ver como el modulo express tiene su propio directorio nodes_modules, y en este caso se aplica lo hablado en el post anterior donde si existe un paquete de la misma version el administrador lo apuntara a ese pero si este es otra version, lo instalara en su path correspondiente para que no se interfieran entre ellos, una forma de chequesar esto es mediante el siguiente comando:

$ npm ls <nombre_modulo>
Anuncios

En resumen, hoy hemos visto primero un repaso de como son los identificadores de nuestros modulos, despues hemos analizado el concepto de importar modulos profundos, o lo mismo que decir modulos que se encuentran dentro de los paquetes, despues hemos visto de manera superficial como es la estructura de un paquete de ejemplo, asi como son los elementos basicos para que podamos importarlo, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50