Node.js Import vs require('modulo')

Node.js Import vs require('modulo')

Resultado de imagen para node.js
En Node.js se crearon un sistema de módulos llamado CommonJS, este se usa con: const modulo = require('modulo'); En ES2015/6 se agrego al lenguaje un sistema nativo de módulos usando la sintaxis de: import modulo from 'modulo'; Aunque básicamente parece que hacen lo mismo, en realidad funcionan de forma distinta a más bajo nivel.
CommonJS cuando cargas un módulo te trae una copia del módulo para que lo puedas usar, mientras que ES2015 trae una referencia a ese módulo. Esto quiere decir que si tu módulo tiene una variable y exporta una función que modifica esa variable, cualquier otra parte de tu aplicación que haga uso de dicha variable va a ver reflejado el cambio, mientras que con CommonJS cada uno tendría su copia de la variable.


La diferencia entre import y require es abismal.
Por una parte require es una función global introducida por el ambiente de ejecución mientras que import es una nueva sintaxis adicionada al lenguaje. Al ser require una función como otra cualquiera, se puede invocar en cualquier parte del código. Permitiendo de esta forma la carga dinámica de módulos. Esto puede ser bueno o malo dependiendo de como se use, pero haciendo las cosas bien puede hacer que las aplicaciones inicien rápido. Por otra parte import es solo sintaxis y por tanto no puede asignarse a una variable, por lo que la carga de módulos queda definida estaticamente. Esto segundo también puede ser malo o bueno segun se mire. Por una parte al ser la relación entre módulos estática su análisis se puede realizar sin ejecutar código lo que permite mejores herramientas de desarrollo y por otra parte tiene la desventaja de ser algo muy rígido.
Para ilustrar la diferencia tomemos como caso de estudio la librería sequelize. Esta librería ofrece la posibilidad de importar un modulo javascript como un modelo. Esto es posible porque al ser require una función como otra cualquiera su argumento puede ser cualquier valor. Esto no puede realizarse de la misma forma empleando import.
La diferencia que señala Daniel Hernández arriba tiene mas que ver con el como se usa el modulo y las particularidades de Javascript como lenguaje que con el sistema de modulo que se use en si. Ademas la afirmacion CommonJS cuando cargas un módulo te trae una copia del módulo para que lo puedas usar, mientras que ES2015 trae una referencia a ese módulo. es totalmente falsa. Ver la documentacion oficial de Nodejs para mas info al respecto. require solo devuelve una referencia al modulo que se encuentra cargado en la cache de modulos de Node. import soporta la existencia de símbolos locales que apunten a objetos en otros módulos mientras que require solo soporta apuntar al modulo como un todo. De aquí que crear un símbolo local que hace referencia a una variable en otro modulo tiene que pasar por un proceso de asignación de una nueva variable local. Dada la naturaleza de Javascript si se re-asigna esta variable local solo se esta cambiando a donde apunta y por tanto no se modifica la variable en el modulo del cual se requirió su valor inicial.
Ejemplo:
// aquí x no es una variable local sino un símbolo, no puede ser reasignado por definición debido a la nueva sintaxis
import {x} from 'x';

// aquí y es una variable definida localmente que puede sufrir modificaciones
var y = require('x').x;

// aquí la variable local y se ha reasignado para que referencie el valor 35.
y = 35;
El ejemplo arriba no implica que no sea posible modificar la variable x exportada desde el modulo x en el código local. Sino que al usarse una variable local es esta variable la que estamos modificando. El siguiente ejemplo modifica la variable x en el modulo x empleando el sistema de módulos CommonJS.
var x = require('x');

x.x = 35;
Como puede verse al no emplearse una variable local es posible modificar directamente el valor del atributo x del modulo x. Este nuevo valor ahora es accesible desde cualquier otro modulo que requiera al modulo 'x'.
SHARE

Oscar perez

Arquitecto especialista en gestion de proyectos si necesitas desarrollar algun proyecto en Bogota contactame en el 3006825874 o visita mi pagina en www.arquitectobogota.tk

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

0 comentarios:

Publicar un comentario