Tool to load a snapshot for Electron applications that was created by @tooling/v8-snapshot
.
Table of Contents
@packages/v8-snapshot-require
provides modules snapshotted by @tooling/v8-snapshot
to @packages/packherd-require
and helps in locating modules to load from the snapshot by deriving their keys from information about each
module provided by packherd.
In order to facilitate loading from the snapshot, @packages/v8-snapshot-require
ties into the
@packages/packherd-require
resolution mechanism in order to help it obtain the key to locate
a fully initialized module exports or its definition from the snapshotted Object that
@packages/v8-snapshot-require
also provides during @packages/packherd-require
initialization
inside the snapshot-require setup.
It uses the resolver-map in order to resolve modules without querying the file system.
Once v8-snapshot provides this key to packherd it then tries to first load a fully initialized version of the module, aka exports, falling back to a function which will initialize it, aka definitions and only finally loads it from the file system via Node.js.
Most of that logic lives inside @packages/packherd-require
and it is recommended to read its
documentation.
The resolver map is constructed from metadata that as esbuild-snap produces as a side effect of bundling the application's dependencies and optionally the app's modules.
The keys of this map are the directory relative to the project base dir, from which a module
was resolved, concatenated with the import request string (separated by '***'
) and the value
the fully resolved path relative to the project base dir.
This map is embedded into the snapshot and used fast module key resolution and used to resolve a module's key via the getModuleKey function.
In order to learn how to orchestrate snapshot creation and loading please have a look at the examples provided with this app, for instance:
In order to gain insight into how the modules are loaded please set the
DEBUG=(cypress:pack|cypress:snap)*
which will cause the tool to emit a wealth of
information part of which will provide insight into how many modules were initialized
from the snapshot and which weren't.
cypress:packherd:debug { exportHits: 20, definitionHits: 8, misses: 3 }
It will also provide information about what it encountered inside the snapshot, namely the number of:
exports
modules that are fully initialized inside the snapshotdefinitions
functions that will returnmodule.exports
when invoked
NOTE: that definitions
and exports
overlap as a module's definition is always included even
if its export is included as well.
Thus the below means that we have 12
modules that are included fully initialized and 6 (18 - 12)
that aren't.
exports: 12
definitions: 18