从ECMAScript的6模块加载运行功能(Run function loaded from ecm

2019-11-03 09:49发布

我尝试使用的ECMAScript 6个模块系统第一次。 我用traceur编译器。 给定两个ES6文件:

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

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

Traceur(我用咕噜-traceur任务),它们编译为:

// 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:

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

并没有任何反应。 我看不到我的警觉。 我究竟做错了什么?

Answer 1:

通过编译前你的代码模块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标志。 相反,如果你编译init.js--script标志,也不会封装init代码作为一个模块,你不需要调用System.get手。 只是要思考的问题。



文章来源: Run function loaded from ecmascript 6 module