【问题标题】:Idiomatic Revealing Module Pattern for ES6ES6 的惯用显示模块模式
【发布时间】:2017-10-15 19:48:10
【问题描述】:

过去我使用过revealing module pattern

function myModule() {
  function foo() ...
  function bar() ...

  return { 
    foo: foo, 
    bar: bar
  };
}

在 ES6 中,这通过对象简写得到了改进。

function myModule() {
  function foo() ...
  function bar() ...

  return { foo, bar };
}

现在使用内置模块语法,我正在努力寻找与上述最相似的首选模式。

选项 #1 命名为导出

// export file
function foo() ...
function bar() ...

export { foo, bar };

// import file
import { foo, bar } from './export-file';

foo();
bar();

选项 #2 带解构的默认导出/导入

// export file
function foo() ...
function bar() ...

export default { foo, bar };

// import file
import baz from './export-file';

const { foo, bar } = baz;

foo();
bar();

选项 #3 默认导出/导入名称间距

// export file
function foo() ...
function bar() ...

export default { foo, bar };

//import file
import baz from './export-file';

baz.foo();
baz.bar();

我喜欢带有命名导出的选项 #1,因为它在“解构”导入语法中提供了简单性。

import { foo, bar } from './export-file';

我还想继续在导出对象中的导出文件底部显式定义模块的导出API。

export { foo, bar };
// OR
export default { foo, bar };

我一直在阅读默认导出是首选的,因此我一直在尝试找到一个包含默认导出的首选模式,但我不愿意采用,因为它看起来更冗长,几乎没有优势(除了需要命名空间,或者在某些情况下同时包含命名导出和默认导出)。

在 ES6 模块语法中显示模块模式是否有惯用模式?

【问题讨论】:

  • 我个人更喜欢选项 #2,因为感觉它与 RMP 非常匹配。
  • 您也可以直接导出函数定义:export function foo() { ...。这个问题有点基于意见,这是我的问题:不要默认导出“命名空间对象”,因为无论如何都可以使用import * as baz from './export-file' 来实现这种效果。
  • 很抱歉我错过了“我还想继续在底部明确定义模块的导出 API”,但我仍然认为默认应该提供一些基本的东西,例如 TheOneClassToRuleThemAll和可能的实用程序等属于普通导出,因此模块的用户可以轻松地在导入语句中解构,或者进行星形导入。
  • 感谢@IljaEverilä。我开始看到其他地方也表达了这一点。 “仅当只有一个主要值要导出(例如一个类)时,才支持默认导出”。你和其他人表达的这种情绪,让我现在倾向于选项 #1。
  • 我一直在阅读”——在哪里?这种说法需要被揭穿。无处不在。

标签: javascript es6-modules


【解决方案1】:

我一直认为默认导出是首选

不,他们不是。它们更简单,语法更短,可能会更频繁地使用(因为有更多的小型单导出模块),但它们通常不是首选。

为工作使用正确的工具。您已经知道自己想要的优势。

在 ES6 模块语法中显示模块模式是否有惯用模式?

是的,选项 #1。当您有多个要导出的内容时,请始终使用命名导出。

您可以从挑剔的语法中获得显式别名和摇树

import { foo, bar } from './export-file';

还有命名空间

import * as baz from './export-file';

【讨论】:

  • 这就是我需要听到的。谢谢@Bergi!
  • 这很奇怪。我尝试了选项 1,function login();export { login };。当我在 CLI 中运行它时,我得到 export { login }; SyntaxError: Unexpected token export 什么?我正在通过cucumberJS 运行它。不知道我的问题是与导出有关还是与 JS 包有关。
  • 好的。 cucumberJS 是问题所在。我必须需要一个配置挂钩来支持 ES6/7 import/export。一切都好。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多