Предустановки Babel es2015 не переводят Map и Set на es5
Я использую gulp-babel для перевода своего кода es6 в es5
gulp.task('build_all_debug', ['config', 'compile'], function() {
var stream = gulp.src(['public/js/config.js', 'public/js/*.js', 'public/compiled/*.js'])
.pipe(babel({
presets: ['es2015']
}))
.pipe(concat('app.js'))
.pipe(gulp.dest('public/dist'));
return stream;
});
Хотя он в основном работает нормально, он фактически не переводит Map и Set. Мой код js результата все еще включает их, и когда я запускаю модульное тестирование с помощью karma/mocha/phantomJs, я получаю следующую ошибку:
PhantomJS 2.1.1 (Mac OS X 0.0.0) notes.controller "before each" hook: workFn for "loads notes from the service" FAILED
Can't find variable: Map
activate@public/dist/app.js:2402:39
Есть ли способ заставить babel перевести Map и Set в объект и массив в es5?
3 ответа
Вы должны включить babel-polyfill
в вашем коде.
Вы должны установить его с помощью npm:
npm install babel-polyfill
и затем, если вы используете модули ES6:
import 'babel-polyfill';
или же:
require('babel-polyfill');
Если вы хотите запустить свой код в браузере, вы можете загрузить его из cdnjs:
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.16.0/polyfill.min.js"></script>
Бабель не может "перевести" Map
а также Set
потому что они не являются языковыми функциями (хотя они описаны в спецификации ES). Это классы, которые существуют в глобальной области видимости.
Вы должны использовать polyfill, который определяет коллекции ES6, чтобы вы могли продолжать использовать их в браузерах, которые не поддерживают. Я не уверен, какую библиотеку использует Babel, но es6-shim должен охватывать все основные части.
Вам не нужно менять ваш код, чтобы использовать polyfill, он просто определяет Map
(и друзья) для нормального использования позже.
Бабель не переносит Map
а также Set
до ES5.
Вместо этого используйте их polyfill:
Чтобы поддерживать Карты, Наборы, Слабые карты и Слабые наборы во всех средах, необходимо включить полифилл Babel.