En un proyecto en el que estoy colaborando, tenemos dos opciones sobre qué sistema de módulos podemos usar:
require y exportación usando module.exports y exports.foo .import de ES6 y exportación mediante export de ES6¿Hay algún beneficio de rendimiento al usar uno sobre el otro? ¿Hay algo más que debamos saber si tuviéramos que usar módulos ES6 en lugar de los de Node?
Desde Node v12 (abril de 2019), la compatibilidad con los módulos ES está habilitada de forma predeterminada y desde Node v15 (octubre de 2020) es estable (consulte aquí ). Los archivos que incluyen módulos de nodo deben terminar en .mjs o el archivo package.json más cercano debe contener "type": "module" . La documentación de Node tiene mucha más información, también sobre la interoperabilidad entre los módulos CommonJS y ES.
En cuanto al rendimiento, siempre existe la posibilidad de que las funciones más nuevas no estén tan optimizadas como las funciones existentes. Sin embargo, dado que los archivos del módulo solo se evalúan una vez, es probable que se pueda ignorar el aspecto del rendimiento. Al final, debe ejecutar puntos de referencia para obtener una respuesta definitiva de todos modos.
Los módulos ES se pueden cargar dinámicamente a través de la función import() . A diferencia de require , esto devuelve una promesa.
¿Hay algún beneficio de rendimiento al usar uno sobre el otro?
Tenga en cuenta que todavía no existe un motor de JavaScript que admita de forma nativa los módulos ES6. Tú mismo dijiste que estás usando Babel. Babel convierte la declaración de import y export a CommonJS ( require / module.exports ) de forma predeterminada de todos modos. Entonces, incluso si usa la sintaxis del módulo ES6, usará CommonJS bajo el capó si ejecuta el código en Node.
Existen diferencias técnicas entre los módulos CommonJS y ES6, por ejemplo, CommonJS le permite cargar módulos dinámicamente. ES6 no permite esto, pero hay una API en desarrollo para eso .
Dado que los módulos ES6 son parte del estándar, los usaría.
Hay varios usos/capacidades que quizás desee considerar:
Exigir:
require , se cargan y procesan uno por uno.Importaciones ES6:
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 los módulos ES6. En el futuro, habrá compatibilidad nativa con los módulos ES6 en varias implementaciones, lo que supondrá una ventaja en términos de rendimiento.
A partir de ahora, la importación de ES6, la exportación siempre se compila en CommonJS , por lo que no hay ningún beneficio al usar uno u otro. Aunque se recomienda el uso de ES6, ya que debería ser ventajoso cuando se publique el soporte nativo de los navegadores. El motivo es que puede importar parciales de un archivo, mientras que con CommonJS debe solicitar todo el archivo.
ES6 → import, export default, export
CommonJS → require, module.exports, exports.foo
A continuación se muestra el uso común de esos.
Valor predeterminado de exportación ES6
// hello.js function hello() { return 'hello' } export default hello // app.js import hello from './hello' hello() // returns helloES6 exportar múltiples e importar múltiples
// hello.js function hello1() { return 'hello1' } function hello2() { return 'hello2' } export { hello1, hello2 } // app.js import { hello1, hello2 } from './hello' hello1() // returns hello1 hello2() // returns hello2Módulo CommonJS.exportaciones
// hello.js function hello() { return 'hello' } module.exports = hello // app.js const hello = require('./hello') hello() // returns helloMódulo CommonJS. exporta múltiples
// hello.js function hello1() { return 'hello1' } function hello2() { return 'hello2' } module.exports = { hello1, hello2 } // app.js const hello = require('./hello') hello.hello1() // returns hello1 hello.hello2() // returns hello2