Модули ES6: экспорт одного класса статических методов или нескольких отдельных методов

Я использую модули ECMAScript6. Каков правильный способ экспорта/импорта нескольких методов из модуля из следующих ниже параметров?

Один класс статических методов:

//------ 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();    //foo

Несколько экспортированных методов:

//------ 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) Экспорт: Класс только статических методов чувствует себя как "запах кода", но аналогичным образом экспортирует все индивидуально, он чувствует себя немного подробным. Это просто предпочтение разработчика или есть последствия для производительности здесь?

2) Импорт: Синтаксис "* как" - это мой предпочтительный метод, так как он позволяет использовать точечную нотацию (ссылаясь как на модуль, так и на метод), помогая считывать код. Имеет ли это последствия для производительности, хотя, когда я могу использовать только один из методов?

Ответ 1

Класс только статических методов чувствует себя как "запах кода"

Да, действительно. Здесь вам не нужна структура class! Просто экспортируйте нормальный объект "module":

//------ myMethods.js ------

export default {
  myMethod1() {
    console.log('foo'); 
  },
  myMethod2(args...) {
    console.log('bar'); 
  }  
};

Я рекомендую ваш второй подход с несколькими экспортами.

экспорт всего индивидуально чувствует себя немного многословным

Ну, вам не нужна структура обертки, поэтому я бы сказал, что это менее шаблонный. Вам просто нужно явно пометить все, что вы хотите экспортировать, что не так уж плохо.

Синтаксис

* as - это мой предпочтительный метод, так как он позволяет использовать точечную нотацию (ссылаясь как на модуль, так и на метод), помогая читать код.

Это очень личное предпочтение и зависит от типа кода, который вы пишете. Иногда краткость превосходит, но способность явно ссылаться на модуль также может быть полезна. Обратите внимание, что именованный экспорт с использованием * as и объектов экспорта по умолчанию здесь очень похож, хотя только именованный экспорт позволяет вам напрямую ссылаться на них через import {myMethod1, myMethod2}.

Имеют ли это последствия для производительности?

Я так не думаю. В настоящее время существующие реализации ES6 еще не нацелены на оптимизацию производительности.

В общем, статические идентификаторы легче разрешать и оптимизировать, чем доступ к ресурсам [1] множественный экспорт и частичный импорт могут теоретически сделать JIT быстрее, и, конечно, меньшим файлам требуется меньше времени для загрузки, Подробнее см. здесь. Там вряд ли будут заметные различия в производительности, вы должны использовать то, что лучше обслуживается.

[1]: пространства имен модулей (import * as ns) также являются статическими, даже если ns.… выглядит как доступ динамического свойства