A Usar O Nó.js require vs. ES6 importação / exportação

num projecto em que estou a colaborar, temos duas opções sobre o sistema de módulos que podemos usar:

  1. importar módulos utilizando require e exportar utilizando module.exports e exports.foo.
  2. importar módulos utilizando o ES6 import e exportar utilizando o ES6 export
Há benefícios de desempenho em usar um em vez do outro? Há mais alguma coisa que devamos saber se vamos usar módulos ES6 sobre módulos do nó?

Author: sepehr, 2015-07-11

7 answers

Há benefícios de desempenho em usar um em vez do outro?

Tenha em mente que não há nenhum motor JavaScript ainda que nativamente suporta módulos ES6. Você mesmo disse que está usando Babel. Babel converte import e export declaração para CommonJS (require/module.exports) por padrão de qualquer maneira. Então, mesmo que você use a sintaxe do módulo ES6, você estará usando CommonJS sob o capô se você executar o código no nó.

Existem diferenças técnicas entre CommonJS e ES6 módulos, por exemplo, CommonJS permite carregar módulos dinamicamente. ES6 não permite isso, mas há uma API em desenvolvimento para isso.

Uma vez que os módulos ES6 fazem parte da norma, eu usá-los-ia.

 509
Author: Felix Kling, 2016-02-03 10:11:19

Existem várias utilizações / capacidades que poderá querer considerar:

