ASAR アーカイブ
After creating an application distribution, the app's source code are usually bundled into an ASAR archive, which is a simple extensive archive format designed for Electron apps. By bundling the app we can mitigate issues around long path names on Windows, speed up require
and conceal your source code from cursory inspection.
バンドルされているアプリは仮想ファイルシステム上で動作し、ほとんどの API は通常通り動作しますが、いくつかの注意点があるほか、明示的に ASAR アーカイブを操作したいケースもあるでしょう。
ASAR アーカイブを使用する
Electron には、2 組の API があります。Node.js により提供される Node API、そして Chromium により提供されるウェブ API です。 どちらの API も ASAR アーカイブからのファイル読み込みに対応しています。
Node API
Electron では Node.js に特別なパッチを当てており、fs.readFile
や require
のような Node API は ASAR アーカイブを仮想ディレクトリのように扱い、そのファイルをファイルシステム上の通常のファイルのように扱います。
例えば、/path/to
配下に、example.asar
アーカイブがあると仮定します:
$ asar list /path/to/example.asar
/app.js
/file.txt
/dir/module.js
/static/index.html
/static/main.css
/static/jquery.min.js
以下で ASAR アーカイブ内のファイルを読み込みます。
const fs = require('node:fs')
fs.readFileSync('/path/to/example.asar/file.txt')
アーカイブのルート配下にあるすべてのファイルの一覧を取得する:
const fs = require('node:fs')
fs.readdirSync('/path/to/example.asar')
アーカイブからモジュールを使用する:
require('./path/to/example.asar/dir/module.js')
以下のように BrowserWindow
で ASAR アーカイブ内のウェブページを表示できます。
const { BrowserWindow } = require('electron')
const win = new BrowserWindow()
win.loadURL('file:///path/to/example.asar/static/index.html')
Web API
ウェブページで、アーカイブ内のファイルを file:
プロトコルでリクエストできます。 Node API と同様に、ASAR アーカイブはディレクトリのように扱われます。
例えば、$.get
でファイルを取得するには:
<script>
let $ = require('./jquery.min.js')
$.get('file:///path/to/example.asar/file.txt', (data) => {
console.log(data)
})
</script>
ASAR アーカイブを通常のファイルのように扱う
ASAR アーカイブそのもののチェックサムを検証する等のいくつかのケースでは、ASAR アーカイブをファイルとして読み込む必要があります。 この目的のために、 asar
サポートしないオリジナルの fs
API を提供するビルトインの original-fs
モジュールを使用できます。
const originalFs = require('original-fs')
originalFs.readFileSync('/path/to/example.asar')
もしくは、process.noAssar
に true
をセットして fs
モジュールの asar
サポートを無効にすることができます:
const fs = require('node:fs')
process.noAsar = true
fs.readFileSync('/path/to/example.asar')
Node API の制限
Node API では ASAR アーカイブがディレクトリのように動作するよう可能な限り懸命に工夫していますが、低レベル環境での Node API に起因した制限がいくつかあります。