You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Webpack+Babel Polyfill配置问题:IE11未兼容prepend方法

解决IE11中"Object doesn't support property or method 'prepend'"的问题

嘿,我明白你遇到的困惑——明明加了@babel/polyfill,IE11还是报prepend方法找不到的错,只能手动加兼容代码才能跑。其实问题出在两个地方:Babel预设的配置没到位,还有prepend这类DOM方法本来就不在默认Polyfill的覆盖范围内。下面一步步给你理清楚怎么正确配置:

1. 先把@babel/preset-env的配置补全

你现在的@babel/preset-env是默认配置,它不会自动根据目标浏览器按需注入Polyfill,只会转译语法,不会补全API。修改你的babel-loader配置,加上这几个关键参数:

use : {
  loader : 'babel-loader',
  options : {
    presets : [
      ['@babel/preset-env', {
        // 明确告诉Babel要兼容IE11和最近两个版本的主流浏览器
        targets: {
          browsers: ['IE 11', 'last 2 versions']
        },
        // 开启按需引入Polyfill,和入口的@babel/polyfill配合使用
        useBuiltIns: 'entry',
        // 对应你用的@babel/polyfill里的core-js版本(你的版本对应core-js@2)
        corejs: 2
      }]
    ],
    plugins : [ '@babel/plugin-syntax-dynamic-import' ]
  }
}

为什么要加这些参数?

  • useBuiltIns: 'entry':会把你入口里的全量@babel/polyfill替换成目标浏览器真正需要的Polyfill模块,既减小体积又保证兼容。
  • targets:让Babel精准知道要处理哪些浏览器的兼容,不会漏掉IE11的需求。

2. 处理prepend这类DOM方法的兼容

这里要注意:prepend是DOM Element的方法,不属于ES标准API,@babel/polyfill(基于core-js@2)默认是不包含它的Polyfill的。你有两种选择:

方式一:保留手动兼容代码(快速解决)

你现在写的手动兼容代码没问题,可以继续用,不过可以稍微简化一下:

// 在app.js顶部添加
if (!Element.prototype.prepend) {
  Element.prototype.prepend = function() {
    const frag = document.createDocumentFragment();
    Array.from(arguments).forEach(arg => {
      frag.appendChild(typeof arg === 'string' ? document.createTextNode(arg) : arg);
    });
    this.insertBefore(frag, this.firstChild);
  };
}

方式二:升级到core-js@3(更省心的长期方案)

如果可以升级你的Babel依赖,推荐直接用core-js@3——它包含了更多DOM相关的Polyfill,包括prepend,这样就不用手动写兼容代码了:

  1. 先安装新依赖:
npm install core-js@3 regenerator-runtime --save
  1. 修改Webpack入口,替换原来的@babel/polyfill
entry : ['core-js/stable', 'regenerator-runtime/runtime', './source/_assets/app.js'],
  1. 更新babel配置里的corejs版本:
presets : [
  ['@babel/preset-env', {
    targets: {
      browsers: ['IE 11', 'last 2 versions']
    },
    useBuiltIns: 'entry',
    corejs: 3 // 现在用core-js@3
  }]
]

3. 最后验证一下

改完配置后重新打包,把代码放到IE11里测试,应该就不会再出现prepend的报错了。另外,如果你有单独的.browserslistrc文件,记得里面也要加上IE 11,这样Autoprefixer这类工具也能配合做好CSS的兼容。


内容的提问来源于stack exchange,提问作者nemrrached

火山引擎 最新活动