2

我正在尝试使用 gulp-babel 用 Babel 转换一些 ES2015 代码,但 Babel 似乎忽略了我的浏览器列表。Babel 转换了一些现代特性,但并不是针对指定浏览器所需的全部。

在我的最小示例中,我使用Element.remove()并定位 IE 9。然后,由于IE 9 不支持该功能,我希望 Babel 将该行转换为类似Element.parentNode.removeChild(Element). 但这并没有发生,而是我的Element.remove()线路没有改变。

.browserslistrc如果我在文件中输入浏览器列表或完全删除浏览器列表,结果不会改变。

由于这是我第一次尝试转译代码,我想我可能会误认为 Babel 应该做什么。

最小的例子

在我的测试文件夹中,我有一个package.json

{
    "name": "test",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
    },
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "@babel/core": "^7.0.0-beta.51",
        "@babel/preset-env": "^7.0.0-beta.51",
        "gulp": "^3.9.1",
        "gulp-babel": "^8.0.0-beta.2"
    },
    "browserslist": "IE 9"
}

和一个gulpfile.js

const gulp = require('gulp'),
    babel = require('gulp-babel');

gulp.task('js', function() {
    return gulp.src('src/script.js')
        .pipe(babel({
            presets: ['@babel/preset-env']
        }))
        .pipe(gulp.dest('dist'));
});

“src”文件夹中的 ES6 文件script.js

window.addEventListener('load', () => {
    const myId = 'test';
    const myDiv = document.getElementById(`${myId}`);
    myDiv.remove();
});

哪个 Babel(通过 Gulp 任务js)转译到另一个script.js(在“dist”文件夹中)

"use strict";
window.addEventListener('load', function() {
    var myId = 'test';
    var myDiv = document.getElementById("".concat(myId));
    myDiv.remove();
});

因此,箭头函数被普通函数替换,const更改为var并将模板文字更改为常规字符串连接,但remove()保持原样。

我在这里做错了吗?还是只是我对巴别塔的期望过高?

4

1 回答 1

0

我误解了 Babel 对代码的实际作用。根据 Babel 网站“Babel 仅转换语法”,因此观察到的行为正是应该预期的。

我想那里有更聪明的解决方案(例如 Polyfill.io),但现在我正在我的 gulpfile.js 中使用正则表达式解决这些gulp-replace问题

const gulp = require('gulp'),
    babel = require('gulp-babel'),
    replace = require('gulp-replace');

gulp.task('js', function() {
    return gulp.src('src/script.js')
        .pipe(babel({
            presets: ['@babel/preset-env']
        }))
        .pipe(replace(/(\S*)\.remove\s*\(.*?\)\s*;/g, '$1.parentNode.removeChild($1);'))
        .pipe(gulp.dest('dist'));
});
于 2018-06-19T06:12:50.300 回答