2014-10-19 30 views
0

我嘗試首次使用ecmascript 6模塊系統。我使用traceur編譯器。給定兩個ES6文件:從ecmascript 6模塊加載的運行函數

// app.js 
export function row() { 
    alert('row'); 
} 

// init.js 
import { row } from 'public_js/app'; 
row(); 

Traceur(我用咕嚕-traceur任務),它們被編譯爲:

<script src="/path/to/compiled/init.js" type="module"></script> 

// app.js 
System.register("public_js/app", [], function() { 
    "use strict"; 
    var __moduleName = "public_js/app"; 
    function row() { 
    alert('row'); 
    } 
    return {get row() { 
     return row; 
    }}; 
}); 

// init.js 
System.register("public_js/init", [], function() { 
    "use strict"; 
    var __moduleName = "public_js/init"; 
    var row = System.get("public_js/app").row; 
    row(); 
    return {}; 
}); 

我包括通過簡單的腳本標籤編制的init.js版本到我的HTML

沒有任何反應。我沒有看到我的警報。我究竟做錯了什麼?

+0

你只是宣佈他們,不需要他們。 – Bergi 2014-10-19 21:10:20

+0

嘗試將type =「module」添加到腳本標記中? – 2014-10-20 00:32:34

+0

@BrianGenisio這是一個錯字,在我的代碼中我有類型模塊,沒有它腳本會拋出系統未定義的錯誤。 – 2014-10-20 06:53:32

回答

2

通過將代碼作爲模塊預編譯爲ES5,您現在將它從ES6中的自動導入/模塊加載系統的世界中取出,並且需要使用ES5機制加載它。因此,您需要包含已編譯的代碼,而不需要type=module屬性,然後get()模塊啓動了世界其他地方。

所以,我下面的作品:

<script src="/path/to/compiled/app.js"></script> 
<script src="/path/to/compiled/init.js"></script> 
<script> 
    System.get('public_js/init'); 
</script> 

既然你是預編譯的代碼,我建議您連接所有的編譯代碼到一個單一的JS文件,以避免包括他們所有。

如果您在不編譯代碼的情況下使用Traceur,那麼您可以在ES6結構中生活。這包括type="module"和/或import 'module-name'

編輯 考慮到這一點,app.js被正確編譯爲模塊。但是,init.js不需要編譯爲模塊。您正在使用--module標誌編譯代碼。相反,如果您使用--script標誌編譯init.js,則它不會將init代碼封裝爲模塊,並且您無需手動調用System.get。只是想一想。

+1

這個效果很好!非常感謝你 – 2014-10-20 20:10:54