Acabo de comenzar a trabajar en un proyecto de nodo pequeño que interactuará con un MongoDB. Sin embargo, parece que no puedo conseguir que los módulos de nodo relevantes se importen correctamente, aunque los haya instalado correctamente a través de npm.
Por ejemplo, el siguiente código arroja un error, diciéndome 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 / requerimiento? Me gustaría arreglar lo que sea que esté plagando mis importaciones en el proyecto, ya que parece causar problemas adicionales en el futuro.
node.js
typescript
import
require
austinthemassive
fuente
fuente

expressserá de tipoany. Puede incluir las definiciones desde aquí npmjs.com/package/@types/expressRespuestas:
Este diagrama simple que me ayuda a entender la diferencia entre
requireyimport.Aparte de eso,
No puede cargar selectivamente solo las piezas que necesita,
requirepero conimports, puede cargar selectivamente solo las piezas que necesita. Eso puede ahorrar memoria.La carga es sincrónica (paso a paso) porque,
requirepor otro lado,importpuede ser asíncrona (sin esperar la importación previa), por lo que puede funcionar un poco mejor querequire.fuente
module.exportscuando el código de inicialización del módulo termina de ejecutarse. Esta diferencia por sí sola crea problemas de compatibilidad al tratar de hacer que un solo módulo funcione tanto para ESM como para CommonJS.La principal diferencia entre
requireyimport, es querequireescaneará automáticamentenode_modulespara encontrar módulos, peroimport, que proviene de ES6, no lo hará.La mayoría de las personas usan babel para compilar
importyexport, lo que hace queimportactúen igual querequire.La versión futura de Node.js podría ser compatible
import(en realidad, la versión experimental ya lo es ), y a juzgar por las notas de Node.js,importno será compatiblenode_modules, se basa en ES6 y debe especificar la ruta del módulo.Por lo tanto, le sugiero que no lo use
importcon babel, pero esta función aún no está confirmada, podría ser compatiblenode_modulesen el futuro, ¿quién lo sabría?Como referencia, a continuación se muestra un ejemplo de cómo Babel puede convertir la
importsintaxis de ES6 en la sintaxis de CommonJSrequire.Digamos que el archivo
app_es6.jscontiene esta importación:Esta es una directiva para importar la función de formato desde el paquete de nodos date-fns .
El
package.jsonarchivo relacionado podría contener algo como esto:El
.babelrcarchivo relacionado podría ser algo como esto:Este
build-server-filescript definido en elpackage.jsonarchivo es una directiva para que babel analice elapp_es6.jsarchivo y lo muestreapp.js.Después de ejecutar el
build-server-filescript, si abreapp.jsy busca ladate-fnsimportación, verá que se ha convertido en esto:La mayor parte de ese archivo es engullido por la mayoría de los humanos, sin embargo, las computadoras lo entienden.
También como referencia, como un ejemplo de cómo se puede crear e importar un módulo en su proyecto, si instala
date-fnsy luego abrenode_modules/date-fns/get_year/index.js, puede ver que contiene:Usando el proceso de babel anterior, su
app_es6.jsarchivo podría contener:Y Babel convertiría las importaciones a:
Y maneje todas las referencias a la función en consecuencia.
fuente
requiretodos modosimport won't support node_modules¿Que quieres decir con eso?Permítanme dar un ejemplo para incluir el módulo express con require & import
-exigir
-importar
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,
Entonces usamos 'require' con 'CommonJS' e 'import' con 'ES6'.
Para obtener más información sobre 'requerir' e 'importar', lea los enlaces a continuación.
require - Requiriendo módulos en Node.js: todo lo que necesitas saber
import: una actualización de los módulos ES6 en Node.js
fuente
No es una respuesta aquí y más como un comentario, lo siento pero no puedo comentar.
En el nodo V10, puede usar el indicador
--experimental-modulespara indicarle a Nodejs que desea usarimport. Pero su script de entrada debe terminar con.mjs.Tenga en cuenta que esto sigue siendo algo experimental y no debe usarse en la producción.
Ref. 1 - Nodejs Doc
Ref 2 - problema de github
fuente
nuevo ES6:
'importar' debe usarse con palabras clave 'exportar' para compartir variables / matrices / objetos entre archivos js:
vieja escuela:
'require' debe usarse con 'module.exports'
fuente