ASAR Archives | Electron
https://www.electronjs.org/docs/latest/tutorial/asar-archives • 51 KB fetched Open original page
ASAR Archives | Electron
Skip to main content
Electron Docs API Blog Tools
* Electron Forge
* Electron Fiddle
Community
* Governance
* Showcase
* Resources
Releases English
* English
* Deutsch
* Español
* Français
* 日本語
* Português
* Русский
* 中文
Search
* Get Started
* Processes in Electron
* Best Practices
* Examples
* Development
* Accessibility
* Advanced Installation Instructions
* ASAR Archives
* ASAR Integrity
* Boilerplates and CLIs
* ES Modules (ESM) in Electron
* Electron Fuses
* Window State Persistence
* Windows on ARM
* Native Node Modules
* Distribution
* Testing And Debugging
* References
* Contributing
*
* Development
* ASAR Archives On this page
ASAR Archives
After creating an application distribution , the
app's source code is 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.
Node API
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.
For example, suppose we have an example.asar archive under /path/to :
$ asar list /path/to/example.asar
/app.js
/file.txt
/dir/module.js
/static/index.html
/static/main.css
/static/jquery.min.js
Read a file in the ASAR archive:
const fs = require ( 'node:fs' )
fs . readFileSync ( '/path/to/example.asar/file.txt' )
List all files under the root of the archive:
const fs = require ( 'node:fs' )
fs . readdirSync ( '/path/to/example.asar' )
Use a module from the archive:
require ( './path/to/example.asar/dir/module.js' )
You can also display a web page in an ASAR archive with BrowserWindow :
const { BrowserWindow } = require ( 'electron' )
const win = new BrowserWindow ( )
win . loadURL ( 'file:///path/to/example.asar/static/index.html' )
Web API
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.
For example, to get a file with $.get :
< script >
let $ = require ( './jquery.min.js' )
$ . get ( 'file:///path/to/example.asar/file.txt' , ( data ) => {
console . log ( data )
} )
</ script >
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. For this purpose you can use the built-in
original-fs module which provides original fs APIs without asar support:
const originalFs = require ( 'original-fs' )
originalFs . readFileSync ( '/path/to/example.asar' )
You can also set process.noAsar to true to disable the support for asar in
the fs module:
const fs = require ( 'node:fs' )
process . noAsar = true
fs . readFileSync ( '/path/to/example.asar' )
Limitations of the Node API
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.
Archives Are Read-only
The archives can not be modified so all Node APIs that can modify files will not
work with ASAR archives.
Working Directory Can Not Be Set to Directories in Archive
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. Passing them as the cwd option of some APIs
will also cause errors.
Extra Unpacking on Some 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. This adds a little overhead for those APIs.
APIs that require extra unpacking are:
* child_process.execFile
* child_process.execFileSync
* fs.open
* fs.openSync
* process.dlopen - Used by require on native modules
Fake Stat Information of 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 command s 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.
Edit this page
Previous
Advanced Installation Instructions
Next
ASAR Integrity
* Using ASAR Archives
* Node API
* Web API
* Treating an ASAR archive as a Normal File
* Limitations of the Node API
* Archives Are Read-only
* Working Directory Can Not Be Set to Directories in Archive
* Extra Unpacking on Some APIs
* Fake Stat Information of fs.stat
* Executing Binaries Inside ASAR archive
* Adding Unpacked Files to ASAR archives
Docs
* Getting Started
* API Reference
Checklists
* Performance
* Security
Tools
* Electron Forge
* Electron Fiddle
Community
* Governance
* Resources
* Bluesky
* X
* Mastodon
* Stack Overflow
More
* GitHub
* Open Collective
* Infrastructure Dashboard
Copyright OpenJS Foundation and Electron contributors. All rights reserved. The OpenJS Foundation has registered trademarks and uses trademarks. For a list of trademarks of the OpenJS Foundation , please see our Trademark Policy and Trademark List . Trademarks and logos not indicated on the list of OpenJS Foundation trademarks are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them. The OpenJS Foundation | Terms of Use | Privacy Policy | Bylaws | Code of Conduct | Trademark Policy | Trademark List | Cookie Policy
Hosting and infrastructure graciously provided by
Links found on this page
- Skip to main content [direct]
- Electron [direct]
- Docs [direct]
- API [direct]
- Blog [direct]
- Electron Forge [direct]
- Electron Fiddle [direct]
- Governance [direct]
- Showcase [direct]
- Resources [direct]
- Releases [direct]
- Deutsch [direct]
- Español [direct]
- Français [direct]
- 日本語 [direct]
- Português [direct]
- Русский [direct]
- 中文 [direct]
- Processes in Electron [direct]
- Best Practices [direct]
- Examples [direct]
- Development [direct]
- Advanced Installation Instructions [direct]
- ASAR Integrity [direct]
- Boilerplates and CLIs [direct]
- ES Modules (ESM) in Electron [direct]
- Electron Fuses [direct]
- Window State Persistence [direct]
- Windows on ARM [direct]
- Native Node Modules [direct]
- Distribution [direct]
- Testing And Debugging [direct]
- References [direct]
- Contributing [direct]
- application distribution [direct]
- ASAR archive [direct]
- Edit this page [direct]
- Security [direct]
- Bluesky [direct]
- X [direct]
- Mastodon [direct]
- Stack Overflow [direct]
- GitHub [direct]
- Open Collective [direct]
- Infrastructure Dashboard [direct]
- OpenJS Foundation [direct]
- Trademark Policy [direct]
- Trademark List [direct]
- Terms of Use [direct]
- Privacy Policy [direct]
- Bylaws [direct]
- Code of Conduct [direct]
- Cookie Policy [direct]
|
|