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

jam*_*mes 38 javascript module class ecmascript-6

我正在使用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
Run Code Online (Sandbox Code Playgroud)

多种导出方法:

//------ 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;
Run Code Online (Sandbox Code Playgroud)

1)导出:一类只是静态方法感觉有点"代码味道",但同样单独导出所有内容确实感觉有点冗长.它只是开发人员偏好还是存在性能影响?

2)导入:'*as'语法是我首选的方法,因为它允许您使用点符号(引用模块和方法)帮助代码可读性.当我可能只使用其中一种方法时,这是否有性能影响?

Ber*_*rgi 41

一类纯静态方法感觉有点"代码味"

确实是的.你class这里不需要一个结构!只需导出一个普通的"模块"对象:

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

export default {
  myMethod1() {
    console.log('foo'); 
  },
  myMethod2(args...) {
    console.log('bar'); 
  }  
};
Run Code Online (Sandbox Code Playgroud)

不过,我建议您使用多个导出的第二种方法.

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

好吧,你不需要任何包装结构,所以我认为它的样板更少.您只需要明确标记要导出的所有内容,这不是一件坏事.

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

这是个人偏好,并且取决于您正在编写的代码类型.有时简洁性是优越的,但明确引用模块的能力也是有帮助的.请注意,使用* as和默认导入的对象的命名空间导入在这里非常类似,但只有命名导出允许您直接通过它们引用它们import {myMethod1, myMethod2}.因此,最好将选择权交给那些导入模块的人.

这有任何性能影响吗?

不多.无论如何,当前的ES6实现还没有针对性能优化.

通常,静态标识符比属性访问更容易解析和优化[1],理论上多个命名导出和部分导入可以使JIT更快,当然,如果在捆绑期间删除未使用的导出,则较小文件需要较少的加载时间.详情请见此处.几乎没有明显的性能差异,你应该使用更好的可维护性.

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

  • @StevenT.Cramer 好吧,你总是可以执行 `import { default as Somethingcreative } from 'foo'`/`import somecreative from 'foo'`,命名导出不会改变任何内容。约定当然是将“foo”模块导入为“foo”。如果您的开发人员不想遵守该约定,那是他们的问题(或者他们有充分的理由)。 (2认同)

thi*_*ign 6

太长了;使用多种导出方法和显式导入。

@Bergi 是正确的,不需要一个带有静态字段的类,在第一种情况下只需要一个对象。然而, Axel Rauschmayer不鼓励这种选择:

请注意,默认导出对象通常是反模式(如果您想导出属性)。你会失去一些 ES6 模块的好处(tree-shaking更快地访问导入)。

Airbnb 的开发人员建议命名导出和显式通配符导入,请参阅此线程:https://github.com/airbnb/javascript/issues/710#issuecomment-297840604