You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rollup+TS+Babel项目如何转译第三方依赖以兼容IE11环境?

Rollup+Babel转译第三方依赖适配IE11的正确方案

报错原因说明

你直接把penpal加入Babel的include列表遇到的两类警告都不影响功能,只是配置不完善导致的提示:

  • sourcemap相关警告是因为penpal发布的npm包内的JS文件携带了sourcemap引用,但你安装的依赖包没有包含对应源码,Babel转译时找不到对应原始文件就会抛出警告,不影响最终打包结果
  • this被重写为undefined的警告是因为ES规范中ES模块顶层的this为undefined,penpal的源码在顶层错误使用了this,Rollup做合规性检查时抛出的提示,实际运行时只要把顶层this绑定到window就不会有问题

正确实现方案

方案1:仅转译指定第三方依赖(性能优先)

适合只有少量第三方依赖需要转ES5的场景,修改你的rollup配置补充两个参数即可:

const rollupPlugins = [
  resolve({ extensions }),
  commonjs(),
  babel({
    babelHelpers: "bundled",
    include: ["src/**/*.ts", "node_modules/penpal/**/*.js"],
    extensions,
    sourceMaps: false, // 关闭转译阶段的sourcemap校验,消除对应警告
  }),
];

export default async () => {
  if (process.env.NODE_ENV == "serve") {
    rollupPlugins.push(serve("dist/bundles"));
  }

  return {
    input: "src/initializer/main.ts",
    context: 'window', // 将模块顶层this绑定为window,消除this undefined的警告
    output: [
      // 原有output配置保持不变
      {
        file: "dist/bundles/main.unminified.js",
        format: "iife",
        name: "cp",
        extend: true,
      },
      {
        file: "dist/bundles/main.js",
        format: "iife",
        name: "cp",
        plugins: browserPlugins,
        extend: true,
        sourcemap: true,
      },
    ],
    plugins: rollupPlugins,
  };
};

方案2:使用getBabelOutputPlugin统一转译打包产物(稳妥优先)

你现在用的这个方案是官方支持的规范实现,完全可以用。适合有大量第三方依赖需要转译,或者不确定哪些依赖包含ES6+语法的场景,不需要逐个添加include规则,不会出现漏转的情况,配置示例如下:

import babel, { getBabelOutputPlugin } from "@rollup/plugin-babel";
// 其他import保持不变

const extensions = [".js", ".ts"];
const prod = process.env.NODE_ENV == "production";
const browserPlugins = [
  terser({
    output: {
      comments: false,
    },
  }),
];

// 原有src目录的Babel转译保持不变
const rollupPlugins = [
  resolve({ extensions }),
  commonjs(),
  babel({
    babelHelpers: "bundled",
    include: ["src/**/*.ts"],
    extensions,
  }),
];

export default async () => {
  if (process.env.NODE_ENV == "serve") {
    rollupPlugins.push(serve("dist/bundles"));
  }

  return {
    input: "src/initializer/main.ts",
    output: [
      {
        file: "dist/bundles/main.unminified.js",
        format: "iife",
        name: "cp",
        extend: true,
        // 对打包完成的产物统一做ES5转译
        plugins: [getBabelOutputPlugin({
          presets: [['@babel/preset-env', { targets: "ie 11" }]]
        })]
      },
      {
        file: "dist/bundles/main.js",
        format: "iife",
        name: "cp",
        extend: true,
        sourcemap: true,
        plugins: [
          getBabelOutputPlugin({
            presets: [['@babel/preset-env', { targets: "ie 11" }]]
          }),
          ...browserPlugins
        ],
      },
    ],
    plugins: rollupPlugins,
  };
};

方案选择建议

  • 如果只有1-2个第三方依赖需要转译,优先选方案1,转译性能更高
  • 如果依赖较多,或者后续会频繁新增依赖,选方案2更省心,维护成本更低,实现也符合规范

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:39:02