Acabei de começar a trabalhar em um projeto de pequeno nó que fará interface com um MongoDB. No entanto, não consigo obter os módulos de nó relevantes para importar corretamente, mesmo que eu os tenha instalado corretamente via npm
.
Por exemplo, o código a seguir gera um erro, informando que "o express não tem exportação padrão":
import express from "express";
No entanto, este código funciona:
const express = require("express");
Então, minha pergunta é: qual é a diferença de como os métodos import e variável / exigem funcionam? Gostaria de corrigir o que está afetando minhas importações no projeto, pois parece provável que cause problemas adicionais no futuro.
node.js
typescript
import
require
austinthemassive
fonte
fonte
express
será do tipoany
. Você pode incluir as definições aqui npmjs.com/package/@types/expressRespostas:
Este diagrama simples que me ajuda a entender a diferença entre
require
eimport
.Além disso,
Você não pode carregar seletivamente apenas as peças de que precisa,
require
masimports
pode carregar seletivamente apenas as peças de que precisa. Isso pode economizar memória.O carregamento é síncrono (passo a passo), pois,
require
por outro lado,import
pode ser assíncrono (sem aguardar a importação anterior), por isso pode ter um desempenho um pouco melhor querequire
.fonte
module.exports
quando o código de inicialização do módulo termina a execução. Somente essa diferença cria dores de cabeça de compatibilidade na tentativa de fazer um único módulo funcionar para o ESM e o CommonJS.A principal diferença entre
require
eimport
, é querequire
ela varrerá automaticamentenode_modules
para encontrar módulos, masimport
, que vem do ES6, não será.A maioria das pessoas usa o babel para compilar
import
eexport
, o que fazimport
agir da mesma maneira querequire
.A versão futura do Node.js pode suportar a
import
si própria (na verdade, a versão experimental já suporta ) e, a julgar pelas notas do Node.js.,import
não suportanode_modules
, baseia-se no ES6 e deve especificar o caminho do módulo.Então, eu sugiro que você não use
import
com babel, mas esse recurso ainda não está confirmado, ele pode suportarnode_modules
no futuro, quem saberia?Para referência, abaixo está um exemplo de como o babel pode converter a
import
sintaxe do ES6 na sintaxe do CommonJSrequire
.Digamos que o arquivo
app_es6.js
contenha esta importação:Esta é uma diretiva para importar a função format do pacote de nós date-fns .
O
package.json
arquivo relacionado pode conter algo como isto:O
.babelrc
arquivo relacionado pode ser algo como isto:Este
build-server-file
script definido nopackage.json
arquivo é uma diretiva para o babel analisar oapp_es6.js
arquivo e produzi-loapp.js
.Após executar o
build-server-file
script, se você abrirapp.js
e procurar adate-fns
importação, verá que ela foi convertida para isso:A maior parte desse arquivo é um aviso para a maioria dos humanos, no entanto os computadores o entendem.
Também para referência, como um exemplo de como um módulo pode ser criado e importado para o seu projeto, se você instalar
date-fns
e abrir,node_modules/date-fns/get_year/index.js
poderá ver que ele contém:Usando o processo babel acima, seu
app_es6.js
arquivo pode conter:E babel converteria as importações em:
E lide com todas as referências à função de acordo.
fonte
require
qualquer maneiraimport won't support node_modules
O que você quer dizer com isso?Deixe-me dar um exemplo para incluir o módulo expresso com exigir e importar
-requir
-importar
Então, depois de usar qualquer uma das afirmações acima, teremos uma variável chamada como 'expressa' conosco. Agora podemos definir a variável 'app' como,
Portanto, usamos 'require' com 'CommonJS' e 'import' com 'ES6'.
Para mais informações sobre 'exigir' e 'importar', leia os links abaixo.
require - Exigindo módulos no Node.js: tudo o que você precisa saber
import - Uma atualização nos módulos ES6 no Node.js
fonte
Não é uma resposta aqui e mais como um comentário, desculpe, mas não posso comentar.
No nó V10, você pode usar o sinalizador
--experimental-modules
para informar ao Nodejs que deseja usarimport
. Mas seu script de entrada deve terminar com.mjs
.Observe que isso ainda é experimental e não deve ser usado na produção.
Ref 1 - Doc do Nodejs
Ref 2 - questão do github
fonte
novo ES6:
'import' deve ser usado com as palavras-chave 'export' para compartilhar variáveis / matrizes / objetos entre arquivos js:
skool antigo:
'require' deve ser usado com 'module.exports'
fonte