Запустить функцию, загруженную из модуля ecmascript 6

Я впервые пытаюсь использовать систему модулей ecmascript 6. Я использую компилятор traceur. Даны два файла es6:

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

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

Traceur (я использую задачу grunt-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>

И ничего не происходит. Я не вижу своего предупреждения. Что я делаю неправильно?

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 рукой. Просто кое что для раздумий.

Другие вопросы по тегам