Javascript ES6模块:导出单个静态方法类或多个单独的方法

Javascript ES6模块:导出单个静态方法类或多个单独的方法,javascript,class,module,ecmascript-6,Javascript,Class,Module,Ecmascript 6,我正在使用ECMAScript 6模块。从下面的选项中从模块导出/导入多个方法的正确方法是什么 单一类别的静态方法: //------ myClass.js ------ export default class myClass { static myMethod1() { console.log('foo'); } static myMethod2(args...) { console.log('bar'); } } //------ app.

我正在使用ECMAScript 6模块。从下面的选项中从模块导出/导入多个方法的正确方法是什么

单一类别的静态方法:

//------ 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) 进口: “*as”语法是我首选的方法,因为它允许您使用点表示法(引用模块和方法)来帮助代码可读性。当我可能只使用其中的一种方法时,这会影响性能吗

一类纯静态方法感觉有点“代码味道”

是的。这里不需要
结构!只需导出一个普通的“模块”对象:

不过,我建议您使用第二种方法,即多次导出

单独导出所有内容确实感觉有点冗长

嗯,你不需要任何包装结构,所以我想说这是较少的样板。您只需显式标记要导出的所有内容,这不是一件坏事

*as
语法是我的首选方法,因为它允许您使用点表示法(引用模块和方法)帮助代码可读性

这在很大程度上是个人偏好,并且取决于您正在编写的代码类型。有时简洁性更高,但明确引用模块的能力也会有所帮助。请注意,此处使用
*as
的命名空间导入与默认导入对象非常相似,尽管只有命名的导出允许您通过
导入{myMethod1,myMethod2}
直接引用它们。所以最好让那些导入模块的人来选择

这对性能有影响吗

不多。目前的ES6实施还没有以性能优化为目标

一般来说,静态标识符比属性访问更容易解析和优化[1],从理论上讲,多个命名导出和部分导入可以使JIT更快,当然,如果在绑定期间删除未使用的导出,则加载较小文件所需的时间更少。有关详细信息,请参阅。几乎不会有明显的性能差异,您应该使用更好的可维护性


[1] :模块名称空间(
import*as ns
)也是静态的,即使
ns….
看起来像动态属性访问

TLDR;使用多个导出方法和显式导入

@Bergi说得对,在第一种情况下,不需要一个带有静态字段的类,只需要一个对象。但是,以下情况不鼓励使用此选项:

请注意,默认导出对象通常是反模式(如果要导出属性)。您将失去一些ES6模块的好处(和)


Airbnb的开发人员推荐命名导出和显式wildcrad导入,请参见此线程:

使用
从“myMethods”导入{myMethod1,myMethod2}导入的方法不必像变量那样取消引用。尽管如此,我不确定点表示法是否被视为变量。请参阅,如果为了实例化类的实例而导出类,我将使用类。一个普通的
{…}
否则就是所需要的一切。@user5321531:是的,但是一个只有静态方法的类不需要实例化:-)能够导出默认值*(作为一个包含所有命名导出的对象,*会很好,但我想这违背了“不应该有多个方法来实现它”的原则 philosophy@Rivenfall您可以从“/imf”将“
import*作为命名空间导入”
,然后
导出{默认名称空间}
。不过,我建议避免这种情况,只需让库的用户导入名称空间。@StevenT.Cramer您可以始终从'foo'导入{default as somethingcreative}
/
从'foo'导入somethingcreative
,命名导出不会改变这一点。当然,惯例是将“foo”模块作为
foo
导入。如果你的开发者不想坚持这个惯例,那是他们的问题(或者他们有很好的理由)。
//------ myMethods.js ------

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