Requerem:

  • você pode ter um carregamento dinâmico onde o nome do módulo carregado não é predefinido / estático, ou onde carrega condicionalmente um módulo apenas se é "verdadeiramente necessário" (dependendo de certo fluxo de código).
  • o carregamento é Sincrono. Isso significa que se tiver múltiplos {[[0]} s, eles são carregado e processado um por um.

Importações ES6:

  • pode usar importações nominadas para seletivamente carregar apenas as peças que você precisa. Que pode guarda a memória.
  • a importação pode ser assíncrona (e no carregador de Módulo ES6 atual, na verdade é) e pode ter um desempenho um pouco melhor.

Além disso, o sistema Require module não é baseado no padrão. É altamente improvável que se torne padrão agora que módulos ES6 existem. No futuro haverá suporte nativo para módulos ES6 em várias implementações que serão vantajosas em termos de desempenho.

 108
Author: Amit, 2015-07-11 14:40:46

As principais vantagens são sintácticas:

  • mais sintaxe declarativa / compacta
  • os módulos ES6 Irão basicamente tornar UMD (definição de Módulo Universal) obsoleto - essencialmente remove o cisma entre CommonJS e AMD (servidor vs navegador).

É pouco provável que veja quaisquer benefícios de desempenho com módulos ES6. Você ainda vai precisar de uma biblioteca extra para agrupar os módulos, mesmo quando há suporte total para recursos ES6 no navegador.

 32
Author: snozza, 2016-07-04 09:21:50
Há benefícios de desempenho em usar um em vez do outro?

A resposta actual é não, porque nenhum dos motores de navegação actuais implementa import/export a partir da norma ES6.

Alguns gráficos de comparação http://kangax.github.io/compat-table/es6 não leve isto em conta, por isso, quando vir quase todos os verdes para cromados, tenha cuidado. A palavra-chave do ES6 não foi tida em conta.

Por outras palavras, corrente os motores de navegação, incluindo o V8, não podem importar Um novo ficheiro JavaScript do principal ficheiro JavaScript através de qualquer directiva JavaScript.

(podemos ainda estar a apenas alguns bugs de distância ou anos de distância até que V8 implemente isso de acordo com a especificação ES6. )

Estedocumento é o que precisamos, e este documento é o que devemos obedecer.

E o padrão ES6 diz que as dependências do módulo devem estar lá antes de lermos. o módulo como na linguagem de programação C, onde tínhamos (headers) .h arquivos. Esta é uma boa e bem testada estrutura, e estou certo de que os especialistas que criaram o padrão ES6 tinham isso em mente.

Isto é o que permite que o Webpack ou outros pacotes de pacotes optimizem o pacote em alguns casos especiais, e reduzam algumas dependências do pacote que não são necessárias. Mas nos casos em que temos dependências perfeitas isso nunca vai acontecer.

Vai precisar algum tempo até import/export suporte nativo entrar em directo, e a palavra-chave require não irá a lado nenhum durante muito tempo.

O que é require?

Este é o modo de carregar os módulos. ([52]} https://github.com/nodejs/node )

O nó usa métodos de nível de sistema para ler ficheiros. Você basicamente confia nisso ao usar require. require irá terminar numa chamada de sistema como uv_fs_open (depende do sistema final, Linux, Mac, Windows) para carregar o ficheiro/módulo JavaScript.

Para verificar se isto é é verdade, tenta usar o Babel.js, e você verá que a palavra-chave import será convertida em require.

enter image description here

 23
Author: prosti, 2017-01-29 23:52:22

A utilização de módulos ES6 pode ser útil para a "agitação das árvores", ou seja, permitir que o Webpack 2, o Rollup (ou outros pacotes) identifiquem caminhos de código que não são utilizados/importados e, por conseguinte, não o façam no pacote resultante. Isso pode reduzir significativamente o tamanho de seu arquivo, eliminando o código que você nunca vai precisar, mas com CommonJS é empacotado por padrão, porque Webpack et al não têm nenhuma maneira de saber se ele é necessário.

Isto é feito usando análise estática do Caminho do Código.

Por exemplo, utilizar:

import { somePart } 'of/a/package';

... dá ao bundler uma dica de que package.anotherPart não é necessário (se não for importado, não pode ser usado-certo?), para que não se preocupe em empacotá-lo.

Para activar isto para o Webpack 2, tem de garantir que o seu transpilador não está a cuspir módulos CommonJS. Se estiver a usar o plugin es2015 com o babel, pode desactivá-lo no seu .babelrc assim:

{
  "presets": [
    ["es2015", { modules: false }],
  ]
}

Rollup e outros podem funcionar de forma diferente-ver os documentos, se estiver interessado.

 17
Author: Lee Benson, 2016-10-27 15:45:01
Quando se trata de async ou talvez de carga preguiçosa, então import ()é muito mais poderoso. Veja quando precisamos do componente de maneira async, então só nós o importamos de alguma maneira async como na variável const.
const module = await import('./module.js');

Ou se quiser utilizar require() Então,

const converter = require('./converter');

A coisa é import() é realmente async na natureza. Como mencionado por neehar venugopal em ReactConf, você pode usá-lo para dinamicamente carregar componentes.

Também é muito melhor quando se trata de roteamento. Esse mesmo. coisa especial que faz o log de rede para baixar a parte necessária quando o Usuário se conecta a um site específico para o seu componente específico. exemplo. a página de autenticação antes do painel não iria transferir todos os componentes do painel. Porque o que é necessário atual, ou seja, componente de login, que só será baixado.

Nota - Se estiver a desenvolver um nó.js project, então você tem que usar estritamente require() como nó irá lançar o erro de exceção como invalid token 'import' Se você vai usar import . Então o nó não suportar as declarações de importação

UPDATE-como sugerido por Dan Dascalescu : desde v8. 5.0 (lançado Sep 2017), node --experimemntal-modules index.mjs permite-lhe usar import sem Babel. Você pode (e deve) também publicar os seus pacotes npm como ESModule nativo, com compatibilidade reversa para a maneira antiga require.

Ver isto para uma maior depuração onde usar as importações async - https://www.youtube.com/watch?v=bb6RCrDaxhw

 5
Author: Meet Zaveri, 2018-09-27 03:35:53

Eu pessoalmente uso a importação Porque, nós podemos importar os métodos necessários, membros usando a importação.

import {foo, bar} from "dep";

Nome do ficheiro: dep.js

export foo function(){};
export const bar = 22
O crédito vai para Paul Shan. mais informação .
 3
Author: chandoo, 2017-11-22 07:04:33