La diferencia entre "requerir (x)" e "importar x"

Resuelto austinthemassive asked hace 7 años • 9 respuestas

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.

austinthemassive avatar Oct 11 '17 07:10 austinthemassive
Aceptado

Esta sencilla imagen le ayudará a comprender las diferencias entre requirey import.

ingrese la descripción de la imagen aquí

Aparte de eso,

No puede cargar selectivamente solo las piezas que necesita, requirepero con import, puede cargar selectivamente solo las piezas que necesita, lo que puede ahorrar memoria.

La carga es sincrónica (paso a paso) pero, requirepor otro lado, importpuede ser asíncrona (sin esperar una importación previa), por lo que puede funcionar un poco mejor que require .

A l w a y s S u n n y avatar Oct 11 '2017 00:10 A l w a y s S u n n y

La principal diferencia entre requirey import, es que requireescaneará automáticamente node_modulespara encontrar módulos, pero import, que proviene de ES6, no lo hará.

La mayoría de la gente usa babel para compilar importy export, lo que hace que importactúe igual que require.

La versión futura de Node.js podría admitirse importa sí misma (de hecho, la versión experimental ya lo hace ) y, a juzgar por las notas de Node.js, importno 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 importcon Babel, pero esta característica aún no está confirmada, podría ser compatible node_modulesen el futuro, ¿quién lo sabría?


Como referencia, a continuación se muestra un ejemplo de cómo Babel puede convertir importla sintaxis de ES6 a la sintaxis de CommonJS require.

Digamos que el archivo app_es6.jscontiene 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.jsonpodrí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 .babelrcpodría ser algo como esto:

{
    "presets": [
        [
            "env",
            {
                "targets":
                {
                    "node": "current"
                }
            }
        ]
    ]
}

Este build-server-filescript definido en el package.jsonarchivo es una directiva para que Babel analice el app_es6.jsarchivo y genere el archivo app.js.

Después de ejecutar el build-server-filescript, si abre app.jsy busca la date-fnsimportació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-fnsy luego lo abre, node_modules/date-fns/get_year/index.jspuede 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.jsarchivo 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.

A-yon Lee avatar Oct 11 '2017 02:10 A-yon Lee

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

saikiran_hegde avatar Aug 09 '2018 05:08 saikiran_hegde

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 requireen cualquier parte del programa, donde importsiempre 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');
pranav shinde avatar Nov 16 '2020 02:11 pranav shinde

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');
LaZza avatar Nov 26 '2019 17:11 LaZza