2014-10-19 4 views
0

Я пытаюсь использовать систему модулей ecmascript 6 в первый раз. Я использую traceur-компилятор. Учитывая два ES6 файлов:Функция запуска, загруженная из модуля ecmascript 6

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

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

трейсера (я использую черновой-трейсер задач) компилирует их:

// 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 {}; 
}); 

I включает скомпилированную версию init.js к моему HTML с помощью простого тега сценария:

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

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

+0

Вы только объявляете их, не требуя их. – Bergi

+0

Попробуйте добавить type = "module" в свой тег скрипта? –

+0

@BrianGenisio Это была опечатка, в моем коде у меня есть модуль типа, без него скрипт вызывает ошибки, которые система не определена. –

ответ

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. Если вместо этого вы компилируете init.js с флагом --script, он не будет инкапсулировать код init в качестве модуля, и вам не нужно звонить System.get вручную. Просто кое что для раздумий.

+1

Это хорошо работает! большое спасибо –