Ir para o conteúdo principal

ASAR 'Archives'

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.

The bundled app runs in a virtual file system and most APIs would just work normally, but for some cases you might want to work on ASAR archives explicitly due to a few caveats.

Using ASAR Archives

In Electron there are two sets of APIs: Node APIs provided by Node.js and Web APIs provided by Chromium. Both APIs support reading files from ASAR archives.

API Node

With special patches in Electron, Node APIs like fs.readFile and require treat ASAR archives as virtual directories, and the files in it as normal files in the filesystem.

Por exemplo, supondo que nós temos um pacote exemple.asar em /path/to:

$ asar list /path/to/example.asar

Read a file in the ASAR archive:

const fs = require('node:fs')

Para listar todos os arquivos dentro da raiz do pacote:

const fs = require('node:fs')

Para usar um módulo existente no pacote:


You can also display a web page in an ASAR archive with BrowserWindow:

const { BrowserWindow } = require('electron')
const win = new BrowserWindow()



In a web page, files in an archive can be requested with the file: protocol. Like the Node API, ASAR archives are treated as directories.

Por exemplo, para obter um arquivo com $.get:

let $ = require('./jquery.min.js')
$.get('file:///path/to/example.asar/file.txt', (data) => {

Treating an ASAR archive as a Normal File

For some cases like verifying the ASAR archive's checksum, we need to read the content of an ASAR archive as a file. Para isso, você pode usar o módulo built-in original-fs que fornece a API fs original sem dependência do asar:

const originalFs = require('original-fs')

Ou você pode setar o process.noAsar para true para desativar a dependência para o asar no módulo fs:

const fs = require('node:fs')
process.noAsar = true

Limitações da API Node

Even though we tried hard to make ASAR archives in the Node API work like directories as much as possible, there are still limitations due to the low-level nature of the Node API.

Pacotes são Somente Leitura

The archives can not be modified so all Node APIs that can modify files will not work with ASAR archives.

Diretórios de trabalho não pode ser setado como diretórios no pacote

Though ASAR archives are treated as directories, there are no actual directories in the filesystem, so you can never set the working directory to directories in ASAR archives. Ao informar a opção cwd algumas APIs podem apresentar erros.

Desempacotando em Algumas APIs

Most fs APIs can read a file or get a file's information from ASAR archives without unpacking, but for some APIs that rely on passing the real file path to underlying system calls, Electron will extract the needed file into a temporary file and pass the path of the temporary file to the APIs to make them work. A seguir algumas informações sobre essas APIs.

As APIs que necessitam descompactar alguns arquivos extras são:

  • child_process.execFile
  • child_process.execFileSync
  • fs.openSync
  • process.dlopen - Utilizado com require em módulos nativos

Informação estática falsa em fs.stat

The Stats object returned by fs.stat and its friends on files in asar archives is generated by guessing, because those files do not exist on the filesystem. So you should not trust the Stats object except for getting file size and checking file type.

Executing Binaries Inside ASAR archive

There are Node APIs that can execute binaries like child_process.exec, child_process.spawn and child_process.execFile, but only execFile is supported to execute binaries inside ASAR archive.

This is because exec and spawn accept command instead of file as input, and commands are executed under shell. There is no reliable way to determine whether a command uses a file in asar archive, and even if we do, we can not be sure whether we can replace the path in command without side effects.

Adding Unpacked Files to ASAR archives

As stated above, some Node APIs will unpack the file to the filesystem when called. Apart from the performance issues, various anti-virus scanners might be triggered by this behavior.

As a workaround, you can leave various files unpacked using the --unpack option. In the following example, shared libraries of native Node.js modules will not be packed:

$ asar pack app app.asar --unpack *.node

After running the command, you will notice that a folder named app.asar.unpacked was created together with the app.asar file. It contains the unpacked files and should be shipped together with the app.asar archive.