2014-10-19 40 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