Babel es2015预设不会将Map和Set转换为es5

swa*_*ang 6 javascript babel phantomjs ecmascript-6 karma-runner

我正在使用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;
});
Run Code Online (Sandbox Code Playgroud)

虽然它大部分工作正常,但它实际上并没有翻译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
Run Code Online (Sandbox Code Playgroud)

有没有办法强迫babel将Map和Set转换为es5中的对象和数组?

ssu*_*ube 5

Babel 不能“翻译” Mapand Set,因为它们不是语言特性(尽管它们在 ES 规范中有描述)。它们是存在于全局范围内的类。

您应该使用定义 ES6 集合的 polyfill,这样您就可以在不提供支持的浏览器中继续使用它们。我不确定 Babel 使用什么库,但es6-shim应该涵盖所有主要部分。

您无需更改代码即可使用 polyfill,它只是定义Map(和朋友)供以后正常使用。


Mic*_*ski 5

您必须包含babel-polyfill在您的代码中.

你必须用npm安装它:

npm install babel-polyfill
Run Code Online (Sandbox Code Playgroud)

然后,如果您使用的是ES6模块:

import 'babel-polyfill';
Run Code Online (Sandbox Code Playgroud)

要么:

require('babel-polyfill');
Run Code Online (Sandbox Code Playgroud)

如果要在浏览器中运行代码,可以从cdnjs加载:

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.16.0/polyfill.min.js"></script>
Run Code Online (Sandbox Code Playgroud)