3

我有一个用 Angular.js 编写的旧项目。我需要为 IE11 填充承诺,但它不起作用。

在 gulpfile.js 我需要 Babel 的东西

var corejs = require('core-js/stable'),
    regenerator = require('regenerator-runtime/runtime'),
    presetEnv = require('@babel/preset-env'),
    concat = require('gulp-concat'),
    gulp = require('gulp'),
    babel = require('gulp-babel'),
    babelRegister = require ('@babel/register'),

在这里我正在使用管道

var envJS = function () {
    var condition = (config[environment].compression);
    return gulp.src(paths.appJS)
        .pipe(babel(
            {
                "presets": [
                    [ "@babel/preset-env", {
                      "targets": {
                          "browsers": ["ie >= 11"]
                      },
                      "useBuiltIns": "entry",
                      "corejs": 3 
                    }]
                  ]
            }
        ))
        .pipe(ngAnnotate())
        //.pipe(gulpif(!condition, jshint()))
        //.pipe(gulpif(!condition, jshint.reporter('default')))
        .pipe(addStream.obj(prepareTemplates()))
        .pipe(configServer())
        .pipe(gulpif(condition, uglify({mangle: true})))
        .pipe(concat(randomNames.js))
        .pipe(gulp.dest(folderDist))
        .pipe(connect.reload());
};

该代码在 chrome 上构建和工作,但在 IE11 上仍然存在问题,这意味着它没有填充 Promise 对象。

我被卡住了,不知道我还能做什么。

4

2 回答 2

2

简单的解决方案是将@babel/preset-env选项useBuiltIns从更改"entry""usage"。另外,您需要确保您的浏览器目标设置正确。“ie >= 11”是相对最新的,可能根本不需要 polyfil。

至于“为什么”部分,简而言之

  • useBuiltIns: "usage"意思是:在每个需要它的文件中自动导入polyfil代码
  • useBuiltIns: "entry"意思是:只检查我的入口文件,看看我是否手动导入 "core-js/stable""regenerator-runtime/runtime"模块。如果我这样做,请微调我的导入以适应浏览器目标的需要

总而言之,如果您正在使用useBuiltIns: "entry"并且忘记手动导入"core-js/stable""regenerator-runtime/runtime"在您的入口文件中,那么您就完蛋了。如果你配置你的浏览器目标错误,你也被吓到了。

这两个来源更详细地解释了:

于 2021-08-05T02:32:53.030 回答
2

我在promise-polyfill上取得了很好的成功。只要在您的特定于承诺的代码之前加载它,它就应该可以工作。我知道这不是特定于 babel 的,但是当我仍然必须支持 IE 时,它解决了我的 IE 兼容性问题。

于 2020-11-30T22:49:59.113 回答