当前位置: 首页 > 知识库问答 >
问题:

babel - 使用 Vite 在库模式下做兼容 IE 时遇到问题,求支持?

轩辕翰
2024-01-20

我在用 vite 构建库模式的 lib 包时,需要兼容 IE 浏览器,发现官方提供的 @vitejs/plugin-legacy 不支持库模式,需要用 babel 去实现,遇到了问题

看到 github issues 中提供了方案,我按照此方案写了如下配置:

const config: InlineConfig = {    mode: 'production',    build: {      lib: {        entry: resolve(pkgDir, 'index.ts'),        name: 'XXX',        fileName: () => `${packConf.filename}-${version}.${isDev ? 'js' : 'prod.js'}`,        formats: ['umd'],      },      sourcemap: isDev,      outDir,      minify: !isDev,      emptyOutDir: false,      rollupOptions: {        plugins: [           babel({             presets: [['@babel/preset-env', {               targets: { browsers: ['last 2 versions', 'ie >= 9'] },               //  modules: false,               //  corejs: '3',               useBuiltIns: false,             }]],             extensions: ['.js', '.ts'],             configFile: false, // 不加载外部的 babel 配置             babelHelpers: 'runtime',             plugins: [               ['@babel/plugin-transform-runtime',                 {                   corejs: 3,                 }],             ],           }) as any,                  ],      },    },    clearScreen: false,  };  build(config);

发现构建产物里多了一堆 babel加入的代码,其中包含这样的:

var createPropertyDescriptor$8 = function createPropertyDescriptor2(bitmap, value) {    return {      enumerable: !(bitmap & 1),      configurable: !(bitmap & 2),      writable: !(bitmap & 4),      value    };  };

这里的value 写法是明显不支持旧浏览器的,奇葩的是为了解决兼容问题使用了babel,结果babel又引入了不兼容的代码。
我使用的版本是:

"@babel/plugin-transform-runtime": "^7.23.7",    "@babel/preset-env": "^7.23.8",    "@babel/runtime": "^7.23.8",    "@babel/runtime-corejs3": "^7.23.8",    "@rollup/plugin-babel": "^5.3.1",    "vite": "^5.0.11",

我怀疑是和 vite/babel 的构建时序问题导致的,但想不太明白,求支持

这里有个在线实例可验证, 希望能帮我看下怎么调整:
https://stackblitz.com/edit/vitejs-vite-fip7pv?file=vite.conf...

在 dist/vite-ts.umd.js 里 410 行可以看到

共有1个答案

颜英博
2024-01-20

这个问题可能是由于 Babel 插件的加载顺序或者配置问题导致的。在 Vite 的库模式下,你需要确保 Babel 正确地处理了你的代码,以便在旧版浏览器上运行。

首先,你需要确保你的 Babel 配置是正确的。在你的例子中,你已经使用了 @babel/preset-env,并且设置了目标浏览器的兼容性要求。然而,有时候仅仅使用 preset 可能无法满足你的需求,你可能还需要自定义一些 Babel 插件或预设来处理特定的问题。

关于你提到的这段代码:

var createPropertyDescriptor$8 = function createPropertyDescriptor2(bitmap, value) {    return {      enumerable: !(bitmap & 1),      configurable: !(bitmap & 2),      writable: !(bitmap & 4),      value    };};

这段代码看起来是 ES6 的一个特性,用于创建属性的描述符。在旧版浏览器中,这个特性可能不被支持。如果你的目标是兼容旧版浏览器,你可能需要确保你的代码不使用这个特性,或者使用一些 polyfill 来模拟这个特性。

关于你使用的 Babel 插件版本,你可以尝试升级到最新版本,因为新版本可能修复了一些与旧版浏览器兼容性相关的问题。

另外,关于你提到的构建时序问题,Vite 的构建时序应该是先进行转译(通过 Babel),然后再进行其他的构建步骤。如果你怀疑是时序问题,你可以尝试调整你的构建配置,确保 Babel 在其他步骤之前运行。

最后,如果你仍然无法解决问题,我建议你创建一个简单的示例项目,只包含你遇到问题的部分代码和配置,然后尝试在 StackOverflow 或者其他社区寻求更具体的帮助。

 类似资料:
  • 由于项目的一些原因,我需要在打包的时候开启 cssCodeSplit 配置项目。如下图: 这样就会造成我每次打包的时候,就会在 dist 目录下自动生成这两个文件。 现在的问题就是,别的项目引入这个组件库的时候,必须在 main.ts 文件写两行这样的代码,引入样式文件以后才能正常使用我的这个组件库。 问题:vite 有没有什么配置可以设置打包后的文件路径呢?比如可以在每次打包的时候自动生成一个

  • 问题内容: 我正在为在所有Intranet站点上强制使用兼容模式的客户端做工作。我想知道是否可以在HTML中添加一个标记以强制兼容模式关闭。 问题答案: My Web Page Content goes here. 从链接的MSDN页面: 边缘模式告诉Windows Internet Explorer以可用的最高模式显示内容,这实际上打破了“锁定”范式。使用Internet Explorer 8,

  • 当我尝试使用带有Scrapy的蜘蛛下载图像时,会出现以下错误。 就我所能理解的而言,我好像在某个地方的url中少了一个“h”?但我一辈子也看不出在哪里。如果我不想下载图片,一切都正常。但是一旦我将适当的代码添加到下面的四个文件中,我就无法使任何东西正常工作。谁能帮我弄明白这个错误吗? items.py 设置.py pipelines.py products.py(我的蜘蛛) 如有任何帮助,将不胜感

  • 我不明白如何解决这个问题。我该怎么办。php和连接器。连接中的php文件。php第664行: 拒绝用户“root”@“localhost”的SQLSTATE[HY000][1045]访问(使用密码:YES)(SQL:select*from information\u schema.tables,其中table\u schema=STDHUB和table\u name=migrations) 插入连

  • 假设我有以下字符串: 我需要从这个字符串中提取以下数据: 标题1 F (S#H88(P#M6)(P#M31))和(S#K3(P#M58)(P#M58)) 而且 标题2 P (S#A54(P#R8))和(S#V59(P#A25)(P#Y82)) 哪里 是某种标题。 是某种状态。 是列表的某种列表,如 由于regex知识有限,我可以得到1和2,但只能得到3的第一部分。 可以存在多次,内部(P#xx)也

  • 我使用的是JAX-RS注解,但我遇到了@BeanParam的问题。我用的是Wildfly-Swarm和maven。以下几行是我错误的一部分: