La diferencia entre "requerir (x)" e "importar x"
Acabo de comenzar a trabajar en un pequeño proyecto de nodo que interactuará con MongoDB. Sin embargo, parece que no puedo importar correctamente los módulos de nodo relevantes, aunque los he instalado correctamente a través de npm
.
Por ejemplo, el siguiente código arroja un error que me dice que "express no tiene exportación predeterminada":
import express from "express";
Sin embargo, este código funciona:
const express = require("express");
Entonces mi pregunta es, ¿cuál es la diferencia en cómo funcionan los métodos de importación y variable/requerido? Me gustaría arreglar lo que sea que esté afectando a mis importaciones en el proyecto, ya que parece probable que cause problemas adicionales en el futuro.
Esta sencilla imagen le ayudará a comprender las diferencias entre require
y import
.
Aparte de eso,
No puede cargar selectivamente solo las piezas que necesita, require
pero con import
, puede cargar selectivamente solo las piezas que necesita, lo que puede ahorrar memoria.
La carga es sincrónica (paso a paso) pero, require
por otro lado, import
puede ser asíncrona (sin esperar una importación previa), por lo que puede funcionar un poco mejor que require
.
La principal diferencia entre require
y import
, es que require
escaneará automáticamente node_modules
para encontrar módulos, pero import
, que proviene de ES6, no lo hará.
La mayoría de la gente usa babel para compilar import
y export
, lo que hace que import
actúe igual que require
.
La versión futura de Node.js podría admitirse import
a sí misma (de hecho, la versión experimental ya lo hace ) y, a juzgar por las notas de Node.js, import
no lo admitirá node_modules
, se basa en ES6 y debe especificar la ruta del módulo.
Así que te sugeriría que no lo uses import
con Babel, pero esta característica aún no está confirmada, podría ser compatible node_modules
en el futuro, ¿quién lo sabría?
Como referencia, a continuación se muestra un ejemplo de cómo Babel puede convertir import
la sintaxis de ES6 a la sintaxis de CommonJS require
.
Digamos que el archivo app_es6.js
contiene esta importación:
import format from 'date-fns/format';
Esta es una directiva para importar la función de formato desde el paquete de nodo date-fns .
El archivo relacionado package.json
podría contener algo como esto:
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
El archivo relacionado .babelrc
podría ser algo como esto:
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
Este build-server-file
script definido en el package.json
archivo es una directiva para que Babel analice el app_es6.js
archivo y genere el archivo app.js
.
Después de ejecutar el build-server-file
script, si abre app.js
y busca la date-fns
importación, verá que se ha convertido en esto:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
La mayor parte de ese archivo es una tontería para la mayoría de los humanos, independientemente de cómo lo entiendan las computadoras.
También como referencia, como ejemplo de cómo se puede crear e importar un módulo a su proyecto, si lo instala date-fns
y luego lo abre, node_modules/date-fns/get_year/index.js
puede ver que contiene:
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
Usando el proceso de Babel anterior, su app_es6.js
archivo podría contener:
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
Y Babel convertiría las importaciones a:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
Y maneje todas las referencias a la función en consecuencia.
Permítanme darles un ejemplo para incluir el módulo express con require & import
-requerir
var express = require('express');
-importar
import * as express from 'express';
Entonces, después de usar cualquiera de las declaraciones anteriores, tendremos una variable llamada 'express' con nosotros. Ahora podemos definir la variable 'aplicación' como,
var app = express();
Entonces usamos 'requerir' con 'CommonJS' e 'importar' con 'ES6'.
Para obtener más información sobre 'requerir' e 'importar', lea los enlaces a continuación.
require - Requerir módulos en Node.js: todo lo que necesitas saber
importar: una actualización de los módulos ES6 en Node.js
lo haré simple,
- Importar y Exportar son funciones de ES6 (JS de próxima generación).
- Requerir es un método de la vieja escuela para importar código de otros archivos.
La principal diferencia está en require , se llama o incluye el archivo JS completo. Incluso si no necesitas una parte.
var myObject = require('./otherFile.js'); //This JS file will be included fully.
Mientras que en la importación puede extraer solo los objetos/funciones/variables que sean necesarios.
import { getDate }from './utils.js';
//Here I am only pulling getDate method from the file instead of importing full file
Otra diferencia importante es que puedes usarlo require
en cualquier parte del programa, donde import
siempre debería estar en la parte superior del archivo.
Editar: en las últimas versiones de nodos puede utilizar la desestructuración. Se verá así
const { getDate } = require('./date.js');
nuevo ES6:
'importar' debe usarse con las palabras clave 'exportar' para compartir variables/matrices/objetos entre archivos js:
export default myObject;
//....in another file
import myObject from './otherFile.js';
vieja escuela:
'requerir' debe usarse con 'module.exports'
module.exports = myObject;
//....in another file
var myObject = require('./otherFile.js');