2016-09-06 6 views
2

Я не могу получить ES6/2015 imports для работы. Из this Understanding ECMAScript 6 book, я понимаю, что нужно писать свои <script> тегов с type атрибутом modules:Как получить импорт/модули ES6/2015, работающие в браузерах?

<script type="module" src="module.js"></script> 

Тогда я могу использовать import в module.js. Однако он не работает с последними версиями Firefox (v48.0.1) и Chrome (v53.0.2785.89). На консоль ничего не записывается, когда я поставил оператор console.log в module.js.

Как я могу использовать механизм импорта ES2015 в браузере (изначально, не используя что-то вроде babel/webpack)?

UPDATE: Похоже Microsoft's Edge browser supports modules, по крайней мере, в экспериментальном режиме. Почему другие браузеры не поддерживают его, по крайней мере, в экспериментальном режиме?

+3

Модули ES6 еще не поддерживаются в браузерах. – loganfsmyth

+0

Вы ... не можете. Подождите, пока время работы будет поддерживать его, и используйте webpack в среднем. – ssube

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import пока не поддерживается –

ответ

2

Вы не можете. Синтаксис и контракт были определены в спецификации ECMAScript, но реализация не существует в какой-либо крупной среде выполнения.

Пока какая-либо платформа не предоставляет встроенный объект System и связанную с ним загрузку модуля, вы застряли в Webpack или что-то похожее на polyfill.

Хотя это может показаться драматическим упущением со стороны браузера, эта функция достаточно проста, чтобы полилизовать.

+1

Есть ли хорошая библиотека полиполков для этого? –

+0

Я считаю, что оба [Webpack 2] (http://stackoverflow.com/questions/36103641/dynamic-system-import-with-webpack) и [SystemJS] (https://github.com/systemjs/systemjs) поддерживают 'System' и большинство функций. К сожалению, они намного тяжелее, чем просто полипол. – ssube

+1

На самом деле Webpack shims 'System.import' в * время транспиляции * i.s.o at * runtime *. Поэтому внутренне в ваших модулях bundle.js смотрят друг на друга, используя 'System.import' (или' import'), но со стороны это вам не поможет. Во время выполнения вы все равно не увидите объект 'System.import', с которым вы можете взаимодействовать. –

0

На данный момент import и export Элементы ES6 не поддерживаются ни одним браузером (см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export для получения дополнительной информации об этом).

Вам необходимо использовать компилятор, который преобразует ваш код с использованием этих ключевых слов, один из наиболее распространенных и используемых babel.

+0

Я знаю о Babel, как я упоминал в вопросе. Странно, что казалось, что современные браузеры были почти 100% на ES6/2015 (по крайней мере, согласно https: // kangax.github.io/compat-table/es6/) –

+0

Стандарт ES2015 определяет синтаксис и семантику импорта и экспорта переменных, но он не определяет, где действительно могут загружаться модули. Я считаю, что это часть будущего стандарта HTML/DOM. – AgentME