首页 > 解决方案 > 电子差分更新器即使做了最小的更改也会产生大量更改的块。难道我做错了什么?

问题描述

我正在开发一个基于 Electron 的项目。我们已经通过 electron-builder(使用 nsis-web 和一个单独的 mac 差异更新器分支)设置了差异更新,并期望它能够产生小的更新下载。

我们现在意识到,我们的应用程序的差异更新(打包/压缩时,应用程序总共约为 100mb)往往徘徊在 ~20-40mb 的下载量左右,大约有 ~1000 个更改块,即使在我们的情况下'在我们的源代码中只更改了字符串中的 1 个字符。随着我们用户群的增长,并且我们预见到需要快速部署更新,这可能会很快增加我们的服务器费用。我们期待一个相当低的增量下载,希望 <=1mb 用于微小的变化,例如单个字符,而不是接近整个应用程序大小的一半。

我们基于Electron React Boilerplate构建了我们的应用程序,它使用 webpack 来打包源代码。

我们目前正在混淆我们的 webpack 包,尽管这种行为也被跟踪到在添加混淆之前发生,因此将其排除为原因。

我不清楚块/文件增量的 7z 方法是否意味着文件中的单个更改可能会影响其所有块,如果是这样,分解它意味着未受影响文件的块本身将不受影响. (我还在努力

我们目前有许多模块被导入到我们的项目中以用于各种用途,这些模块正在打包到最终的 webpack 包中。我正在讨论是否尝试将模块保留在 webpack 包之外,但Electron 的性能页面似乎主张将所有代码捆绑在一起以避免调用昂贵的require()调用。我仍在尝试思考并尝试实验来理解行为。

  1. 有没有办法获得更小的差异下载,或者这是实际预期的增量大小?

  2. 如果是前者,是否有一些可能的原因导致我们做错了?

  3. 是否对差异更新程序有特别的了解,可以更好地理解如何处理它?

编辑:尝试了一个测试,我只更改了应用程序版本,差异更新程序仍然将其注销:

[2021-10-14 18:29:34.046] [info] File has 2092 changed blocks
[2021-10-14 18:29:34.058] [info] Full: 95,995.56 KB, To download: 42,767.89 KB (45%)

标签: webpackelectron7zipelectron-builder

解决方案


编辑:此解决方案不能完全解决 Mac 的问题。似乎本地组件正在被修改,即使只有 mac 包的版本更改,导致它们生成大量更改的块。

原答案如下:

简而言之:为包禁用 Asar。

我已经确定了一些问题,其中主要是 electron-builder 中的差异更新程序使用 7zip 来制作差异文件,根据我的理解,7zip 会生成文件结构的内部表示。

考虑到这一点,事实证明禁用 Electron 中标准和推荐的 ASAR 文件意味着所有源文件不再在其中组合,从而允许 7zip 单独跟踪它们。这意味着任何更改的文件似乎只会影响块图中的块。ASAR 文件是一个单一的文件,因此一旦 7zip 压缩,源中的任何更改都会修改 ASAR 文件的大部分块。

此外,这似乎意味着 Electron 包中更精细的文件结构会导致差异自动更新程序的增量更小。


推荐阅读