2015-04-27 2 views
13

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

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

//------ 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) Импорт: Синтаксис «* как» является моим предпочтительным методом, так как он позволяет использовать точечную нотацию (ссылаясь как на модуль, так и на метод), помогая считывать код. Имеет ли это последствия для производительности, хотя, когда я могу использовать только один из методов?

+0

С 'импорта {myMethod1, myMethod2} от 'myMethods';' импортированные методы делают не должны быть разыменованы как переменные. Хотя я сказал, что не уверен, что точечная нотация фактически рассматривается как переменная. – user5321531

ответ

19

Класс только статические методы чувствует себя немного в «код» запах

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

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

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

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

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

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

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

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

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

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

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

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

+0

Я бы использовал класс для экспорта класса с целью создания экземпляров класса. Простой '{...}' в остальном - это все, что нужно. – user5321531

+0

@ user5321531: Да, но класс с только статическими методами не требует никаких экземпляров :-) – Bergi

+0

Я пытаюсь, но это дает мне ошибку «Utils.formatText не является функцией», что я сделал не так? – orelzion

Смежные вопросы