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
express
será de tipoany
. Puede incluir las definiciones desde aquí npmjs.com/package/@types/expressRespuestas:
Este diagrama simple que me ayuda a entender la diferencia entre
require
yimport
.Aparte de eso,
No puede cargar selectivamente solo las piezas que necesita,
require
pero conimports
, puede cargar selectivamente solo las piezas que necesita. Eso puede ahorrar memoria.La carga es sincrónica (paso a paso) porque,
require
por otro lado,import
puede ser asíncrona (sin esperar la importación previa), por lo que puede funcionar un poco mejor querequire
.fuente
module.exports
cuando 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
require
yimport
, es querequire
escaneará automáticamentenode_modules
para encontrar módulos, peroimport
, que proviene de ES6, no lo hará.La mayoría de las personas usan babel para compilar
import
yexport
, lo que hace queimport
actú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,import
no será compatiblenode_modules
, se basa en ES6 y debe especificar la ruta del módulo.Por lo tanto, le sugiero que no lo use
import
con babel, pero esta función aún no está confirmada, podría ser compatiblenode_modules
en el futuro, ¿quién lo sabría?Como referencia, a continuación se muestra un ejemplo de cómo Babel puede convertir la
import
sintaxis de ES6 en la sintaxis de CommonJSrequire
.Digamos que el archivo
app_es6.js
contiene esta importación:Esta es una directiva para importar la función de formato desde el paquete de nodos date-fns .
El
package.json
archivo relacionado podría contener algo como esto:El
.babelrc
archivo relacionado podría ser algo como esto:Este
build-server-file
script definido en elpackage.json
archivo es una directiva para que babel analice elapp_es6.js
archivo y lo muestreapp.js
.Después de ejecutar el
build-server-file
script, si abreapp.js
y busca ladate-fns
importació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-fns
y luego abrenode_modules/date-fns/get_year/index.js
, puede ver que contiene:Usando el proceso de babel anterior, su
app_es6.js
archivo podría contener:Y Babel convertiría las importaciones a:
Y maneje todas las referencias a la función en consecuencia.
fuente
require
todos 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-modules
para 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