webpack - 电子差分更新器即使做了最小的更改也会产生大量更改的块。难道我做错了什么?
问题描述
我正在开发一个基于 Electron 的项目。我们已经通过 electron-builder(使用 nsis-web 和一个单独的 mac 差异更新器分支)设置了差异更新,并期望它能够产生小的更新下载。
我们现在意识到,我们的应用程序的差异更新(打包/压缩时,应用程序总共约为 100mb)往往徘徊在 ~20-40mb 的下载量左右,大约有 ~1000 个更改块,即使在我们的情况下'在我们的源代码中只更改了字符串中的 1 个字符。随着我们用户群的增长,并且我们预见到需要快速部署更新,这可能会很快增加我们的服务器费用。我们期待一个相当低的增量下载,希望 <=1mb 用于微小的变化,例如单个字符,而不是接近整个应用程序大小的一半。
我们基于Electron React Boilerplate构建了我们的应用程序,它使用 webpack 来打包源代码。
我们目前正在混淆我们的 webpack 包,尽管这种行为也被跟踪到在添加混淆之前发生,因此将其排除为原因。
我不清楚块/文件增量的 7z 方法是否意味着文件中的单个更改可能会影响其所有块,如果是这样,分解它意味着未受影响文件的块本身将不受影响. (我还在努力
我们目前有许多模块被导入到我们的项目中以用于各种用途,这些模块正在打包到最终的 webpack 包中。我正在讨论是否尝试将模块保留在 webpack 包之外,但Electron 的性能页面似乎主张将所有代码捆绑在一起以避免调用昂贵的require()
调用。我仍在尝试思考并尝试实验来理解行为。
有没有办法获得更小的差异下载,或者这是实际预期的增量大小?
如果是前者,是否有一些可能的原因导致我们做错了?
是否对差异更新程序有特别的了解,可以更好地理解如何处理它?
编辑:尝试了一个测试,我只更改了应用程序版本,差异更新程序仍然将其注销:
[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%)
解决方案
编辑:此解决方案不能完全解决 Mac 的问题。似乎本地组件正在被修改,即使只有 mac 包的版本更改,导致它们生成大量更改的块。
原答案如下:
简而言之:为包禁用 Asar。
我已经确定了一些问题,其中主要是 electron-builder 中的差异更新程序使用 7zip 来制作差异文件,根据我的理解,7zip 会生成文件结构的内部表示。
考虑到这一点,事实证明禁用 Electron 中标准和推荐的 ASAR 文件意味着所有源文件不再在其中组合,从而允许 7zip 单独跟踪它们。这意味着任何更改的文件似乎只会影响块图中的块。ASAR 文件是一个单一的文件,因此一旦 7zip 压缩,源中的任何更改都会修改 ASAR 文件的大部分块。
此外,这似乎意味着 Electron 包中更精细的文件结构会导致差异自动更新程序的增量更小。
推荐阅读
- javascript - TamperMonkey:在没有 ID 的内容之后添加元素
- java - 我们可以在java中创建没有线程的死锁吗?
- javascript - Javascript继承链中的'this'关键字
- sql - 如何在 Oracle 表上使用滑动窗口?
- javascript - 设置 React useReducer 的最佳方法
- python - 选择两个数据框列之一作为新列的输入
- android - 如何在 Android Studio 中获取 Google Pixel 3 模拟器?
- javascript - 使用 javasrcript 中的时间对象更新日期对象中的日期
- java - Class.forName() 如何在 java 中工作
- ruby-on-rails - 如何在另一个控制器的方法中调用一个控制器的方法