如何为 IE11 内联 Rollup/Babel polyfill

2023-12-21

我已经在 PHP 项目上工作了一段时间,客户在最后一刻要求提供 IE11 支持。我可以处理 HTML/CSS 问题,但我的 javascript 是用现代语法编写的。

因此,我安装了 Node,使用 JavaScript,在第一次需要时通过 Rollup & Babel 运行它,并缓存结果以供将来的请求。

现在输出缺少了之前让我头疼的箭头函数,但我遇到了一个更大的问题:polyfills 是 import 语句并且IE11不支持import语句.

我觉得我需要强调,我没有运行节点服务器 - 它是一个 PHP 服务器,我只是在后端使用节点来进行汇总和 babel。如果节点做了一些事情来完成这项工作,我不熟悉它。

这是我的 rollup.config.js:

import commonjs from 'rollup-plugin-commonjs';
import resolve from 'rollup-plugin-node-resolve';
import babel from 'rollup-plugin-babel';
import minify from 'rollup-plugin-babel-minify';

export default {
  input: '_dud_input.js', // These are set in the exec() call
  output: {
    file: '_dud_output.js', // These are set in the exec() call
    format: 'iife',
    strict : false
  },
  plugins: [
    resolve({
      browser: true
    }),
    commonjs({
      sourceMap: false
    }),
    babel({
      exclude: 'node_modules/**' // only transpile our source code
    }),
    minify({
      "comments": false
    })
  ]
};

这是babel.config.js:

module.exports = {
  "presets" : [
    [
      "@babel/preset-env",
      {
         "targets": {
           "browsers": "> 0.5%, ie >= 11"
         },
        "modules": false,
        "spec": true,
         "useBuiltIns": "usage",
         "forceAllTransforms": true,
         "corejs": {
           "version": 3,
           "proposals": false
         }
      }
    ]
  ]
}

为了搞笑,下面是我调用来运行该进程的 shell 脚本:

#!/bin/bash

set -e

# Expected argument values:
# $1 - Path of the root directory
# $2 - Path of the node binary
# $3 - Path of the rollup binary
# $4 - Source file path
# $5 - Destination file path

