【问题标题】:Using Parceljs, How to prevent jquery and bootstrap minimization on web extension packaging使用 Parceljs,如何防止 web 扩展打包时 jquery 和 bootstrap 最小化
【发布时间】:2021-12-05 19:18:05
【问题描述】:

我正在使用@parcel/transformer-webextension 转换器并取得了很好的成功。我有一个我正在尝试解决的问题。 Firefox 不高兴。

我从弹出窗口和选项页面的索引页面引用 jquery 和 bootstrap。我从 npm 引用它们,例如:

Parceljs 正在将它们处理为具有生成名称的最小化(再次)文件。这一切在其他浏览器中都能正常运行,但 Firefox 不喜欢这样,因为

  1. 它没有意识到这是 jquery,因为生成的文件的哈希值不匹配;和
  2. 它使用 innerHtml 在 DOM 中设置值。

如果我可以完整地通过最小化的 jquery 文件,它将接受它,因为它将正确应用散列。见:

JQuery not supported anymore?

如何配置 Parceljs 以保持 jquery.min.js 文件完整,将其传送到 dist 目录,并更新 HTML 中的引用?

提前致谢 - jlo

【问题讨论】:

  • 你能链接到一个简化的复制品吗,或者提供足够的细节让我可以试试?
  • @AndrewStegmaier 这是一个代表我正在包装的外壳。弹出页面和选项页面都引用了最小化的 jquery 和 bootstrap。打包后,这些文件被处理成 indexxxxxxx.js 文件。我想把它们都完好无损地交付,这样 Firefox 商店就不会抱怨了。它检查文件的哈希,并忽略最小化的 jquery 和引导文件中未更改的问题。 github.com/odelljl/parcel-web-ext-example

标签: jquery parceljs


【解决方案1】:

有两种方法可以解决这个问题。

  1. 你可以让你的<script>标签从一个cdn导入,像这样:

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.8/jquery.min.js"></script>
    

    Parcel 将保留以“http(s)”开头的任何内容(请参阅documentation)。您必须设置您的manifest.json,以便浏览器允许加载外部资源。我不是这里的专家,但我认为这是一个可以解决的问题(例如,参见 this question)。

  2. 您可以设置一个named pipeline,绕过该管道中资产的 js 转换器和优化器。例如,您的 .parcelrc 文件可能如下所示:

    {
      "extends": "@parcel/config-default",
      "transformers": {
        "manifest.json": ["@parcel/transformer-webextension"],
        "raw:*": ["@parcel/transformer-raw"]
      },
      "optimizers": {
        "raw:*": []
      },
      "packagers": {
        "manifest.json": "@parcel/packager-raw-url",
        "raw:*": "@parcel/packager-raw"
      }
    }
    
    

    然后,您可以像这样导入 jquery 和 bootstrap:

    <script src="raw:../../node_modules/jquery/dist/jquery.min.js"></script>
    <script src="raw:../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    

    请注意,脚本导入确实没有设置了type: "module"。在我的测试中,这很重要,因为如果 parcel 看到 type="module",它将尝试范围提升,从而导致错误。我认为从浏览器的角度来看这也是正确的,因为它们不是模块包。

    在我的测试中,上述配置会给你两个文件(dist 目录中的bootstrap.bundle.min.[hash].jsjquery.min.[hash].js。这些文件与node_modules 中的相应文件内容相同。我不认为 Firefox会抱怨包裹在他们的名字后面加了[hash],只要内容相同(见here)。

【讨论】:

  • 1.我想到了这种方法——但我在所有其他应用程序商店中都加载了干净的扩展程序,包括非常挑剔的 Apple,我不想处理让所有标题都正确的问题。这是一个选项,但我更愿意保持这个独立的扩展独立。 2. 在我的示例中,我所缺少的只是 NTML 中的原始前缀 - 谢谢!但是,更改名称似乎仍然会绊倒 Firefox。 bootstrap 对innerHTML的不安全分配... _webext-prod/bootstrap.bundle.min.1d0f0483.js line 6 column 64112
  • 啊拍摄-我刚刚注意到包裹在bootstrap.bundle.min.[hash].js的末尾添加了这些行://# sourceMappingURL=bootstrap.bundle.min.js.map。这可能会改变文件的哈希值——我想知道这是否真的是问题,而不是名称——你能测试一下吗?
  • 你读懂了我的想法——我只是测试了这个。当我用 npm 直接下载的缩小文件替换 jquery 文件时,它接受它并有一个小抱怨:检测到已知 JS 库警告:不鼓励 JavaScript 库用于简单的附加组件,但普遍接受。 jquery.min.js
  • 我想出了如何删除这些源映射线 - 只需将 "raw:*": "@parcel/packager-raw" 添加到 .parcelrcpackages 部分(我更新了答案以包含这个)。这能让 Firefox 开心吗?
  • 从头开始 - 我又搞砸了。问题实际上是源映射注释在原始bootstrap.bundle.min.js.map 文件中存在,但在包裹输出中。我试图弄清楚为什么 parcel 会这样做,以及是否有可能告诉它不要......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多