Javascript ES6模块:导出单个静态方法类或多个单独的方法
我正在使用ECMAScript 6模块。从下面的选项中从模块导出/导入多个方法的正确方法是什么 单一类别的静态方法: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.
//------ 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');
}
};