2017-05-16 157 views
8

在過去,我使用了revealing module patternES6的地道展示模塊模式

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模塊語法透露出模塊模式的慣用模式?

+0

我個人比較喜歡的選項#2,因爲這感覺就像是緊密匹配RMP。 – evolutionxbox

+1

您也可以直接導出函數定義:'export function foo(){...'。這個問題是基於某種意見的,這裏是我的:不要默認導出「名稱空間對象」,因爲無論如何,我們可以從'。export/file''中導入*。 –

+0

對不起,我錯過了「我也想繼續在底部明確定義模塊導出的API」,但仍然認爲默認應該提供一些基本的東西,例如TheOneClassToRuleThemAll和可能的實用程序等屬於無格式導出,因此模塊的用戶可以輕鬆地在導入語句中解構,或者執行明星導入。 –

回答

6

我讀了默認的出口首選

不,他們不是所有的時間。它們更簡單,語法更短,可能會更頻繁地使用(因爲有更多的小型單一導出模塊),但它們通常不是首選。

使用正確的工具進行工作。你已經知道你想要的優點。

是否有與ES6模塊語法透露出模塊模式的慣用模式?

是,選項#1。當您有多個要導出的東西時,請始終使用命名導出。

你得到顯式混疊和樹從挑剔語法晃動

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

以及命名空間

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

這就是我需要聽到的。謝謝@Bergi! – sfletche