if [ $# -ne 5 ]
  then
    exit 99
fi

ROOT_DIR=$1
NODE_BIN=$2
ROLLUP_BIN=$3
SRC_PATH=$4
DEST_PATH=$5

cd ${ROOT_DIR}

${NODE_BIN} ${ROLLUP_BIN} -c ${ROOT_DIR}/rollup.config.js -i ${SRC_PATH} -o ${DEST_PATH}

它的链接如下:

<script defer="" type="text/javascript" src="http://example.com/site-asset/flatfile.js"></script>

通过这些设置,我的 flatfile.js 在顶部输出以下内容:

import"core-js/modules/es.symbol";
import"core-js/modules/es.symbol.description";
import"core-js/modules/es.symbol.iterator";
import"core-js/modules/es.array.concat";
import"core-js/modules/es.array.filter";
import"core-js/modules/es.array.find";
import"core-js/modules/es.array.for-each";
// ...etc...

在此设置下 IE11 的控制台显示有一个Syntax error在每个文件的第一行包含 import 语句。

改变useBuiltIns from usage to entry(据我所知,这意味着我希望在其他地方有一个添加填充的入口文件)并包括https://polyfill.io/v3/ https://polyfill.io/v3/没有做任何事情(我收到错误Number.parseFloat() calls).

出于绝望,我什至在我的应用程序中添加了一条“core-js”路由,该路由尝试提供适当的 core-js 文件 - 但没有迹象表明 IE11 甚至试图遵循 require 语句。

环顾互联网,这似乎对其他人来说不是问题 - IE11 显然对其他人有效?

也许是因为我没有使用节点服务器,而是 PHP/Apache 服务器?

我只是希望 Babel 在我的文件中包含 core-js polyfill,而不是 IE11 不知道如何解析的 require 语句。


我不得不禁用babel-minify插件,但除此之外,复制配置似乎工作得很好,我得到了一个没有导入语句的捆绑 JavaScript 文件。

这些文件复制如下,但完整的测试存储库可在https://github.com/akx/so58712204 https://github.com/akx/so58712204yarn; yarn build并查看dist/...

babel.config.js

module.exports = {
  presets: [
    [
      "@babel/preset-env",
      {
        targets: {
          browsers: "> 0.5%, ie >= 11"
        },
        modules: false,
        spec: true,
        useBuiltIns: "usage",
        forceAllTransforms: true,
        corejs: {
          version: 3,
          proposals: false
        }
      }
    ]
  ]
};

包.json

{
  "scripts": {
    "build": "rollup -c ./rollup.config.js -i ./src/entry.js -o ./dist/output.js"
  },
  "dependencies": {
    "@babel/core": "^7.7.0",
    "@babel/preset-env": "^7.7.0",
    "core-js": "^3.3.6",
    "rollup": "^1.26.3",
    "rollup-plugin-babel": "^4.3.3",
    "rollup-plugin-babel-minify": "^9.1.0",
    "rollup-plugin-commonjs": "^10.1.0",
    "rollup-plugin-node-resolve": "^5.2.0"
  }
}

rollup.config.js

import commonjs from "rollup-plugin-commonjs";
import resolve from "rollup-plugin-node-resolve";
import babel from "rollup-plugin-babel";

export default {
  input: "_dud_input.js", // These are set in the exec() call
  output: {
    file: "_dud_output.js", // These are set in the exec() call
    format: "iife",
    strict: false
  },
  plugins: [
    resolve({
      browser: true
    }),
    commonjs({
      sourceMap: false
    }),
    babel({
      exclude: "node_modules/**" // only transpile our source code
    })
  ]
};

src/entry.js

import { magicNumber } from "./magic";
console.log(new Set([Number.parseFloat(magicNumber)]));

src/magic.js

const magicNumber = "8.82";
export { magicNumber };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 IE11 内联 Rollup/Babel polyfill 的相关文章

随机推荐

  • 使用 LINQ 将项目移动到列表顶部

    有没有办法使用 LINQ 将 id 10 的项目移动为列表中的第一项 Item A id 5 Item B id 10 Item C id 12 Item D id 1 在这种情况下 我怎样才能优雅地将项目 C 移动到我的顶部List
  • Jquery 拖放,无需插件

    我尝试使用 JQuery 创建一个拖放插件 draggable on mousemove function var mouseposition this also needs to account for onclick offset of
  • 当目标系统关闭时,停止 Spring Cloud Stream @StreamListener 监听

    我有一个应用程序 它从 Kafka 获取消息并调用目标系统来更新旧版 Oracle 数据库 我想要启用一个场景 如果目标系统关闭 则将消息留在 Kafka 总线上 并且在给定的时间内不处理它们 我正在考虑一些基于 Hystrix 的断路器解
  • 我们可以在 swing 中开发非常漂亮的 UI吗?如果不能的话有什么替代方案

    在我当前的项目中 我们必须用 java 开发一个漂亮的基于桌面的应用程序 目前 我们有一个用 swing 编写的非常基本的桌面应用程序 并且团队没有很好的 swing 知识 我们能在 swing 中创建一个非常好看的 UI 吗 我们应该使用
  • 使用 select() 实现超时

    我只能在 select API 中将超时参数设置为最多 20 秒 无论我给出的值高于 20 select 都会在 20 秒后返回 所以我试图写一个超时 1 分钟的循环 如下所示 int timeoutcount 0 do FD ZERO f
  • 将尽可能多的事件纳入时间表的算法

    我正在尝试找到一种算法 可以将尽可能多的非重叠事件安排到时间表中 其中可以根据需要在时间表中添加或删除任何这些事件 这些事件都不能重叠 但我想将尽可能多的事件纳入每日日程中 12 00 PM 12 45 PM Lunch 1 00 AM 3
  • 如何在 C++ 中使用 GLUT / OpenGL 绘制文本?

    如何使用 GLUT OpenGL 绘图函数在屏幕上绘制文本字符串 用GLUT绘制字符串有两种方法 glutStrokeString https linux die net man 3 glutstrokestring将绘制 3D 文本 so
  • 访问 SQL - 更改列以自动编号?

    如何使用 SQL 更改 MS Access 中的表以将数据类型更改为自动编号 我尝试跟随但没有成功 ALTER TABLE PERSON ALTER COLUMN PERSON ID Integer PRIMARY KEY counter
  • PHP MySQL INSERT 不插入也不显示任何错误

    我已经得到了这段代码 因此可以通过 PHP 将值插入 MySQL 中的表中 我已经尝试了所有可能的插入语法 它不插入数据 这是我使用的代码 param xyzxyz param1 sdfdfg sql INSERT INTO trail U
  • Angular JS 表中嵌套 ng-repeat

    我是 Angular JS 的新手 我一直在尝试迭代模型集合并将其显示在表格中 该模型看起来像 var myModule angular module myModule controller myController function sc
  • 如果安装了 Visual Studio 2010,我可以使用 XNA 创建游戏吗?

    非常简单的问题 谢谢 作为一个学究 是的 你可以 只是不在 VS 2010 内部 你可以并行安装 2008 Express 版本并使用它 直到他们更新 2010 年的 XNA
  • android.intent.action.MAIN 的含义是什么?

    我见过很多不同的令人困惑的解释
  • 如何强制 IIS Express 在 32 位模式下运行?

    我有一个经典的 ASP 应用程序 我试图在 64 位 Windows 上的 IIS Express 下运行它 它使用 Jet 连接到 Microsoft Access 数据库 并且无法在 64 位下运行 我为 ASP 应用程序创建了以下应用
  • 如何同时给图片添加对比度、亮度等多种效果

    我使用 python 创建了一个简单的程序来更改图片对比度 亮度颜色等 首先 我只添加了一个效果 效果很好 我设法将其与缩放器链接 然后我尝试一次添加多种效果 我也与缩放器链接 但是当我尝试在图片上添加多种效果 例如同时对比度和亮度 时 我
  • Supabase:列级安全解决方案

    目前 我正在使用 Supabase 数据库 我面临的一大障碍是列级安全性 这似乎比 RLS 复杂得多 假设我有一个名为is banned 可见但不可编辑 但是 其余列应该是可编辑和可查看的 我真正能想到的唯一解决方案是将其分成两个表 并在
  • Visual Studio Code 需要显式清理和构建

    所以 我是一个老派的 Visual Studio 用户 刚刚迁移到 Visual Studio Code 我认为我在这里遗漏了一些东西 不过 我将解释一下我在这里所经历的事情 使用 Visual Studio 我始终可以右键单击解决方案并重
  • Globbing 不适用于 Minitest - 仅运行一个文件

    我已将所有规格放入specs rb 但是 当我运行 Minitest 时ruby spec spec rb 仅运行一个文件 是什么赋予了 这不是 Minitest 特定的 而是 Ruby 的 您实际上正在运行一个 ruby 程序 它对正在运
  • 识别多个意图(针对 onActivityResult)

    我在一项活动中有 5 个意图 他们都在使用startActivityForResult 因为它们都要对应布局中的不同元素 我如何识别哪个意图是结果 例如如果我有意图1 意图2 意图3 它们都在使用startActivityForResult
  • 为什么在方法中抛出一般异常是不好的? [复制]

    这个问题在这里已经有答案了 为什么在 Java 中通过方法抛出一般异常是一种不好的做法 class Test public void ex throws Exception some code throwing for eg Illegal
  • 如何为 IE11 内联 Rollup/Babel polyfill

    我已经在 PHP 项目上工作了一段时间 客户在最后一刻要求提供 IE11 支持 我可以处理 HTML CSS 问题 但我的 javascript 是用现代语法编写的 因此 我安装了 Node 使用 JavaScript 在第一次需要时通过