Estoy usando módulos ECMAScript6. ¿Cuál es la forma correcta de exportar/importar múltiples métodos desde un módulo de las siguientes opciones?
Clase única de métodos estáticos:
//------ myClass.js ------ export default class myClass { static myMethod1() { console.log('foo'); } static myMethod2(args...) { console.log('bar'); } } //------ app.js ------ import myClass from 'myClass'; myClass.myMethod1(); //fooMúltiples métodos exportados:
//------ myMethods.js ------ export function myMethod1() { console.log('foo'); } export function myMethod2() { console.log('bar'); } //------ app.js ------ import {myMethod1, myMethod2} from 'myMethods'; myMethod1() //foo; //OR import * as myMethods from 'myMethods'; myMethods.myMethod1() //foo;1) Exportación: una clase de métodos estáticos se siente como un "olor a código", pero de manera similar, exportar todo individualmente se siente un poco detallado. ¿Es simplemente la preferencia del desarrollador o hay implicaciones de rendimiento aquí?
2) Importación: la sintaxis '* as' es mi método preferido, ya que le permite usar la notación de puntos (haciendo referencia tanto al módulo como al método) que ayuda a la legibilidad del código. ¿Tiene esto implicaciones de rendimiento cuando solo puedo usar 1 de los métodos?
Una clase de métodos estáticos se siente como un "olor a código"
Sí, de hecho. ¡No necesitas una estructura de class aquí! Simplemente exporte un objeto de "módulo" normal:
//------ myMethods.js ------ export default { myMethod1() { console.log('foo'); }, myMethod2(args...) { console.log('bar'); } };Sin embargo, recomiendo su segundo enfoque con múltiples exportaciones.
exportar todo individualmente se siente un poco detallado
Bueno, no necesitas ninguna estructura envolvente, así que diría que es menos repetitivo. Solo tiene que etiquetar explícitamente todo lo que desea exportar, lo cual no es malo.
* assintaxis es mi método preferido, ya que le permite usar la notación de puntos (haciendo referencia tanto al módulo como al método) que ayuda a la legibilidad del código.
Esa es una preferencia muy personal y depende del tipo de código que esté escribiendo. A veces, la concisión es superior, pero la capacidad de hacer referencia explícita al módulo también puede ser útil. Tenga en cuenta que las importaciones de espacios de nombres que usan * as y los objetos importados por defecto son muy similares aquí, aunque solo las exportaciones con nombre le permiten hacer referencia a ellos directamente a través de import {myMethod1, myMethod2} . Así que mejor deje la elección a aquellos que importen su módulo.
¿Tiene esto alguna implicación en el rendimiento?
No mucho. Las implementaciones actuales de ES6 aún no apuntan a optimizaciones de rendimiento de todos modos.
En general, los identificadores estáticos son más fáciles de resolver y optimizar que los accesos de propiedad [1] , las exportaciones con varios nombres y las importaciones parciales teóricamente podrían hacer que JIT sea más rápido y, por supuesto, los archivos más pequeños necesitan menos tiempo para cargarse si las exportaciones no utilizadas se eliminan durante la agrupación. Ver aquí para más detalles. Difícilmente habrá diferencias de rendimiento notables, debe usar lo que es mejor mantenible.
[1]: los espacios de nombres del módulo ( import * as ns ) también son estáticos, incluso si ns.… parece un acceso de propiedad dinámico
TLDR; Use múltiples métodos exportados e importación explícita.
@Bergi tiene razón acerca de no necesitar una clase con campos estáticos, solo un objeto en su primer caso. Sin embargo, esta opción es desaconsejada por Axel Rauschmayer :
Tenga en cuenta que la exportación predeterminada de objetos suele ser un antipatrón (si desea exportar las propiedades). Pierde algunos beneficios del módulo ES6 ( movimiento de árboles y acceso más rápido a las importaciones ).
Los desarrolladores de Airbnb recomiendan exportaciones nombradas e importación explícita de comodines, consulte este hilo: https://github.com/airbnb/javascript/issues/710#issuecomment-297840604