Pregunta Usar Node.js requiere vs. ES6 importar / exportar


En un proyecto en el que estoy colaborando, tenemos dos opciones sobre qué sistema de módulos podemos usar:

  1. Importación de módulos usando requirey exportar usando module.exports y exports.foo.
  2. Importar módulos usando ES6 importy exportar usando ES6 export

¿Hay algún beneficio en el rendimiento al usar uno sobre el otro? ¿Hay algo más que deberíamos saber si utilizáramos módulos ES6 sobre los de nodo?


565
2017-07-11 07:19


origen


Respuestas:


¿Hay algún beneficio en el rendimiento al usar uno sobre el otro?

Tenga en cuenta que aún no hay un motor de JavaScript que admita de forma nativa módulos ES6. Dijiste que estás usando Babel. Babel convierte import y export declaración a CommonJS (require/module.exports) por defecto de todos modos. Entonces, incluso si usa la sintaxis del módulo ES6, usará CommonJS debajo del capó si ejecuta el código en Nodo.

Existen diferencias técnicas entre los módulos CommonJS y ES6, p. CommonJS le permite cargar módulos dinámicamente. ES6 no permite esto, pero hay una API en desarrollo para eso.

Como los módulos ES6 son parte del estándar, los usaría.


482
2017-07-12 12:38



Hay varios usos / capacidades que quizás desee considerar:

Exigir:

  • Puede tener carga dinámica donde el nombre del módulo cargado no es predefinido / estático, o donde carga un módulo condicional solo si es "realmente necesario" (dependiendo de cierto flujo de código).
  • Cargando es sincrónico. Eso significa que si tienes múltiples requires, ellos son cargado y procesado uno por uno.

Importaciones ES6:

  • Puedes usar importaciones con nombre para cargar selectivamente solo las piezas que necesita. Eso puede guardar memoria.
  • La importación puede ser asíncrona (y en el cargador de módulos ES6 actual, de hecho lo es) y puede funcionar un poco mejor.

Además, el sistema de módulo Require no está basado en estándares. Es muy poco probable que se convierta en estándar ahora que existen módulos ES6. En el futuro habrá soporte nativo para los módulos ES6 en varias implementaciones que serán ventajosas en términos de rendimiento.


101
2017-07-11 08:49



Las principales ventajas son sintácticas:

  • Más sintaxis declarativa / compacta
  • Los módulos ES6 básicamente harán que UMD (Universal Module Definition) se vuelva obsoleta, esencialmente elimina el cisma entre CommonJS y AMD (servidor vs navegador).

Es poco probable que vea algún beneficio de rendimiento con los módulos ES6. Aún necesitará una biblioteca adicional para agrupar los módulos, incluso cuando haya compatibilidad total con las características de ES6 en el navegador.


32
2017-07-11 08:15



¿Hay algún beneficio en el rendimiento al usar uno sobre el otro?

La respuesta actual es no, porque ninguno de los motores de navegador actuales implementa import/export del estándar ES6.

Algunos cuadros de comparación http://kangax.github.io/compat-table/es6/ no tengas esto en cuenta, así que cuando veas casi todos los greens para Chrome, ten cuidado. import la palabra clave de ES6 no se ha tenido en cuenta.

En otras palabras, los motores actuales del navegador, incluido V8, no pueden importar nuevo archivo JavaScript desde el archivo JavaScript principal a través de cualquier directiva de JavaScript.

(Es posible que todavía estemos solo algunos errores de distancia o años lejos hasta que V8 implemente eso de acuerdo con la especificación ES6. )

Esta documento es lo que necesitamos, y esto documento es lo que debemos obedecer

Y el estándar ES6 dijo que las dependencias del módulo deberían estar allí antes de leer el módulo como en el lenguaje de programación C, donde teníamos (encabezados) .h archivos.

Esta es una estructura buena y bien probada, y estoy seguro de que los expertos que crearon el estándar ES6 lo tenían en mente.

Esto es lo que permite a Webpack u otros paquetes de paquetes optimizar el paquete en algunos especial casos, y reducir algunas dependencias del paquete que no son necesarias. Pero en los casos en que tengamos dependencias perfectas, esto nunca sucederá.

Necesitará algo de tiempo hasta import/export el soporte nativo se activa y el require la palabra clave no irá a ningún lado durante mucho tiempo.

Que es require?

Esto es node.js forma de cargar módulos. ( https://github.com/nodejs/node )

Node usa métodos de nivel de sistema para leer archivos. Básicamente confías en eso cuando usas require. require terminará en alguna llamada al sistema como uv_fs_open (depende del sistema final, Linux, Mac, Windows) para cargar el archivo / módulo de JavaScript.

Para verificar que esto sea cierto, intente usar Babel.js, y verá que el import la palabra clave se convertirá en require.

enter image description here


24
2017-11-05 15:48



El uso de módulos ES6 puede ser útil para 'sacudir árboles'; es decir, habilitar el paquete web 2, paquete acumulativo (u otros paquetes) para identificar rutas de código que no se utilizan / importan y, por lo tanto, no se convierten en el paquete resultante. Esto puede reducir significativamente el tamaño de su archivo eliminando el código que nunca necesitará, pero con CommonJS incluido de manera predeterminada porque Webpack y otros no tienen forma de saber si es necesario.

Esto se hace usando análisis estático de la ruta del código.

Por ejemplo, usando:

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

... le da al paquete una pista que package.anotherPart no es obligatorio (si no se importa, no se puede usar, ¿no?), por lo que no molestará agruparlo.

Para habilitar esto para Webpack 2, debe asegurarse de que su transpiler no escuple los módulos de CommonJS. Si estás usando el es2015 plug-in con Babel, puede desactivarlo en su .babelrc al igual que:

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

Enrollar y otros pueden funcionar de manera diferente: vea los documentos si le interesa.


17
2017-10-27 15:45



Cuando se trata de una carga asíncrona o quizás perezosa, entonces import () es mucho más poderoso. Ver cuando requerimos el componente en modo asincrónico, entonces solo lo importamos de alguna manera asíncrona como en const variable.

const module = await import('./module.js');

O si quieres usar require() entonces,

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

Cosa es import() es realmente asincrónico en la naturaleza. Como menciona neehar venugopal en ReactConf, puede usarlo para cargar componentes dinámicamente.

También es mucho mejor cuando se trata de enrutamiento. Esa es la característica especial que hace que el registro de red descargue la parte necesaria cuando el usuario se conecta a un sitio web específico con su componente específico. p.ej. la página de inicio de sesión antes del panel de control no descargará todos los componentes del tablero. Porque lo que se necesita es actual, es decir, el componente de inicio de sesión, que solo se descargará.

NOTA  - Si está desarrollando un proyecto node.js, entonces tiene que usar estrictamente require() como nodo lanzará error de excepción como invalid token 'import' si usarás import . Por lo tanto, el nodo no admite instrucciones de importación

Consulte esto para obtener más espacio donde usar las importaciones asíncronas - https://www.youtube.com/watch?v=bb6RCrDaxhw


4
2017-11-28 02:37



Yo personalmente uso la importación porque, podemos importar los métodos necesarios, miembros mediante el uso de importación.

import {foo, bar} from "dep";

Nombre del archivo: dep.js

export foo function(){};
export const bar = 22

El crédito va para Paul Shan. Más información.


3
2017-11-22 07:04