深入浅出Electron:原理、工程与实践
上QQ阅读APP看书,第一时间看更新

3.6 生成asar

electron-builder默认会把开发者编写的HTML、CSS和JavaScript代码以及相关的资源链接成一个asar文件。asar是一种特殊的存档格式,它可以把大批的文件以无损、无压缩的方式链接在一起,并提供随机访问支持,关于asar文件的原理前面已经介绍过了。

为了生成asar文件,electron-builder几乎复制了整个asar项目的代码到自己的项目中。我认为这种手段是不可取的,一旦asar项目有重要更新的话,electron-builder的作者也不得不跟着修改自己项目的代码才行,好在Electron团队为了向前兼容,几乎不会更改asar模块的实现逻辑。

我更推荐直接使用asar工具来生成asar文件,下面几行简单的代码就可以把一个文件夹下的所有内容打包成asar文件:

let fs = require('fs-extra')
let asar = require('asar')
await asar.createPackage(
  bundledDir,
  path.join(process.cwd(), 'release/win-ia32-unpacked/resources/app.asar')
)

asar.createPackage方法的第一个参数是待处理的目录路径,第二个参数是生成的asar文件的路径,处理完成后,第二个参数所指向的路径就是你生成的asar文件。

在实现应用程序自动更新的需求时,开发者往往会考虑如下场景:假设只修改自己的业务代码,而没有升级Electron的版本,那么是否可以只更新客户端电脑上的这个asar文件呢?答案是可以的,但需要借助一些工具,以避免升级过程中文件写入失败等异常情况。